| // Copyright 2025 The BoringSSL Authors |
| // |
| // 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 |
| // |
| // https://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. |
| |
| package runner |
| |
| import ( |
| "crypto/x509" |
| ) |
| |
| func addECDSAKeyUsageTests() { |
| cert := rootCA.Issue(X509Info{ |
| PrivateKey: &ecdsaP256Key, |
| DNSNames: []string{"test"}, |
| // An ECC certificate with only the keyAgreement key usage may |
| // be used with ECDH, but not ECDSA. |
| KeyUsage: x509.KeyUsageKeyAgreement, |
| }).ToCredential() |
| |
| for _, ver := range tlsVersions { |
| if ver.version < VersionTLS12 { |
| continue |
| } |
| |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "ECDSAKeyUsage-Client-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &cert, |
| }, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| }) |
| |
| testCases = append(testCases, testCase{ |
| testType: serverTest, |
| name: "ECDSAKeyUsage-Server-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &cert, |
| }, |
| flags: []string{"-require-any-client-certificate"}, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| }) |
| } |
| } |
| |
| func addRSAKeyUsageTests() { |
| dsCert := rootCA.Issue(X509Info{ |
| PrivateKey: &rsa2048Key, |
| DNSNames: []string{"test"}, |
| KeyUsage: x509.KeyUsageDigitalSignature, |
| }).ToCredential() |
| encCert := rootCA.Issue(X509Info{ |
| PrivateKey: &rsa2048Key, |
| DNSNames: []string{"test"}, |
| KeyUsage: x509.KeyUsageKeyEncipherment, |
| }).ToCredential() |
| |
| dsSuites := []uint16{ |
| TLS_AES_128_GCM_SHA256, |
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, |
| TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, |
| } |
| encSuites := []uint16{ |
| TLS_RSA_WITH_AES_128_GCM_SHA256, |
| TLS_RSA_WITH_AES_128_CBC_SHA, |
| } |
| |
| for _, ver := range tlsVersions { |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &encCert, |
| CipherSuites: dsSuites, |
| }, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| }) |
| |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantSignature-GotSignature-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &dsCert, |
| CipherSuites: dsSuites, |
| }, |
| }) |
| |
| // TLS 1.3 removes the encipherment suites. |
| if ver.version < VersionTLS13 { |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantEncipherment-GotEncipherment" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &encCert, |
| CipherSuites: encSuites, |
| }, |
| }) |
| |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &dsCert, |
| CipherSuites: encSuites, |
| }, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| }) |
| |
| // In 1.2 and below, we should not enforce without the enforce-rsa-key-usage flag. |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-Unenforced-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &dsCert, |
| CipherSuites: encSuites, |
| }, |
| flags: []string{"-expect-key-usage-invalid", "-ignore-rsa-key-usage"}, |
| }) |
| |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-Unenforced-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &encCert, |
| CipherSuites: dsSuites, |
| }, |
| flags: []string{"-expect-key-usage-invalid", "-ignore-rsa-key-usage"}, |
| }) |
| } |
| |
| if ver.version >= VersionTLS13 { |
| // In 1.3 and above, we enforce keyUsage even when disabled. |
| testCases = append(testCases, testCase{ |
| testType: clientTest, |
| name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-AlwaysEnforced-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &encCert, |
| CipherSuites: dsSuites, |
| }, |
| flags: []string{"-ignore-rsa-key-usage"}, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| }) |
| } |
| |
| // The server only uses signatures and always enforces it. |
| testCases = append(testCases, testCase{ |
| testType: serverTest, |
| name: "RSAKeyUsage-Server-WantSignature-GotEncipherment-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &encCert, |
| }, |
| shouldFail: true, |
| expectedError: ":KEY_USAGE_BIT_INCORRECT:", |
| flags: []string{"-require-any-client-certificate"}, |
| }) |
| |
| testCases = append(testCases, testCase{ |
| testType: serverTest, |
| name: "RSAKeyUsage-Server-WantSignature-GotSignature-" + ver.name, |
| config: Config{ |
| MinVersion: ver.version, |
| MaxVersion: ver.version, |
| Credential: &dsCert, |
| }, |
| flags: []string{"-require-any-client-certificate"}, |
| }) |
| |
| } |
| } |