| // 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:", | |
| }) | |
| } | |
| // The server expects signatures from the client 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"}, | |
| }) | |
| } | |
| } |