diff --git a/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct.go b/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct.go new file mode 100644 index 000000000..3b101f0de --- /dev/null +++ b/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct.go @@ -0,0 +1,101 @@ +package mozilla + +/* + * ZLint Copyright 2020 Regents of the University of Michigan + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +/************************************************ + +https://www.mozilla.org/en-US/about/governance/policies/security-group/certs/policy/ + +Section 5.1.1 RSA + +RSASSA-PSS with SHA-256, MGF-1 with SHA-256, and a salt length of 32 bytes. + +The encoded AlgorithmIdentifier MUST match the following hex-encoded bytes: + +304106092a864886f70d01010a3034a00f300d0609608648016503040201 +0500a11c301a06092a864886f70d010108300d0609608648016503040201 +0500a203020120 + +RSASSA-PSS with SHA-384, MGF-1 with SHA-384, and a salt length of 48 bytes. + +The encoded AlgorithmIdentifier MUST match the following hex-encoded bytes: + +304106092a864886f70d01010a3034a00f300d0609608648016503040202 +0500a11c301a06092a864886f70d010108300d0609608648016503040202 +0500a203020130 + +RSASSA-PSS with SHA-512, MGF-1 with SHA-512, and a salt length of 64 bytes. + +The encoded AlgorithmIdentifier MUST match the following hex-encoded bytes: + +304106092a864886f70d01010a3034a00f300d0609608648016503040203 +0500a11c301a06092a864886f70d010108300d0609608648016503040203 +0500a203020140 +************************************************/ + +import ( + "bytes" + "encoding/hex" + "fmt" + + "github.com/zmap/zcrypto/x509" + "github.com/zmap/zlint/v2/lint" + "github.com/zmap/zlint/v2/util" +) + +type rsaPssAidEncoding struct{} + +var RSASSAPSSAlgorithmIDToDER = [3][]byte{ + // RSASSA-PSS with SHA-256, MGF-1 with SHA-256, salt length 32 bytes + {0x30, 0x41, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa1, 0x1c, 0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x20}, + // RSASSA-PSS with SHA-384, MGF-1 with SHA-384, salt length 48 bytes + {0x30, 0x41, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0xa1, 0x1c, 0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x30}, + // RSASSA-PSS with SHA-512, MGF-1 with SHA-512, salt length 64 bytes + {0x30, 0x41, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0a, 0x30, 0x34, 0xa0, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0xa1, 0x1c, 0x30, 0x1a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x08, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0xa2, 0x03, 0x02, 0x01, 0x40}, +} + +func (l *rsaPssAidEncoding) Initialize() error { + return nil +} + +func (l *rsaPssAidEncoding) CheckApplies(c *x509.Certificate) bool { + return c.SignatureAlgorithmOID.Equal(util.OidRSASSAPSS) +} + +func (l *rsaPssAidEncoding) Execute(c *x509.Certificate) *lint.LintResult { + signatureAlgoID, err := util.GetSignatureAlgorithmInTBSEncoded(c) + if err != nil { + return &lint.LintResult{Status: lint.Error, Details: "error reading signatureAlgorithm from TBS"} + } + + for _, encoding := range RSASSAPSSAlgorithmIDToDER { + if bytes.Equal(signatureAlgoID, encoding) { + return &lint.LintResult{Status: lint.Pass} + } + } + + return &lint.LintResult{Status: lint.Error, Details: fmt.Sprintf("RSASSA-PSS parameters are not properly encoded. %v presentations are allowed but got the unsupported %s", len(RSASSAPSSAlgorithmIDToDER), hex.EncodeToString(signatureAlgoID))} +} + +func init() { + lint.RegisterLint(&lint.Lint{ + Name: "e_mp_rsassa-pss_parameters_encoding_in_signature_algorithm_correct", + Description: "The encoded AlgorithmIdentifier for RSASSA-PSS in the signature algorithm MUST match specific bytes", + Citation: "Mozilla Root Store Policy / Section 5.1.1", + Source: lint.MozillaRootStorePolicy, + EffectiveDate: util.MozillaPolicy27Date, + Lint: &rsaPssAidEncoding{}, + }) +} diff --git a/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct_test.go b/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct_test.go new file mode 100644 index 000000000..46d805fec --- /dev/null +++ b/v2/lints/mozilla/lint_mp_pss_parameters_encoding_correct_test.go @@ -0,0 +1,75 @@ +package mozilla + +/* + * ZLint Copyright 2020 Regents of the University of Michigan + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +import ( + "testing" + + "github.com/zmap/zlint/v2/lint" + "github.com/zmap/zlint/v2/test" +) + +func TestPssAidEncoding(t *testing.T) { + testCases := []struct { + Name string + InputFilename string + ExpectedResult lint.LintStatus + }{ + { + Name: "Standard RSASSA-PSS with SHA256", + InputFilename: "rsassapssWithSHA256.pem", + ExpectedResult: lint.Pass, + }, + { + Name: "Standard RSASSA-PSS with SHA256 but the hash parameters are empty instead of NULL", + InputFilename: "rsassapssWithSHA256EmptyHashParams.pem", + ExpectedResult: lint.Error, + }, + { + Name: "Standard RSASSA-PSS with SHA384", + InputFilename: "rsassapssWithSHA384.pem", + ExpectedResult: lint.Pass, + }, + { + Name: "Standard RSASSA-PSS with SHA384 but the hash parameters are empty instead of NULL", + InputFilename: "rsassapssWithSHA384EmptyHashParams.pem", + ExpectedResult: lint.Error, + }, + { + Name: "Standard RSASSA-PSS with SHA512", + InputFilename: "rsassapssWithSHA512.pem", + ExpectedResult: lint.Pass, + }, + { + Name: "Standard RSASSA-PSS with SHA512 but the hash parameters are empty instead of NULL", + InputFilename: "rsassapssWithSHA512EmptyHashParams.pem", + ExpectedResult: lint.Error, + }, + { + Name: "Standard RSASSA-PSS with SHA256 but the salt length is 17 instead of 32", + InputFilename: "rsassapssWithSHA256ButIrregularSaltLength.pem", + ExpectedResult: lint.Error, + }, + } + + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + result := test.TestLint("e_mp_rsassa-pss_parameters_encoding_in_signature_algorithm_correct", tc.InputFilename) + if result.Status != tc.ExpectedResult { + t.Errorf("expected result %v was %v", tc.ExpectedResult, result.Status) + } + }) + } +} diff --git a/v2/testdata/rsassapssWithSHA256ButIrregularSaltLength.pem b/v2/testdata/rsassapssWithSHA256ButIrregularSaltLength.pem new file mode 100644 index 000000000..10f9b3a58 --- /dev/null +++ b/v2/testdata/rsassapssWithSHA256ButIrregularSaltLength.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDRTCCAfmgAwIBAgICAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgEF +AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgEFAKIDAgERMDwxEDAOBgNVBAMM +B0xpbnQgQ0ExDTALBgNVBAsMBFRlc3QxDDAKBgNVBAoMA01URzELMAkGA1UEBhMC +REUwHhcNMjAwMTAyMDkwMDAwWhcNMjIwMTAyMDkwMDAwWjAnMRgwFgYDVQQDDA9Q +U1MgQ2VydGlmaWNhdGUxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAty76Pq+vs9yvb+o76PMEkpBn5fDi27kej5KWpkvxVnCFiOdp +B3KwTUDm6djclAOzFC/xeFhpB23k1BDCrCMFq6nRBYG+EndReoO9sCtrjl/Exdjd +zf5OyEbp4j7UmTwtuzQ9KZDeS5MpZxCsuB4lg6IUu3v39H4k1onpLTuNpJlIlJoW +MSJxlOb+rB81LHRXUOum4+UH/bSoWPTBlKhMXHtqo2Wmj6E80BIfe0BJqm3x8HH4 +hGHUYNZ4mnqeSCnQ+IqFoquS7UTDtKQwfeHWjuU/OwDIpaDQiDmK4iiUie5QnmV8 +CUM4FcUxwyFJWcOuh/CGXlL7FgCASQebECKV+QIDAQABMEEGCSqGSIb3DQEBCjA0 +oA8wDQYJYIZIAWUDBAIBBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIBBQCi +AwIBEQOCAQEAPnpMQafE1uUGLEMUKM6zOCQGUta+/rx3KPglrCzAj2ip82rjXavd +5tVqndKl884HLswml5mebK1GMtxVI0oxHmGlcyg3skdgDD9fV8yOpVMJK8w/K8rt +PfXKft9lDE0Stw6pjELhsxcFkiKbFM/D0Dx9ieDgqG04JttfL6li/FBKP7y5DTqK +OqkgbCPst/0iJtwjIve0Hh2jIvRRrstrLReZkjhyKZ6OcY0WYMbvRZfigDohNrA4 +TLqEIv4R7vtKm3LLzpulolGHd2sIPkAVFEyL5bc8LiazxVTOVOIMXdb90uDSq7Jv +c/eJ98IkCidi5hydu8tZf88SGAEqRb7yoQ== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/v2/testdata/rsassapssWithSHA256EmptyHashParams.pem b/v2/testdata/rsassapssWithSHA256EmptyHashParams.pem new file mode 100644 index 000000000..a82be3e99 --- /dev/null +++ b/v2/testdata/rsassapssWithSHA256EmptyHashParams.pem @@ -0,0 +1,78 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 256 (0x100) + Signature Algorithm: rsassaPss + Hash Algorithm: sha256 + Mask Algorithm: mgf1 with sha256 + Salt Length: 0x20 + Trailer Field: 0xBC (default) + Issuer: CN = Lint CA, OU = Test, O = MTG, C = DE + Validity + Not Before: Jan 2 09:00:00 2020 GMT + Not After : Jan 2 09:00:00 2022 GMT + Subject: CN = PSS Certificate, C = DE + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:83:49:7e:49:11:77:25:1d:f2:85:20:5b:d4:86: + 6a:46:c3:94:0e:4e:16:b4:1f:87:75:85:43:c6:a9: + da:32:02:84:64:c2:db:c6:0a:2b:52:da:59:70:0e: + 0c:d9:38:e4:ff:27:8b:de:05:26:78:3d:c9:c4:ca: + 3e:d9:95:d1:bc:39:31:3d:a0:97:8e:88:44:1c:c8: + 1d:83:6d:e1:55:3c:ff:67:11:be:47:41:38:52:f4: + b3:8b:f8:ae:05:fb:41:82:c2:6a:77:ff:87:98:ab: + e2:d6:6d:1a:88:81:7c:c7:26:df:a8:4f:10:c3:3d: + 1e:fa:1c:1f:26:08:a0:64:95:ab:85:e6:8d:10:97: + ff:8f:b8:be:db:c5:07:51:64:83:3e:e3:00:96:97: + ec:53:6d:c1:da:2d:16:32:50:97:e9:c7:54:bf:f1: + 78:bc:cc:9d:2c:82:34:60:0f:12:5a:e9:13:7e:44: + 03:0d:10:5f:6a:c4:12:1a:da:33:54:4e:ad:4d:e6: + 1c:be:3b:30:73:98:3e:54:43:96:80:16:2c:c6:51: + fc:dc:2b:18:29:38:85:a0:e6:f1:75:49:7e:72:bf: + 60:ad:32:0c:46:20:07:e2:99:e8:bf:dd:19:7e:74: + 0f:86:6f:d0:c7:fb:85:d2:8a:9f:c0:d7:6f:1b:f4: + 8e:67 + Exponent: 65537 (0x10001) + Signature Algorithm: rsassaPss + Hash Algorithm: sha256 + Mask Algorithm: mgf1 with sha256 + Salt Length: 0x20 + Trailer Field: 0xBC (default) + + 2b:c1:9b:ee:ee:66:11:91:a8:d6:94:22:70:e7:04:4a:1e:38: + 01:ae:89:d1:0d:ae:bd:9d:cb:53:d3:46:91:8a:55:a4:7c:db: + 90:39:9e:14:09:25:b2:f0:a5:a8:e8:2b:07:0e:12:22:25:f8: + 1b:a2:78:ae:b0:0b:6e:bb:66:22:a6:97:26:7c:4f:f4:f0:65: + 2d:cb:c3:06:17:a5:25:09:e6:5c:6b:30:99:ab:68:3c:02:11: + a9:ae:6c:d2:ef:ed:56:bc:2b:2f:42:bb:9e:aa:c0:fc:c5:b4: + 5c:61:ea:95:10:82:e9:3a:cd:ef:67:b8:33:25:28:fa:95:12: + 70:4b:4e:80:b6:ef:e9:c9:72:df:89:1b:27:6a:45:a7:9c:b7: + de:cc:c8:89:88:9c:22:30:c2:63:ca:6c:fb:57:ad:25:6f:4a: + 0f:a7:b4:d3:72:04:fc:05:56:31:f9:a8:8b:89:fe:16:f4:34: + ae:87:c4:48:e2:99:b1:1f:a0:9c:ef:ea:27:ac:32:7b:7f:72: + 09:1d:a2:fc:d1:55:e9:42:ad:23:19:d6:1c:dd:ef:94:a8:d2: + 9d:99:44:01:ac:bf:78:93:3c:82:a2:01:1f:f6:cf:91:83:10: + 16:eb:bb:62:af:8c:e9:c2:1b:df:86:27:eb:20:fd:e0:89:6f: + c2:1a:ac:5d +-----BEGIN CERTIFICATE----- +MIIDPTCCAfWgAwIBAgICAQAwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgGh +GjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASAwPDEQMA4GA1UEAwwHTGlu +dCBDQTENMAsGA1UECwwEVGVzdDEMMAoGA1UECgwDTVRHMQswCQYDVQQGEwJERTAe +Fw0yMDAxMDIwOTAwMDBaFw0yMjAxMDIwOTAwMDBaMCcxGDAWBgNVBAMMD1BTUyBD +ZXJ0aWZpY2F0ZTELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCDSX5JEXclHfKFIFvUhmpGw5QOTha0H4d1hUPGqdoyAoRkwtvGCitS +2llwDgzZOOT/J4veBSZ4PcnEyj7ZldG8OTE9oJeOiEQcyB2DbeFVPP9nEb5HQThS +9LOL+K4F+0GCwmp3/4eYq+LWbRqIgXzHJt+oTxDDPR76HB8mCKBklauF5o0Ql/+P +uL7bxQdRZIM+4wCWl+xTbcHaLRYyUJfpx1S/8Xi8zJ0sgjRgDxJa6RN+RAMNEF9q +xBIa2jNUTq1N5hy+OzBzmD5UQ5aAFizGUfzcKxgpOIWg5vF1SX5yv2CtMgxGIAfi +mei/3Rl+dA+Gb9DH+4XSip/A128b9I5nAgMBAAEwPQYJKoZIhvcNAQEKMDCgDTAL +BglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASADggEB +ACvBm+7uZhGRqNaUInDnBEoeOAGuidENrr2dy1PTRpGKVaR825A5nhQJJbLwpajo +KwcOEiIl+BuieK6wC267ZiKmlyZ8T/TwZS3LwwYXpSUJ5lxrMJmraDwCEamubNLv +7Va8Ky9Cu56qwPzFtFxh6pUQguk6ze9nuDMlKPqVEnBLToC27+nJct+JGydqRaec +t97MyImInCIwwmPKbPtXrSVvSg+ntNNyBPwFVjH5qIuJ/hb0NK6HxEjimbEfoJzv +6iesMnt/cgkdovzRVelCrSMZ1hzd75So0p2ZRAGsv3iTPIKiAR/2z5GDEBbru2Kv +jOnCG9+GJ+sg/eCJb8IarF0= +-----END CERTIFICATE----- diff --git a/v2/testdata/rsassapssWithSHA384.pem b/v2/testdata/rsassapssWithSHA384.pem new file mode 100644 index 000000000..5b3f7e6bc --- /dev/null +++ b/v2/testdata/rsassapssWithSHA384.pem @@ -0,0 +1,78 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 256 (0x100) + Signature Algorithm: rsassaPss + Hash Algorithm: sha384 + Mask Algorithm: mgf1 with sha384 + Salt Length: 0x30 + Trailer Field: 0xBC (default) + Issuer: CN = Lint CA, OU = Test, O = MTG, C = DE + Validity + Not Before: Jan 2 09:00:00 2020 GMT + Not After : Jan 2 09:00:00 2022 GMT + Subject: CN = PSS Certificate, C = DE + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:ce:f5:1d:67:ca:9c:2b:20:43:69:5e:2c:97:46: + 12:29:ff:dd:36:b1:c7:f0:1e:7c:5d:5a:95:a7:11: + 0b:a4:86:69:37:8e:e8:da:08:40:79:0d:36:b8:2e: + fc:21:9b:c1:d9:83:57:47:ed:17:4d:d4:48:cd:dc: + d7:06:e9:a1:6e:41:d1:6c:f7:21:7e:98:a5:4b:ed: + 00:54:f5:b6:b9:5d:2c:ed:36:2f:cf:97:33:59:f3: + a2:df:3c:a9:96:19:ec:71:dd:d6:6d:cf:9f:3f:05: + 67:31:0c:ce:93:00:b6:e1:f0:56:71:4a:1b:65:87: + a7:e8:bb:15:20:1f:7d:df:ce:73:94:00:74:7f:cb: + 54:c0:56:98:3e:c9:50:1a:99:a1:d6:55:ad:aa:df: + e6:89:b4:66:e2:e5:72:3e:a7:18:26:ed:2b:60:39: + bd:b4:b6:8b:3b:69:ef:cd:c9:99:c3:6b:86:9d:43: + ab:91:46:16:a1:44:6b:9c:a2:c9:d7:43:85:cb:6c: + 9e:d8:aa:59:37:3d:11:b5:e4:c0:2e:ef:10:25:85: + 30:4c:89:e6:be:6d:c2:22:db:b0:4a:9a:36:52:17: + 9e:4c:85:4d:3a:53:10:3b:36:95:6f:6c:cb:c6:da: + d8:45:2d:6c:39:f0:e8:4b:e8:7c:b4:24:ec:5f:4f: + 6b:cd + Exponent: 65537 (0x10001) + Signature Algorithm: rsassaPss + Hash Algorithm: sha384 + Mask Algorithm: mgf1 with sha384 + Salt Length: 0x30 + Trailer Field: 0xBC (default) + + 5d:cb:23:99:5e:34:b0:f1:ab:06:17:e8:31:4f:a6:09:07:75: + e8:4d:ca:62:c9:5b:5c:08:ef:23:c2:56:4a:d0:c4:46:66:8f: + de:21:34:37:04:7f:5f:1b:e2:18:29:99:d2:1c:6c:05:da:82: + 7e:21:7a:45:bf:9d:3c:c8:2e:fc:7a:f2:97:9c:8c:bd:62:88: + 15:e6:f4:d8:67:1c:3b:f6:bc:a7:b8:cd:e0:a0:f5:a2:2f:2a: + 14:ba:67:f9:e9:67:dc:91:c6:e8:ce:39:c5:1e:81:82:a2:85: + e8:01:a0:5d:96:96:10:cf:fb:f5:f1:2f:9e:7d:b8:14:c3:3c: + 09:4e:9f:6f:f4:44:d0:3e:49:11:c7:50:21:bb:c9:ea:49:f8: + d5:ef:e0:23:f3:f6:c2:22:9f:29:9a:55:74:53:5f:4b:ab:0d: + 4d:06:bc:be:64:1d:4a:4d:a2:e5:43:9e:6f:95:70:ed:ab:a7: + d8:9f:7c:85:4c:f7:6d:30:16:36:74:dc:6b:e3:9a:96:95:35: + 2b:4b:94:50:7a:5b:89:a1:75:9e:2d:66:ad:0b:31:ce:fd:4e: + 42:8d:f7:1b:da:24:7d:c7:34:1e:de:bf:fa:1d:3d:fb:36:34: + 3e:99:29:0d:9d:c5:04:6d:d2:27:7b:11:d4:65:e6:f0:ab:a8: + 8c:8c:31:9d +-----BEGIN CERTIFICATE----- +MIIDRTCCAfmgAwIBAgICAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgIF +AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgIFAKIDAgEwMDwxEDAOBgNVBAMM +B0xpbnQgQ0ExDTALBgNVBAsMBFRlc3QxDDAKBgNVBAoMA01URzELMAkGA1UEBhMC +REUwHhcNMjAwMTAyMDkwMDAwWhcNMjIwMTAyMDkwMDAwWjAnMRgwFgYDVQQDDA9Q +U1MgQ2VydGlmaWNhdGUxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAzvUdZ8qcKyBDaV4sl0YSKf/dNrHH8B58XVqVpxELpIZpN47o +2ghAeQ02uC78IZvB2YNXR+0XTdRIzdzXBumhbkHRbPchfpilS+0AVPW2uV0s7TYv +z5czWfOi3zyplhnscd3Wbc+fPwVnMQzOkwC24fBWcUobZYen6LsVIB99385zlAB0 +f8tUwFaYPslQGpmh1lWtqt/mibRm4uVyPqcYJu0rYDm9tLaLO2nvzcmZw2uGnUOr +kUYWoURrnKLJ10OFy2ye2KpZNz0RteTALu8QJYUwTInmvm3CItuwSpo2UheeTIVN +OlMQOzaVb2zLxtrYRS1sOfDoS+h8tCTsX09rzQIDAQABMEEGCSqGSIb3DQEBCjA0 +oA8wDQYJYIZIAWUDBAICBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAICBQCi +AwIBMAOCAQEAXcsjmV40sPGrBhfoMU+mCQd16E3KYslbXAjvI8JWStDERmaP3iE0 +NwR/XxviGCmZ0hxsBdqCfiF6Rb+dPMgu/Hryl5yMvWKIFeb02GccO/a8p7jN4KD1 +oi8qFLpn+eln3JHG6M45xR6BgqKF6AGgXZaWEM/79fEvnn24FMM8CU6fb/RE0D5J +EcdQIbvJ6kn41e/gI/P2wiKfKZpVdFNfS6sNTQa8vmQdSk2i5UOeb5Vw7aun2J98 +hUz3bTAWNnTca+OalpU1K0uUUHpbiaF1ni1mrQsxzv1OQo33G9okfcc0Ht6/+h09 ++zY0PpkpDZ3FBG3SJ3sR1GXm8KuojIwxnQ== +-----END CERTIFICATE----- diff --git a/v2/testdata/rsassapssWithSHA384EmptyHashParams.pem b/v2/testdata/rsassapssWithSHA384EmptyHashParams.pem new file mode 100644 index 000000000..b60f5cc02 --- /dev/null +++ b/v2/testdata/rsassapssWithSHA384EmptyHashParams.pem @@ -0,0 +1,78 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 256 (0x100) + Signature Algorithm: rsassaPss + Hash Algorithm: sha384 + Mask Algorithm: mgf1 with sha384 + Salt Length: 0x30 + Trailer Field: 0xBC (default) + Issuer: CN = Lint CA, OU = Test, O = MTG, C = DE + Validity + Not Before: Jan 2 09:00:00 2020 GMT + Not After : Jan 2 09:00:00 2022 GMT + Subject: CN = PSS Certificate, C = DE + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:b9:dd:2b:e2:8b:65:79:dd:2b:ba:fe:b4:a5:18: + e6:d5:a3:e3:b3:6a:f6:80:fd:d0:9f:c5:ed:6b:a6: + 2b:e0:85:3e:80:d4:be:4a:ec:cd:0b:29:0e:d0:b5: + 9c:56:e3:de:e5:1c:5d:28:56:6a:e4:79:56:52:3a: + 15:ea:5e:a2:4c:4e:01:ce:c3:8c:6b:af:8b:b2:43: + 07:5d:d3:9a:8b:4e:e0:6b:51:36:f5:ef:34:cf:aa: + 55:34:32:e4:b7:ea:ef:ec:f3:35:4d:3b:56:5e:04: + 3d:c0:31:78:a3:f5:78:79:18:5c:db:d2:18:40:a4: + 16:54:80:3b:40:cf:76:f0:0f:76:dd:08:1c:83:51: + 9d:03:85:31:1d:fe:78:b1:30:82:2c:fb:ad:ed:71: + 4b:78:84:7c:17:ef:2d:7e:7a:d3:62:5c:a8:84:d4: + 5f:b0:0e:bc:ad:56:b2:7e:93:48:27:d1:6d:2c:de: + 3a:21:02:b5:85:1b:78:35:37:6c:c1:57:0a:73:03: + 58:33:b2:f4:9e:51:98:dc:1b:7d:12:b9:3e:c3:25: + 6f:92:a0:03:39:09:93:6c:0d:e2:ea:d8:ed:8e:87: + 86:14:2e:16:88:eb:0f:f3:d2:e6:db:55:65:1e:7f: + 93:22:df:d0:ed:bb:f3:bd:ca:c2:51:3c:4c:8b:89: + e3:5b + Exponent: 65537 (0x10001) + Signature Algorithm: rsassaPss + Hash Algorithm: sha384 + Mask Algorithm: mgf1 with sha384 + Salt Length: 0x30 + Trailer Field: 0xBC (default) + + 44:ca:d4:f9:99:4c:b7:84:59:ba:09:64:e5:92:ec:18:e7:9c: + 10:ea:6e:5e:9b:ff:96:12:88:14:7a:ab:4d:c6:7e:3f:14:4c: + c4:ea:c9:ad:24:60:34:68:70:76:b3:ac:e5:ce:d2:e0:28:f7: + 9b:46:b7:60:90:8c:75:f4:4b:fd:e9:58:c0:87:2e:a9:77:e4: + 0f:84:5e:13:d7:22:ee:e9:03:1a:79:ac:35:68:38:ff:aa:c8: + 7c:6f:86:30:86:cf:49:99:2b:62:64:47:48:69:8c:9d:c4:a3: + 52:92:c7:e7:a5:26:70:df:45:4a:e8:0a:4b:92:e4:73:1b:69: + 7b:06:43:62:68:46:f1:16:db:08:e5:23:a7:41:83:d9:36:24: + 31:42:2b:59:cb:78:22:18:11:e4:74:6e:f9:e5:3a:34:0e:ea: + 48:6a:fb:fc:03:fd:b0:f0:8f:2e:4c:1c:dc:78:1d:0d:fb:3a: + f5:d2:b1:ab:51:37:63:f7:48:82:a5:ca:fe:bc:b9:ae:03:38: + 43:1c:5a:7c:80:5b:d0:6a:fb:44:40:74:41:11:08:76:4e:9a: + 54:2f:7e:dd:ec:75:55:eb:b7:65:a9:ec:c6:fb:b5:1a:ad:00: + 1d:7b:41:e5:74:b9:84:1a:11:4d:14:a3:37:22:f8:15:3c:e6: + 6a:bf:33:73 +-----BEGIN CERTIFICATE----- +MIIDPTCCAfWgAwIBAgICAQAwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgKh +GjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogMCATAwPDEQMA4GA1UEAwwHTGlu +dCBDQTENMAsGA1UECwwEVGVzdDEMMAoGA1UECgwDTVRHMQswCQYDVQQGEwJERTAe +Fw0yMDAxMDIwOTAwMDBaFw0yMjAxMDIwOTAwMDBaMCcxGDAWBgNVBAMMD1BTUyBD +ZXJ0aWZpY2F0ZTELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQC53Svii2V53Su6/rSlGObVo+OzavaA/dCfxe1rpivghT6A1L5K7M0L +KQ7QtZxW497lHF0oVmrkeVZSOhXqXqJMTgHOw4xrr4uyQwdd05qLTuBrUTb17zTP +qlU0MuS36u/s8zVNO1ZeBD3AMXij9Xh5GFzb0hhApBZUgDtAz3bwD3bdCByDUZ0D +hTEd/nixMIIs+63tcUt4hHwX7y1+etNiXKiE1F+wDrytVrJ+k0gn0W0s3johArWF +G3g1N2zBVwpzA1gzsvSeUZjcG30SuT7DJW+SoAM5CZNsDeLq2O2Oh4YULhaI6w/z +0ubbVWUef5Mi39Dtu/O9ysJRPEyLieNbAgMBAAEwPQYJKoZIhvcNAQEKMDCgDTAL +BglghkgBZQMEAgKhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAICogMCATADggEB +AETK1PmZTLeEWboJZOWS7BjnnBDqbl6b/5YSiBR6q03Gfj8UTMTqya0kYDRocHaz +rOXO0uAo95tGt2CQjHX0S/3pWMCHLql35A+EXhPXIu7pAxp5rDVoOP+qyHxvhjCG +z0mZK2JkR0hpjJ3Eo1KSx+elJnDfRUroCkuS5HMbaXsGQ2JoRvEW2wjlI6dBg9k2 +JDFCK1nLeCIYEeR0bvnlOjQO6khq+/wD/bDwjy5MHNx4HQ37OvXSsatRN2P3SIKl +yv68ua4DOEMcWnyAW9Bq+0RAdEERCHZOmlQvft3sdVXrt2Wp7Mb7tRqtAB17QeV0 +uYQaEU0Uozci+BU85mq/M3M= +-----END CERTIFICATE----- diff --git a/v2/testdata/rsassapssWithSHA512.pem b/v2/testdata/rsassapssWithSHA512.pem new file mode 100644 index 000000000..f94dccdf6 --- /dev/null +++ b/v2/testdata/rsassapssWithSHA512.pem @@ -0,0 +1,78 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 256 (0x100) + Signature Algorithm: rsassaPss + Hash Algorithm: sha512 + Mask Algorithm: mgf1 with sha512 + Salt Length: 0x40 + Trailer Field: 0xBC (default) + Issuer: CN = Lint CA, OU = Test, O = MTG, C = DE + Validity + Not Before: Jan 2 09:00:00 2020 GMT + Not After : Jan 2 09:00:00 2022 GMT + Subject: CN = PSS Certificate, C = DE + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:80:64:93:6f:f0:66:e8:57:f2:9a:9b:14:8d:c2: + 7f:eb:dc:34:64:2d:1b:4e:bb:17:f1:a0:ff:87:5e: + 69:fe:5c:ee:d3:32:79:de:e0:12:b9:99:5b:ab:fa: + 12:e7:c0:3d:94:a3:c0:5e:5f:6c:ac:18:a9:98:42: + 47:99:ff:0e:2f:8c:a1:e3:4a:0e:9d:36:ea:03:49: + d2:17:b9:a9:47:c5:65:36:f7:01:38:ce:79:70:4e: + d4:46:45:98:a7:a1:9c:4f:b6:ce:87:ad:42:69:1e: + 5d:3b:15:fc:f3:ae:38:90:ea:bb:56:ae:6c:d8:dc: + 53:cd:41:c5:53:ae:da:01:e4:44:41:d2:02:d7:4b: + bc:7e:24:aa:4e:9e:ec:52:e5:13:de:58:90:2d:94: + 8c:73:11:88:4f:29:58:92:8a:b2:54:dd:c6:28:a7: + bc:a6:33:f5:08:9d:78:5b:7b:dc:af:e7:01:42:34: + 24:b5:ae:bc:dc:56:b5:80:7d:1c:d3:cb:01:28:15: + b4:08:99:ee:d4:9c:7e:57:1c:d6:ad:62:80:c1:eb: + df:c1:f9:a3:d3:06:38:51:cc:26:e6:aa:ad:8f:2e: + b1:db:4f:c7:4a:72:6d:77:38:3f:79:8b:e1:45:fa: + 78:91:9c:7f:55:1f:0f:40:6e:07:6a:c4:44:2a:e8: + 1c:71 + Exponent: 65537 (0x10001) + Signature Algorithm: rsassaPss + Hash Algorithm: sha512 + Mask Algorithm: mgf1 with sha512 + Salt Length: 0x40 + Trailer Field: 0xBC (default) + + b6:07:1e:ae:68:f7:d4:56:87:5e:67:ce:c6:0f:5d:78:3e:4d: + e5:22:4e:2c:a7:46:92:e1:19:9c:48:89:34:83:57:4f:8c:64: + de:c3:05:34:aa:3e:24:18:40:92:0d:a1:f4:25:4a:ff:b6:3b: + f7:14:8c:8a:c3:fa:df:3e:23:c4:2e:78:77:28:a3:2a:aa:12: + 81:d5:bb:cc:18:91:47:f5:9f:fe:d9:10:69:a0:12:64:39:1a: + 22:df:d2:81:04:b9:9a:52:21:e9:af:22:cb:50:d5:2e:2d:c0: + af:ff:52:ce:dd:43:0a:ee:07:67:a9:da:38:b9:1e:b0:a9:99: + 87:0b:99:63:36:48:79:39:84:e4:94:24:d3:c1:19:07:ca:1e: + a1:c9:ab:85:45:57:7d:ce:2e:8c:eb:70:e2:99:9b:01:eb:07: + ce:db:f8:9b:41:4d:81:dc:da:c5:0c:cf:c7:6e:a9:30:d8:a8: + 7b:21:88:96:46:9c:bd:36:c9:82:63:22:7b:ac:4d:18:63:0f: + 52:a4:c2:b6:f8:49:4e:fd:89:30:c1:22:d5:b8:58:da:d6:05: + ae:d2:48:ac:2f:bb:42:44:0a:6d:db:df:d7:1e:87:51:d3:5a: + ed:26:ff:57:e9:f0:ce:b8:9b:5b:22:0d:47:14:95:36:00:be: + 54:1b:b3:cc +-----BEGIN CERTIFICATE----- +MIIDRTCCAfmgAwIBAgICAQAwQQYJKoZIhvcNAQEKMDSgDzANBglghkgBZQMEAgMF +AKEcMBoGCSqGSIb3DQEBCDANBglghkgBZQMEAgMFAKIDAgFAMDwxEDAOBgNVBAMM +B0xpbnQgQ0ExDTALBgNVBAsMBFRlc3QxDDAKBgNVBAoMA01URzELMAkGA1UEBhMC +REUwHhcNMjAwMTAyMDkwMDAwWhcNMjIwMTAyMDkwMDAwWjAnMRgwFgYDVQQDDA9Q +U1MgQ2VydGlmaWNhdGUxCzAJBgNVBAYTAkRFMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAgGSTb/Bm6FfympsUjcJ/69w0ZC0bTrsX8aD/h15p/lzu0zJ5 +3uASuZlbq/oS58A9lKPAXl9srBipmEJHmf8OL4yh40oOnTbqA0nSF7mpR8VlNvcB +OM55cE7URkWYp6GcT7bOh61CaR5dOxX88644kOq7Vq5s2NxTzUHFU67aAeREQdIC +10u8fiSqTp7sUuUT3liQLZSMcxGITylYkoqyVN3GKKe8pjP1CJ14W3vcr+cBQjQk +ta683Fa1gH0c08sBKBW0CJnu1Jx+VxzWrWKAwevfwfmj0wY4Ucwm5qqtjy6x20/H +SnJtdzg/eYvhRfp4kZx/VR8PQG4HasREKugccQIDAQABMEEGCSqGSIb3DQEBCjA0 +oA8wDQYJYIZIAWUDBAIDBQChHDAaBgkqhkiG9w0BAQgwDQYJYIZIAWUDBAIDBQCi +AwIBQAOCAQEAtgcermj31FaHXmfOxg9deD5N5SJOLKdGkuEZnEiJNINXT4xk3sMF +NKo+JBhAkg2h9CVK/7Y79xSMisP63z4jxC54dyijKqoSgdW7zBiRR/Wf/tkQaaAS +ZDkaIt/SgQS5mlIh6a8iy1DVLi3Ar/9Szt1DCu4HZ6naOLkesKmZhwuZYzZIeTmE +5JQk08EZB8oeocmrhUVXfc4ujOtw4pmbAesHztv4m0FNgdzaxQzPx26pMNioeyGI +lkacvTbJgmMie6xNGGMPUqTCtvhJTv2JMMEi1bhY2tYFrtJIrC+7QkQKbdvf1x6H +UdNa7Sb/V+nwzribWyINRxSVNgC+VBuzzA== +-----END CERTIFICATE----- diff --git a/v2/testdata/rsassapssWithSHA512EmptyHashParams.pem b/v2/testdata/rsassapssWithSHA512EmptyHashParams.pem new file mode 100644 index 000000000..e35ce46a6 --- /dev/null +++ b/v2/testdata/rsassapssWithSHA512EmptyHashParams.pem @@ -0,0 +1,78 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 256 (0x100) + Signature Algorithm: rsassaPss + Hash Algorithm: sha512 + Mask Algorithm: mgf1 with sha512 + Salt Length: 0x40 + Trailer Field: 0xBC (default) + Issuer: CN = Lint CA, OU = Test, O = MTG, C = DE + Validity + Not Before: Jan 2 09:00:00 2020 GMT + Not After : Jan 2 09:00:00 2022 GMT + Subject: CN = PSS Certificate, C = DE + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public-Key: (2048 bit) + Modulus: + 00:8d:e5:f5:05:c4:fd:c0:c8:e4:42:fc:d3:d9:85: + e0:d5:da:12:96:b0:d4:de:6b:0b:4b:ab:99:43:61: + 0b:e4:11:80:fc:5d:40:c7:0e:f9:e2:25:86:14:74: + 64:58:5e:8c:4a:bc:10:11:7f:ad:82:f3:a2:5e:3e: + 59:6f:1c:5e:5f:d8:2e:1f:17:d5:00:bc:97:68:56: + 8c:5a:ac:20:4c:b4:51:60:54:96:8d:09:ff:20:bc: + ce:df:8c:3f:b5:f1:6b:eb:5e:6d:0e:60:f7:df:fe: + 5e:0c:d3:99:d5:1b:57:b9:2c:f7:77:2c:18:d1:20: + 07:9f:ee:ef:84:b4:3d:c1:53:de:8f:2a:5e:a9:7c: + 5d:12:69:b9:a8:1c:4a:28:78:fc:6d:3a:46:35:79: + 3f:c7:51:82:61:ac:89:5f:d9:6a:de:40:34:14:98: + b6:19:ea:43:f3:08:ab:49:e2:6e:81:9f:ad:41:29: + 64:ed:6c:4f:41:44:e6:6b:62:1a:5c:77:bb:38:3f: + 30:02:3e:c0:16:f6:6b:24:3a:a9:30:77:51:f6:f6: + b8:25:7c:6e:b8:51:b1:98:d7:55:aa:03:3b:7d:03: + 6f:b7:4a:72:93:b4:d9:3d:93:22:3f:eb:b5:47:53: + c4:7d:21:3d:c2:b8:73:02:87:64:ed:de:8e:1a:03: + 10:e5 + Exponent: 65537 (0x10001) + Signature Algorithm: rsassaPss + Hash Algorithm: sha512 + Mask Algorithm: mgf1 with sha512 + Salt Length: 0x40 + Trailer Field: 0xBC (default) + + 52:51:e8:d1:c8:af:9f:22:75:3b:e2:8a:7e:13:76:0f:51:87: + 6d:8a:df:32:a1:f0:73:6d:83:ac:66:e8:96:47:da:fe:0f:e5: + 23:cd:06:a4:13:9d:bd:d4:f0:40:7a:e2:db:e6:63:7d:68:da: + fb:1a:b4:b3:d5:26:fa:15:6a:82:68:2f:67:eb:3f:0d:f5:ab: + e6:0a:45:30:f8:79:61:d9:1e:70:ff:a0:ff:c9:03:0f:7d:94: + 11:8c:b8:57:c2:08:9f:af:b4:9a:1b:50:d4:9f:7b:b3:93:fe: + 26:3b:4b:93:a4:e8:bb:e0:6b:a6:f9:16:21:8a:54:f6:89:99: + 49:3d:11:a2:78:54:30:65:8d:9d:fb:46:e1:14:a3:27:3a:11: + 52:64:ee:28:bd:b6:ab:bf:80:cb:ee:7d:84:1f:b1:2d:94:a9: + 8b:33:e5:18:f2:32:49:36:a9:f0:1e:0c:4a:c5:40:21:9a:af: + bf:b5:f2:be:72:d4:cf:14:c4:d0:55:cc:6f:bf:2d:1b:13:4c: + 68:b8:09:61:4b:6e:80:fc:d1:9e:12:6e:d7:7f:de:4e:05:bf: + d5:0d:a0:af:c7:48:63:70:6e:85:3b:be:47:61:97:69:79:4c: + 07:33:1e:3a:f7:38:c8:16:ef:26:62:11:2e:45:e4:3a:ac:f7: + 8a:28:af:a0 +-----BEGIN CERTIFICATE----- +MIIDPTCCAfWgAwIBAgICAQAwPQYJKoZIhvcNAQEKMDCgDTALBglghkgBZQMEAgOh +GjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIDogMCAUAwPDEQMA4GA1UEAwwHTGlu +dCBDQTENMAsGA1UECwwEVGVzdDEMMAoGA1UECgwDTVRHMQswCQYDVQQGEwJERTAe +Fw0yMDAxMDIwOTAwMDBaFw0yMjAxMDIwOTAwMDBaMCcxGDAWBgNVBAMMD1BTUyBD +ZXJ0aWZpY2F0ZTELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCN5fUFxP3AyORC/NPZheDV2hKWsNTeawtLq5lDYQvkEYD8XUDHDvni +JYYUdGRYXoxKvBARf62C86JePllvHF5f2C4fF9UAvJdoVoxarCBMtFFgVJaNCf8g +vM7fjD+18WvrXm0OYPff/l4M05nVG1e5LPd3LBjRIAef7u+EtD3BU96PKl6pfF0S +abmoHEooePxtOkY1eT/HUYJhrIlf2WreQDQUmLYZ6kPzCKtJ4m6Bn61BKWTtbE9B +ROZrYhpcd7s4PzACPsAW9mskOqkwd1H29rglfG64UbGY11WqAzt9A2+3SnKTtNk9 +kyI/67VHU8R9IT3CuHMCh2Tt3o4aAxDlAgMBAAEwPQYJKoZIhvcNAQEKMDCgDTAL +BglghkgBZQMEAgOhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIDogMCAUADggEB +AFJR6NHIr58idTviin4Tdg9Rh22K3zKh8HNtg6xm6JZH2v4P5SPNBqQTnb3U8EB6 +4tvmY31o2vsatLPVJvoVaoJoL2frPw31q+YKRTD4eWHZHnD/oP/JAw99lBGMuFfC +CJ+vtJobUNSfe7OT/iY7S5Ok6Lvga6b5FiGKVPaJmUk9EaJ4VDBljZ37RuEUoyc6 +EVJk7ii9tqu/gMvufYQfsS2UqYsz5RjyMkk2qfAeDErFQCGar7+18r5y1M8UxNBV +zG+/LRsTTGi4CWFLboD80Z4Sbtd/3k4Fv9UNoK/HSGNwboU7vkdhl2l5TAczHjr3 +OMgW7yZiES5F5Dqs94oor6A= +-----END CERTIFICATE----- diff --git a/v2/util/algorithm_identifier.go b/v2/util/algorithm_identifier.go index eb9d18492..0491fd544 100644 --- a/v2/util/algorithm_identifier.go +++ b/v2/util/algorithm_identifier.go @@ -86,6 +86,50 @@ func CheckAlgorithmIDParamNotNULL(algorithmIdentifier []byte, requiredAlgoID asn return errors.New("RSA algorithm appears correct, but didn't match byte-wise comparison") } +// Returns the signature field of the tbsCertificate of this certificate in a DER encoded form or an error +// if the signature field could not be extracted. The encoded form contains the tag and the length. +// +// TBSCertificate ::= SEQUENCE { +// version [0] EXPLICIT Version DEFAULT v1, +// serialNumber CertificateSerialNumber, +// signature AlgorithmIdentifier, +// issuer Name, +// validity Validity, +// subject Name, +// subjectPublicKeyInfo SubjectPublicKeyInfo, +// issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL, +// -- If present, version MUST be v2 or v3 +// subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, +// -- If present, version MUST be v2 or v3 +// extensions [3] EXPLICIT Extensions OPTIONAL +// -- If present, version MUST be v3 +// } +func GetSignatureAlgorithmInTBSEncoded(c *x509.Certificate) ([]byte, error) { + input := cryptobyte.String(c.RawTBSCertificate) + + var tbsCert cryptobyte.String + if !input.ReadASN1(&tbsCert, cryptobyte_asn1.SEQUENCE) { + return nil, errors.New("error reading tbsCertificate") + } + + if !tbsCert.SkipOptionalASN1(cryptobyte_asn1.Tag(0).Constructed().ContextSpecific()) { + return nil, errors.New("error reading tbsCertificate.version") + } + + if !tbsCert.SkipASN1(cryptobyte_asn1.INTEGER) { + return nil, errors.New("error reading tbsCertificate.serialNumber") + } + + var signatureAlgoID cryptobyte.String + var tag cryptobyte_asn1.Tag + // use ReadAnyElement to preserve tag and length octets + if !tbsCert.ReadAnyASN1Element(&signatureAlgoID, &tag) { + return nil, errors.New("error reading tbsCertificate.signature") + } + + return signatureAlgoID, nil +} + // Returns the algorithm field of the SubjectPublicKeyInfo of the certificate or an error // if the algorithm field could not be extracted. //