|
| 1 | +package main |
| 2 | + |
| 3 | +import ( |
| 4 | + "crypto" |
| 5 | + "crypto/rand" |
| 6 | + "crypto/rsa" |
| 7 | + "crypto/sha256" |
| 8 | + "encoding/base64" |
| 9 | + "flag" |
| 10 | + "fmt" |
| 11 | + "io" |
| 12 | + "log" |
| 13 | + "net" |
| 14 | + "os" |
| 15 | + "slices" |
| 16 | + |
| 17 | + "github.com/google/go-tpm-tools/simulator" |
| 18 | + "github.com/google/go-tpm/tpm2" |
| 19 | + "github.com/google/go-tpm/tpm2/transport" |
| 20 | + "github.com/google/go-tpm/tpmutil" |
| 21 | + |
| 22 | + saltpm "github.com/salrashid123/signer/tpm" |
| 23 | +) |
| 24 | + |
| 25 | +const ( |
| 26 | + emptyPassword = "" |
| 27 | + defaultPassword = "" |
| 28 | +) |
| 29 | + |
| 30 | +/* |
| 31 | +
|
| 32 | +## RSA - password |
| 33 | + tpm2_createprimary -C o -G rsa2048:aes128cfb -g sha256 -c primary.ctx -a 'restricted|decrypt|fixedtpm|fixedparent|sensitivedataorigin|userwithauth|noda' |
| 34 | + tpm2_create -G rsa2048:rsassa:null -p testpwd -g sha256 -u key.pub -r key.priv -C primary.ctx |
| 35 | + tpm2_flushcontext -t |
| 36 | + tpm2_getcap handles-transient |
| 37 | + tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx |
| 38 | + tpm2_evictcontrol -C o -c key.ctx 0x81008006 |
| 39 | + tpm2_flushcontext -t |
| 40 | +
|
| 41 | +go run sign_verify_tpm/policy_password/main.go --handle=0x81008006 |
| 42 | +*/ |
| 43 | + |
| 44 | +var ( |
| 45 | + tpmPath = flag.String("tpm-path", "/dev/tpmrm0", "Path to the TPM device (character device or a Unix socket).") |
| 46 | + handle = flag.Uint("handle", 0x81008006, "rsa Handle value") |
| 47 | + keyPass = flag.String("keyPass", "testpwd", "KeyPassword") |
| 48 | +) |
| 49 | + |
| 50 | +var TPMDEVICES = []string{"/dev/tpm0", "/dev/tpmrm0"} |
| 51 | + |
| 52 | +func OpenTPM(path string) (io.ReadWriteCloser, error) { |
| 53 | + if slices.Contains(TPMDEVICES, path) { |
| 54 | + return tpmutil.OpenTPM(path) |
| 55 | + } else if path == "simulator" { |
| 56 | + return simulator.GetWithFixedSeedInsecure(1073741825) |
| 57 | + } else { |
| 58 | + return net.Dial("tcp", path) |
| 59 | + } |
| 60 | +} |
| 61 | + |
| 62 | +func main() { |
| 63 | + |
| 64 | + flag.Parse() |
| 65 | + |
| 66 | + rwc, err := OpenTPM(*tpmPath) |
| 67 | + if err != nil { |
| 68 | + log.Fatalf("can't open TPM %q: %v", *tpmPath, err) |
| 69 | + } |
| 70 | + defer func() { |
| 71 | + if err := rwc.Close(); err != nil { |
| 72 | + log.Fatalf("can't close TPM %q: %v", *tpmPath, err) |
| 73 | + } |
| 74 | + }() |
| 75 | + |
| 76 | + rwr := transport.FromReadWriter(rwc) |
| 77 | + |
| 78 | + pub, err := tpm2.ReadPublic{ |
| 79 | + ObjectHandle: tpm2.TPMHandle(*handle), |
| 80 | + }.Execute(rwr) |
| 81 | + if err != nil { |
| 82 | + log.Fatalf("error executing tpm2.ReadPublic %v", err) |
| 83 | + } |
| 84 | + |
| 85 | + stringToSign := "foo" |
| 86 | + fmt.Printf("Data to sign %s\n", stringToSign) |
| 87 | + |
| 88 | + b := []byte(stringToSign) |
| 89 | + |
| 90 | + h := sha256.New() |
| 91 | + h.Write(b) |
| 92 | + digest := h.Sum(nil) |
| 93 | + |
| 94 | + se, err := saltpm.NewPasswordSession(rwr, []byte(*keyPass)) |
| 95 | + if err != nil { |
| 96 | + fmt.Println(err) |
| 97 | + os.Exit(1) |
| 98 | + } |
| 99 | + |
| 100 | + rr, err := saltpm.NewTPMCrypto(&saltpm.TPM{ |
| 101 | + TpmDevice: rwc, |
| 102 | + NamedHandle: &tpm2.NamedHandle{ |
| 103 | + Handle: tpm2.TPMHandle(*handle), |
| 104 | + Name: pub.Name, |
| 105 | + }, |
| 106 | + AuthSession: se, |
| 107 | + }) |
| 108 | + |
| 109 | + if err != nil { |
| 110 | + fmt.Println(err) |
| 111 | + os.Exit(1) |
| 112 | + } |
| 113 | + |
| 114 | + rs, err := rr.Sign(rand.Reader, digest, crypto.SHA256) |
| 115 | + if err != nil { |
| 116 | + log.Println(err) |
| 117 | + os.Exit(1) |
| 118 | + } |
| 119 | + fmt.Printf("RSA Signed String: %s\n", base64.StdEncoding.EncodeToString(rs)) |
| 120 | + |
| 121 | + rrsaPubKey, ok := rr.Public().(*rsa.PublicKey) |
| 122 | + if !ok { |
| 123 | + fmt.Println(err) |
| 124 | + os.Exit(1) |
| 125 | + } |
| 126 | + |
| 127 | + err = rsa.VerifyPKCS1v15(rrsaPubKey, crypto.SHA256, digest, rs) |
| 128 | + if err != nil { |
| 129 | + fmt.Println(err) |
| 130 | + os.Exit(1) |
| 131 | + } |
| 132 | + fmt.Printf("RSA Signed String verified\n") |
| 133 | + |
| 134 | +} |
0 commit comments