diff --git a/internal/x509util/rsapss_go18.go b/internal/x509util/rsapss_go18.go index 21aa9cb..be2af7a 100644 --- a/internal/x509util/rsapss_go18.go +++ b/internal/x509util/rsapss_go18.go @@ -9,27 +9,28 @@ import ( ) var signatureAlgorithmDetails = []struct { - algo x509.SignatureAlgorithm - oid asn1.ObjectIdentifier - pubKeyAlgo x509.PublicKeyAlgorithm - hash crypto.Hash + algo x509.SignatureAlgorithm + oidDigest asn1.ObjectIdentifier + oidSignature asn1.ObjectIdentifier + pubKeyAlgo x509.PublicKeyAlgorithm + hash crypto.Hash }{ - {x509.MD2WithRSA, oidSignatureMD2WithRSA, x509.RSA, crypto.Hash(0) /* no value for MD2 */}, - {x509.MD5WithRSA, oidSignatureMD5WithRSA, x509.RSA, crypto.MD5}, - {x509.SHA1WithRSA, oidSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, - {x509.SHA1WithRSA, oidISOSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, - {x509.SHA256WithRSA, oidSignatureSHA256WithRSA, x509.RSA, crypto.SHA256}, - {x509.SHA384WithRSA, oidSignatureSHA384WithRSA, x509.RSA, crypto.SHA384}, - {x509.SHA512WithRSA, oidSignatureSHA512WithRSA, x509.RSA, crypto.SHA512}, - {x509.SHA256WithRSAPSS, oidSignatureRSAPSS, x509.RSA, crypto.SHA256}, - {x509.SHA384WithRSAPSS, oidSignatureRSAPSS, x509.RSA, crypto.SHA384}, - {x509.SHA512WithRSAPSS, oidSignatureRSAPSS, x509.RSA, crypto.SHA512}, - {x509.DSAWithSHA1, oidSignatureDSAWithSHA1, x509.DSA, crypto.SHA1}, - {x509.DSAWithSHA256, oidSignatureDSAWithSHA256, x509.DSA, crypto.SHA256}, - {x509.ECDSAWithSHA1, oidSignatureECDSAWithSHA1, x509.ECDSA, crypto.SHA1}, - {x509.ECDSAWithSHA256, oidSignatureECDSAWithSHA256, x509.ECDSA, crypto.SHA256}, - {x509.ECDSAWithSHA384, oidSignatureECDSAWithSHA384, x509.ECDSA, crypto.SHA384}, - {x509.ECDSAWithSHA512, oidSignatureECDSAWithSHA512, x509.ECDSA, crypto.SHA512}, + {x509.MD2WithRSA, oidMD2, oidSignatureMD2WithRSA, x509.RSA, crypto.Hash(0) /* no value for MD2 */}, + {x509.MD5WithRSA, oidMD5, oidSignatureMD5WithRSA, x509.RSA, crypto.MD5}, + {x509.SHA1WithRSA, oidSHA1, oidSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, + {x509.SHA1WithRSA, oidSHA1, oidISOSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, + {x509.SHA256WithRSA, oidSHA256, oidSignatureSHA256WithRSA, x509.RSA, crypto.SHA256}, + {x509.SHA384WithRSA, oidSHA384, oidSignatureSHA384WithRSA, x509.RSA, crypto.SHA384}, + {x509.SHA512WithRSA, oidSHA512, oidSignatureSHA512WithRSA, x509.RSA, crypto.SHA512}, + {x509.SHA256WithRSAPSS, oidSHA256, oidSignatureRSAPSS, x509.RSA, crypto.SHA256}, + {x509.SHA384WithRSAPSS, oidSHA384, oidSignatureRSAPSS, x509.RSA, crypto.SHA384}, + {x509.SHA512WithRSAPSS, oidSHA512, oidSignatureRSAPSS, x509.RSA, crypto.SHA512}, + {x509.DSAWithSHA1, oidSHA1, oidSignatureDSAWithSHA1, x509.DSA, crypto.SHA1}, + {x509.DSAWithSHA256, oidSHA256, oidSignatureDSAWithSHA256, x509.DSA, crypto.SHA256}, + {x509.ECDSAWithSHA1, oidSHA1, oidSignatureECDSAWithSHA1, x509.ECDSA, crypto.SHA1}, + {x509.ECDSAWithSHA256, oidSHA256, oidSignatureECDSAWithSHA256, x509.ECDSA, crypto.SHA256}, + {x509.ECDSAWithSHA384, oidSHA384, oidSignatureECDSAWithSHA384, x509.ECDSA, crypto.SHA384}, + {x509.ECDSAWithSHA512, oidSHA512, oidSignatureECDSAWithSHA512, x509.ECDSA, crypto.SHA512}, } func isRSAPSS(requestedSigAlgo x509.SignatureAlgorithm) bool { diff --git a/internal/x509util/rsapss_pre_go18.go b/internal/x509util/rsapss_pre_go18.go index d863f22..508577d 100644 --- a/internal/x509util/rsapss_pre_go18.go +++ b/internal/x509util/rsapss_pre_go18.go @@ -9,24 +9,25 @@ import ( ) var signatureAlgorithmDetails = []struct { - algo x509.SignatureAlgorithm - oid asn1.ObjectIdentifier - pubKeyAlgo x509.PublicKeyAlgorithm - hash crypto.Hash + algo x509.SignatureAlgorithm + oidDigest asn1.ObjectIdentifier + oidSignature asn1.ObjectIdentifier + pubKeyAlgo x509.PublicKeyAlgorithm + hash crypto.Hash }{ - {x509.MD2WithRSA, oidSignatureMD2WithRSA, x509.RSA, crypto.Hash(0) /* no value for MD2 */}, - {x509.MD5WithRSA, oidSignatureMD5WithRSA, x509.RSA, crypto.MD5}, - {x509.SHA1WithRSA, oidSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, - {x509.SHA1WithRSA, oidISOSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, - {x509.SHA256WithRSA, oidSignatureSHA256WithRSA, x509.RSA, crypto.SHA256}, - {x509.SHA384WithRSA, oidSignatureSHA384WithRSA, x509.RSA, crypto.SHA384}, - {x509.SHA512WithRSA, oidSignatureSHA512WithRSA, x509.RSA, crypto.SHA512}, - {x509.DSAWithSHA1, oidSignatureDSAWithSHA1, x509.DSA, crypto.SHA1}, - {x509.DSAWithSHA256, oidSignatureDSAWithSHA256, x509.DSA, crypto.SHA256}, - {x509.ECDSAWithSHA1, oidSignatureECDSAWithSHA1, x509.ECDSA, crypto.SHA1}, - {x509.ECDSAWithSHA256, oidSignatureECDSAWithSHA256, x509.ECDSA, crypto.SHA256}, - {x509.ECDSAWithSHA384, oidSignatureECDSAWithSHA384, x509.ECDSA, crypto.SHA384}, - {x509.ECDSAWithSHA512, oidSignatureECDSAWithSHA512, x509.ECDSA, crypto.SHA512}, + {x509.MD2WithRSA, oidMD2, oidSignatureMD2WithRSA, x509.RSA, crypto.Hash(0) /* no value for MD2 */}, + {x509.MD5WithRSA, oidMD5, oidSignatureMD5WithRSA, x509.RSA, crypto.MD5}, + {x509.SHA1WithRSA, oidSHA1, oidSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, + {x509.SHA1WithRSA, oidSHA1, oidISOSignatureSHA1WithRSA, x509.RSA, crypto.SHA1}, + {x509.SHA256WithRSA, oidSHA256, oidSignatureSHA256WithRSA, x509.RSA, crypto.SHA256}, + {x509.SHA384WithRSA, oidSHA384, oidSignatureSHA384WithRSA, x509.RSA, crypto.SHA384}, + {x509.SHA512WithRSA, oidSHA512, oidSignatureSHA512WithRSA, x509.RSA, crypto.SHA512}, + {x509.DSAWithSHA1, oidSHA1, oidSignatureDSAWithSHA1, x509.DSA, crypto.SHA1}, + {x509.DSAWithSHA256, oidSHA256, oidSignatureDSAWithSHA256, x509.DSA, crypto.SHA256}, + {x509.ECDSAWithSHA1, oidSHA1, oidSignatureECDSAWithSHA1, x509.ECDSA, crypto.SHA1}, + {x509.ECDSAWithSHA256, oidSHA256, oidSignatureECDSAWithSHA256, x509.ECDSA, crypto.SHA256}, + {x509.ECDSAWithSHA384, oidSHA384, oidSignatureECDSAWithSHA384, x509.ECDSA, crypto.SHA384}, + {x509.ECDSAWithSHA512, oidSHA512, oidSignatureECDSAWithSHA512, x509.ECDSA, crypto.SHA512}, } func isRSAPSS(requestedSigAlgo x509.SignatureAlgorithm) bool { diff --git a/internal/x509util/x509util.go b/internal/x509util/x509util.go index 5eca640..4c50635 100644 --- a/internal/x509util/x509util.go +++ b/internal/x509util/x509util.go @@ -47,7 +47,7 @@ import ( // crypto.Hash function from a provided oid. func SignatureAlgorithmDetailsForOid(oid asn1.ObjectIdentifier) (x509.SignatureAlgorithm, crypto.Hash, error) { for _, details := range signatureAlgorithmDetails { - if details.oid.Equal(oid) { + if details.oidDigest.Equal(oid) { return details.algo, details.hash, nil } } @@ -58,13 +58,14 @@ func SignatureAlgorithmDetailsForOid(oid asn1.ObjectIdentifier) (x509.SignatureA // SigningParamsForPublicKey returns the parameters to use for signing. // If requestedSigAlgo is not zero then it overrides the default // signature algorithm. -func SigningParamsForPublicKey(pub interface{}, requestedSigAlgo x509.SignatureAlgorithm) (hashFunc crypto.Hash, sigAlgo pkix.AlgorithmIdentifier, err error) { +func SigningParamsForPublicKey(pub interface{}, requestedSigAlgo x509.SignatureAlgorithm) (hashFunc crypto.Hash, digAlgo pkix.AlgorithmIdentifier, sigAlgo pkix.AlgorithmIdentifier, err error) { var pubType x509.PublicKeyAlgorithm switch pub := pub.(type) { case *rsa.PublicKey: pubType = x509.RSA hashFunc = crypto.SHA256 + digAlgo.Algorithm = oidSHA256 sigAlgo.Algorithm = oidSignatureSHA256WithRSA sigAlgo.Parameters = asn1NullRawValue @@ -74,12 +75,15 @@ func SigningParamsForPublicKey(pub interface{}, requestedSigAlgo x509.SignatureA switch pub.Curve { case elliptic.P224(), elliptic.P256(): hashFunc = crypto.SHA256 + digAlgo.Algorithm = oidSHA256 sigAlgo.Algorithm = oidSignatureECDSAWithSHA256 case elliptic.P384(): hashFunc = crypto.SHA384 + digAlgo.Algorithm = oidSHA384 sigAlgo.Algorithm = oidSignatureECDSAWithSHA384 case elliptic.P521(): hashFunc = crypto.SHA512 + digAlgo.Algorithm = oidSHA512 sigAlgo.Algorithm = oidSignatureECDSAWithSHA512 default: err = errors.New("x509: unknown elliptic curve") @@ -104,7 +108,9 @@ func SigningParamsForPublicKey(pub interface{}, requestedSigAlgo x509.SignatureA err = errors.New("x509: requested SignatureAlgorithm does not match private key type") return } - sigAlgo.Algorithm, hashFunc = details.oid, details.hash + digAlgo.Algorithm = details.oidDigest + sigAlgo.Algorithm = details.oidSignature + hashFunc = details.hash if hashFunc == 0 { err = errors.New("x509: cannot sign with hash function requested") return @@ -139,6 +145,9 @@ var ( oidSignatureECDSAWithSHA384 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 3} oidSignatureECDSAWithSHA512 = asn1.ObjectIdentifier{1, 2, 840, 10045, 4, 3, 4} + oidMD2 = asn1.ObjectIdentifier{1, 2, 840, 113549, 2, 2} + oidMD5 = asn1.ObjectIdentifier{1, 2, 840, 113549, 2, 5} + oidSHA1 = asn1.ObjectIdentifier{1, 3, 14, 3, 2, 26} oidSHA256 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 1} oidSHA384 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 2} oidSHA512 = asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 3} diff --git a/pkcs7.go b/pkcs7.go index 9045c62..2d46cd2 100644 --- a/pkcs7.go +++ b/pkcs7.go @@ -562,9 +562,13 @@ type SignerInfoConfig struct { // NewSignedData initializes a SignedData with content func NewSignedData(data []byte, opts ...Option) (*SignedData, error) { + // Since the digestAlgorithm and hash function here are hardcoded we need to + // ensure that they match up with the SignatureAlgorithm used in AddSigner + // TODO: Make this more dynamic so we determine the digestAlgorithm and + // signatureAlgorithm from the key being used. c := &config{ digestAlgorithm: pkix.AlgorithmIdentifier{ - Algorithm: oidDigestAlgorithmSHA1, + Algorithm: oidSHA256, }, } for _, opt := range opts { @@ -578,21 +582,16 @@ func NewSignedData(data []byte, opts ...Option) (*SignedData, error) { ContentType: oidData, Content: asn1.RawValue{Class: 2, Tag: 0, Bytes: content, IsCompound: true}, } - digAlg := c.digestAlgorithm - hashFunc, err := getHashForOID(digAlg.Algorithm) - if err != nil { - return nil, err - } - h := hashFunc.New() + h := crypto.SHA256.New() if _, err := h.Write(data); err != nil { return nil, err } sd := signedData{ ContentInfo: ci, Version: 1, - DigestAlgorithmIdentifiers: []pkix.AlgorithmIdentifier{digAlg}, + DigestAlgorithmIdentifiers: []pkix.AlgorithmIdentifier{c.digestAlgorithm}, } - return &SignedData{sd: sd, messageDigest: h.Sum(nil), digestAlgorithm: digAlg}, nil + return &SignedData{sd: sd, messageDigest: h.Sum(nil), digestAlgorithm: c.digestAlgorithm}, nil } type attributes struct { @@ -678,7 +677,7 @@ func (sd *SignedData) AddSigner(cert *x509.Certificate, pkey crypto.PrivateKey, } // TODO @groob pass a SignatureAlgorithm - hash, sigAlgo, err := x509util.SigningParamsForPublicKey(key.Public(), x509.SHA1WithRSA) + hash, digAlgo, sigAlgo, err := x509util.SigningParamsForPublicKey(key.Public(), x509.SHA256WithRSA) signature, err := signAttributes(finalAttrs, pkey, hash) if err != nil { return err @@ -691,8 +690,8 @@ func (sd *SignedData) AddSigner(cert *x509.Certificate, pkey crypto.PrivateKey, signer := signerInfo{ AuthenticatedAttributes: finalAttrs, - DigestAlgorithm: sigAlgo, - DigestEncryptionAlgorithm: pkix.AlgorithmIdentifier{Algorithm: oidEncryptionAlgorithmRSA}, + DigestAlgorithm: digAlgo, + DigestEncryptionAlgorithm: sigAlgo, IssuerAndSerialNumber: ias, EncryptedDigest: signature, Version: 1,