{"id":17330270,"url":"https://github.com/foxboron/go-tpm-keyfiles","last_synced_at":"2025-10-08T03:53:32.771Z","repository":{"id":222387248,"uuid":"756506269","full_name":"Foxboron/go-tpm-keyfiles","owner":"Foxboron","description":"TPM 2.0 TSS keyfile library","archived":false,"fork":false,"pushed_at":"2025-09-03T18:48:22.000Z","size":112,"stargazers_count":19,"open_issues_count":5,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-03T20:42:28.499Z","etag":null,"topics":["confidential-computing","go-tpm","tpm","tpm2","tss"],"latest_commit_sha":null,"homepage":"https://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Foxboron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-02-12T19:39:37.000Z","updated_at":"2025-09-03T18:48:26.000Z","dependencies_parsed_at":"2025-04-14T17:41:17.987Z","dependency_job_id":"c6fb540b-2c0b-43e5-9549-54e525950528","html_url":"https://github.com/Foxboron/go-tpm-keyfiles","commit_stats":{"total_commits":57,"total_committers":2,"mean_commits":28.5,"dds":0.01754385964912286,"last_synced_commit":"0b4ba742d75436c4239e608a2f099946b9e174a2"},"previous_names":["foxboron/go-tpm-keyfiles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Foxboron/go-tpm-keyfiles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foxboron%2Fgo-tpm-keyfiles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foxboron%2Fgo-tpm-keyfiles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foxboron%2Fgo-tpm-keyfiles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foxboron%2Fgo-tpm-keyfiles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Foxboron","download_url":"https://codeload.github.com/Foxboron/go-tpm-keyfiles/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Foxboron%2Fgo-tpm-keyfiles/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278886413,"owners_count":26062975,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["confidential-computing","go-tpm","tpm","tpm2","tss"],"created_at":"2024-10-15T14:50:50.208Z","updated_at":"2025-10-08T03:53:32.766Z","avatar_url":"https://github.com/Foxboron.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"go-tpm-keyfile\n==============\n\nImplements the ASN.1 Specification for TPM 2.0 Key Files.\n\nhttps://www.hansenpartnership.com/draft-bottomley-tpm2-keys.html\n\n\n# Loadable Keys\n\n## With NewLoadableKey\n\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\tkeyfile \"github.com/foxboron/go-tpm-keyfiles\"\n\n\t\"github.com/google/go-tpm/tpm2\"\n\t\"github.com/google/go-tpm/tpm2/transport/simulator\"\n)\n\nfunc main() {\n\ttpm, _ := simulator.OpenSimulator()\n\tdefer tpm.Close()\n\tk, _ := keyfile.NewLoadableKey(tpm, tpm2.TPMAlgECC, 256, []byte{},\n\t\tkeyfile.WithDescription(\"TPM Key\"),\n\t)\n\tos.Writefile(\"key.pem\", k.Bytes(), 0640)\n}\n```\n\n## With NewTPMKey\n\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\tkeyfile \"github.com/foxboron/go-tpm-keyfiles\"\n\n\t\"github.com/google/go-tpm/tpm2\"\n\t\"github.com/google/go-tpm/tpm2/transport/simulator\"\n)\n\nfunc main(){\n\ttpm, _ := simulator.OpenSimulator()\n\tdefer tpm.Close()\n\n\tprimary, _ := tpm2.CreatePrimary{\n\t\tPrimaryHandle: tpm2.TPMRHOwner,\n\t\tInPublic:      tpm2.New2B(tpm2.ECCSRKTemplate),\n\t}.Execute(tpm)\n\n\teccTemplate := tpm2.TPMTPublic{\n\t\tType:    tpm2.TPMAlgECC,\n\t\tNameAlg: sha,\n\t\tObjectAttributes: tpm2.TPMAObject{\n\t\t\tSignEncrypt:         true,\n\t\t\tFixedTPM:            true,\n\t\t\tFixedParent:         true,\n\t\t\tSensitiveDataOrigin: true,\n\t\t\tUserWithAuth:        true,\n\t\t},\n\t\tParameters: tpm2.NewTPMUPublicParms(\n\t\t\ttpm2.TPMAlgECC,\n\t\t\t\u0026tpm2.TPMSECCParms{\n\t\t\t\tCurveID: ecc,\n\t\t\t\tScheme: tpm2.TPMTECCScheme{\n\t\t\t\t\tScheme: tpm2.TPMAlgNull,\n\t\t\t\t},\n\t\t\t},\n\t\t),\n\t}\n\n\teccKeyResponse, := tpm2.CreateLoaded{\n\t\tParentHandle: tpm2.AuthHandle{\n\t\t\tHandle: primary.ObjectHandle,\n\t\t\tName:   primary.Name,\n\t\t\tAuth:   tpm2.PasswordAuth([]byte(nil)),\n\t\t},\n\t\tInPublic: tpm2.New2BTemplate(\u0026eccTemplate),\n\t}.Execute(tpm)\n\n\tk := keyfile.NewTPMKey(\n\t\tkeyfile.OIDLoadableKey\n\t\teccKeyResponse.OutPublic,\n\t\teccKeyResponse.OutPrivate,\n\t\tkeyfile.WithDescription(\"This is a TPM Key\"),\n\t)\n\n\tos.Writefile(\"key.pem\", k.Bytes(), 0640)\n}\n```\n\n# Importable Key\n\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\tkeyfile \"github.com/foxboron/go-tpm-keyfiles\"\n\n\t\"github.com/google/go-tpm/tpm2\"\n\t\"github.com/google/go-tpm/tpm2/transport/simulator\"\n)\n\nvar ECCSRK_H2_Template = tpm2.TPMTPublic{\n\t\tType:    tpm2.TPMAlgECC,\n\t\tNameAlg: tpm2.TPMAlgSHA256,\n\t\tObjectAttributes: tpm2.TPMAObject{\n\t\t\tFixedTPM:            true,\n\t\t\tFixedParent:         true,\n\t\t\tSensitiveDataOrigin: true,\n\t\t\tUserWithAuth:        true,\n\t\t\tNoDA:                true,\n\t\t\tRestricted:          true,\n\t\t\tDecrypt:             true,\n\t\t},\n\t\tParameters: tpm2.NewTPMUPublicParms(\n\t\t\ttpm2.TPMAlgECC,\n\t\t\t\u0026tpm2.TPMSECCParms{\n\t\t\t\tSymmetric: tpm2.TPMTSymDefObject{\n\t\t\t\t\tAlgorithm: tpm2.TPMAlgAES,\n\t\t\t\t\tKeyBits: tpm2.NewTPMUSymKeyBits(\n\t\t\t\t\t\ttpm2.TPMAlgAES,\n\t\t\t\t\t\ttpm2.TPMKeyBits(128),\n\t\t\t\t\t),\n\t\t\t\t\tMode: tpm2.NewTPMUSymMode(\n\t\t\t\t\t\ttpm2.TPMAlgAES,\n\t\t\t\t\t\ttpm2.TPMAlgCFB,\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\tCurveID: tpm2.TPMECCNistP256,\n\t\t\t},\n\t\t),\n\t\tUnique: tpm2.NewTPMUPublicID(\n\t\t\ttpm2.TPMAlgECC,\n\t\t\t\u0026tpm2.TPMSECCPoint{\n\t\t\t\tX: tpm2.TPM2BECCParameter{\n\t\t\t\t\tBuffer: make([]byte, 0),\n\t\t\t\t},\n\t\t\t\tY: tpm2.TPM2BECCParameter{\n\t\t\t\t\tBuffer: make([]byte, 0),\n\t\t\t\t},\n\t\t\t},\n\t\t),\n\t}\n)\n\nfunc main() {\n\ttpm, _ := simulator.OpenSimulator()\n\tdefer tpm.Close()\n\n\tpk, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)\n\n\tsrk := tpm2.CreatePrimary{\n\t\tPrimaryHandle: tpm2.AuthHandle{\n\t\t\tHandle: hier,\n\t\t\tAuth:   tpm2.PasswordAuth(ownerAuth),\n\t\t},\n\t\tInSensitive: tpm2.TPM2BSensitiveCreate{\n\t\t\tSensitive: \u0026tpm2.TPMSSensitiveCreate{\n\t\t\t\tUserAuth: tpm2.TPM2BAuth{\n\t\t\t\t\tBuffer: []byte(nil),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tInPublic: tpm2.New2B(ECCSRK_H2_Template),\n\t}\n\n\tvar rsp *tpm2.CreatePrimaryResponse\n\trsp, _ := srk.Execute(tpm)\n\tsrkPublic, _ := rsp.OutPublic.Contents()\n\n\tkey, _ := keyfile.NewImportablekey(srkpub, ecc)\n\n\tos.Writefile(\"key.pem\", k.Bytes(), 0640)\n\n\t// To import the key\n\tk, _ := keyfile.ImportTPMKey(tpm, key, []byte(nil))\n}\n```\n\n# Sealed Data\n\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\tkeyfile \"github.com/foxboron/go-tpm-keyfiles\"\n\n\t\"github.com/google/go-tpm/tpm2\"\n\t\"github.com/google/go-tpm/tpm2/transport/simulator\"\n)\n\nfunc main() {\n\ttpm, _ := simulator.OpenSimulator()\n\tdefer tpm.Close()\n\n\tmsg := []byte(\"message\")\n\n\tk, _ := keyfile.NewSealedData(tpm, msg, []byte(nil))\n\n\tdata, _ := keyfile.UnsealData(tpm, k, []byte(nil))\n\n\tif bytes.Equal(data, msg) {\n\t\tfmt.Println(\"same message\")\n\t}\n}\n```\n\n# TPMSigner\n\n`go-tpm-keyfile` implements a `crypto.Signer` interface to be used with the keys\nfor easy signature creation and verification.\n\nThe `TPMKeySigner` struct implements a callback-style approach for user auth,\nowner auth and for TPM fetching for easier implementation towards things that\nrequire user-input.\n\n```go\npackage main\n\nimport (\n\t\"crypto\"\n\t\"os\"\n\n\tkeyfile \"github.com/foxboron/go-tpm-keyfiles\"\n\n\t\"github.com/google/go-tpm/tpm2\"\n\t\"github.com/google/go-tpm/tpm2/transport/simulator\"\n)\n\nfunc main() {\n\ttpm, _ := simulator.OpenSimulator()\n\tdefer tpm.Close()\n\n\tk, _ := NewLoadableKey(tpm, tpm2.TPMAlgECC, 256, []byte(\"\"))\n\n\tsigner, _ := k.Signer(tpm, []byte(\"\"), []byte(\"\"))\n\n\th := crypto.SHA256.New()\n\th.Write([]byte(\"message\"))\n\tb := h.Sum(nil)\n\n\tsig, _ := signer.Sign((io.Reader)(nil), b[:], crypto.SHA256)\n\n\tok, err := k.Verify(crypto.SHA256, b[:], sig)\n\tif !ok || err != nil {\n\t\tlog.Fatalf(\"invalid signature\")\n\t}\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoxboron%2Fgo-tpm-keyfiles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffoxboron%2Fgo-tpm-keyfiles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffoxboron%2Fgo-tpm-keyfiles/lists"}