Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 21 additions & 20 deletions internal/x509util/rsapss_go18.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
35 changes: 18 additions & 17 deletions internal/x509util/rsapss_pre_go18.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
15 changes: 12 additions & 3 deletions internal/x509util/x509util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand All @@ -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

Expand All @@ -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")
Expand All @@ -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
Expand Down Expand Up @@ -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}
Expand Down
23 changes: 11 additions & 12 deletions pkcs7.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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 {
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down