start TPM support

This commit is contained in:
pascal
2026-09-16 23:00:44 +02:00
parent d89e9c86eb
commit 24f5f2a7ec
22 changed files with 1836 additions and 145 deletions
@@ -2,6 +2,9 @@ package certposture
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto/x509"
"testing"
"time"
@@ -138,6 +141,22 @@ func TestChainPEM_RoundTrip(t *testing.T) {
assert.Equal(t, ca.Cert.Raw, chain[1].Raw)
}
func TestVerify_AcceptsMaximumPSSSalt(t *testing.T) {
// A TPM chooses the PSS salt itself and older firmware uses the largest salt that
// fits, so a proof from such a key carries more salt than Sign asks a software key for.
ca := certtest.NewCA(t, "root")
key := certtest.RSAKey(t).(*rsa.PrivateKey)
leaf := ca.Issue(t, key, "device")
c := NewChallenger(secret)
nonce := c.Nonce(peerKey, now)
digest := sha256.Sum256(proofMessage(nonce, peerKey))
sig, err := rsa.SignPSS(rand.Reader, key, crypto.SHA256, digest[:], &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthAuto})
require.NoError(t, err)
_, err = c.Verify(Proof{Nonce: nonce, Chain: [][]byte{leaf.Raw}, SigAlg: SigAlgRSAPSSSHA256, Signature: sig}, peerKey, now)
assert.NoError(t, err, "a valid PSS signature must verify regardless of salt length")
}
func signedProof(t *testing.T, c *Challenger, ca *certtest.CA, key crypto.Signer) Proof {
t.Helper()
leaf := ca.Issue(t, key, "device")
+1 -1
View File
@@ -131,7 +131,7 @@ func verifySignature(pub crypto.PublicKey, sigAlg string, msg, sig []byte) bool
return ecdsa.VerifyASN1(pub.(*ecdsa.PublicKey), d[:], sig)
case SigAlgRSAPSSSHA256:
d := sha256.Sum256(msg)
return rsa.VerifyPSS(pub.(*rsa.PublicKey), crypto.SHA256, d[:], sig, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthEqualsHash}) == nil
return rsa.VerifyPSS(pub.(*rsa.PublicKey), crypto.SHA256, d[:], sig, &rsa.PSSOptions{SaltLength: rsa.PSSSaltLengthAuto}) == nil
case SigAlgEd25519:
return ed25519.Verify(pub.(ed25519.PublicKey), msg, sig)
}