Skip to content

Commit cd8f3d3

Browse files
davidbenCQ bot account: commit-bot@chromium.org
authored and
CQ bot account: [email protected]
committed
Enforce the keyUsage extension in TLS 1.2 client certs.
I've left this independent of SSL_set_enforce_rsa_key_usage because client certificates in TLS always use the digitalSignature bit, RSA or otherwise, so it's less likely that someone has messed it up, unlike TLS 1.2 RSA server certificates. Update-Note: Client certificates which do not support the digitalSignature key usage will be rejected. They should either include that bit or omit the keyUsage extension. Bug: 349 Change-Id: I97bbf0c8e394f219ff75b686e0c14019f6d8c9a8 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/41664 Commit-Queue: David Benjamin <[email protected]> Reviewed-by: Adam Langley <[email protected]>
1 parent 72b095d commit cd8f3d3

File tree

3 files changed

+58
-12
lines changed

3 files changed

+58
-12
lines changed

ssl/handshake_client.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -1268,10 +1268,10 @@ static enum ssl_hs_wait_t do_send_client_key_exchange(SSL_HANDSHAKE *hs) {
12681268
uint32_t alg_k = hs->new_cipher->algorithm_mkey;
12691269
uint32_t alg_a = hs->new_cipher->algorithm_auth;
12701270
if (ssl_cipher_uses_certificate_auth(hs->new_cipher)) {
1271-
CRYPTO_BUFFER *leaf =
1271+
const CRYPTO_BUFFER *leaf =
12721272
sk_CRYPTO_BUFFER_value(hs->new_session->certs.get(), 0);
12731273
CBS leaf_cbs;
1274-
CBS_init(&leaf_cbs, CRYPTO_BUFFER_data(leaf), CRYPTO_BUFFER_len(leaf));
1274+
CRYPTO_BUFFER_init_CBS(leaf, &leaf_cbs);
12751275

12761276
// Check the key usage matches the cipher suite. We do this unconditionally
12771277
// for non-RSA certificates. In particular, it's needed to distinguish ECDH

ssl/handshake_server.cc

+9
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,15 @@ static enum ssl_hs_wait_t do_read_client_certificate_verify(SSL_HANDSHAKE *hs) {
14361436
return ssl_hs_error;
14371437
}
14381438

1439+
// The peer certificate must be valid for signing.
1440+
const CRYPTO_BUFFER *leaf =
1441+
sk_CRYPTO_BUFFER_value(hs->new_session->certs.get(), 0);
1442+
CBS leaf_cbs;
1443+
CRYPTO_BUFFER_init_CBS(leaf, &leaf_cbs);
1444+
if (!ssl_cert_check_key_usage(&leaf_cbs, key_usage_digital_signature)) {
1445+
return ssl_hs_error;
1446+
}
1447+
14391448
CBS certificate_verify = msg.body, signature;
14401449

14411450
// Determine the signature algorithm.

ssl/test/runner/runner.go

+47-10
Original file line numberDiff line numberDiff line change
@@ -14627,7 +14627,7 @@ func addECDSAKeyUsageTests() {
1462714627

1462814628
testCases = append(testCases, testCase{
1462914629
testType: clientTest,
14630-
name: "ECDSAKeyUsage-" + ver.name,
14630+
name: "ECDSAKeyUsage-Client-" + ver.name,
1463114631
config: Config{
1463214632
MinVersion: ver.version,
1463314633
MaxVersion: ver.version,
@@ -14636,6 +14636,19 @@ func addECDSAKeyUsageTests() {
1463614636
shouldFail: true,
1463714637
expectedError: ":KEY_USAGE_BIT_INCORRECT:",
1463814638
})
14639+
14640+
testCases = append(testCases, testCase{
14641+
testType: serverTest,
14642+
name: "ECDSAKeyUsage-Server-" + ver.name,
14643+
config: Config{
14644+
MinVersion: ver.version,
14645+
MaxVersion: ver.version,
14646+
Certificates: []Certificate{cert},
14647+
},
14648+
flags: []string{"-require-any-client-certificate"},
14649+
shouldFail: true,
14650+
expectedError: ":KEY_USAGE_BIT_INCORRECT:",
14651+
})
1463914652
}
1464014653
}
1464114654

@@ -14705,7 +14718,7 @@ func addRSAKeyUsageTests() {
1470514718
for _, ver := range tlsVersions {
1470614719
testCases = append(testCases, testCase{
1470714720
testType: clientTest,
14708-
name: "RSAKeyUsage-WantSignature-GotEncipherment-" + ver.name,
14721+
name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-" + ver.name,
1470914722
config: Config{
1471014723
MinVersion: ver.version,
1471114724
MaxVersion: ver.version,
@@ -14721,7 +14734,7 @@ func addRSAKeyUsageTests() {
1472114734

1472214735
testCases = append(testCases, testCase{
1472314736
testType: clientTest,
14724-
name: "RSAKeyUsage-WantSignature-GotSignature-" + ver.name,
14737+
name: "RSAKeyUsage-Client-WantSignature-GotSignature-" + ver.name,
1472514738
config: Config{
1472614739
MinVersion: ver.version,
1472714740
MaxVersion: ver.version,
@@ -14737,7 +14750,7 @@ func addRSAKeyUsageTests() {
1473714750
if ver.version < VersionTLS13 {
1473814751
testCases = append(testCases, testCase{
1473914752
testType: clientTest,
14740-
name: "RSAKeyUsage-WantEncipherment-GotEncipherment" + ver.name,
14753+
name: "RSAKeyUsage-Client-WantEncipherment-GotEncipherment" + ver.name,
1474114754
config: Config{
1474214755
MinVersion: ver.version,
1474314756
MaxVersion: ver.version,
@@ -14751,7 +14764,7 @@ func addRSAKeyUsageTests() {
1475114764

1475214765
testCases = append(testCases, testCase{
1475314766
testType: clientTest,
14754-
name: "RSAKeyUsage-WantEncipherment-GotSignature-" + ver.name,
14767+
name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-" + ver.name,
1475514768
config: Config{
1475614769
MinVersion: ver.version,
1475714770
MaxVersion: ver.version,
@@ -14768,7 +14781,7 @@ func addRSAKeyUsageTests() {
1476814781
// In 1.2 and below, we should not enforce without the enforce-rsa-key-usage flag.
1476914782
testCases = append(testCases, testCase{
1477014783
testType: clientTest,
14771-
name: "RSAKeyUsage-WantSignature-GotEncipherment-Unenforced" + ver.name,
14784+
name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-Unenforced" + ver.name,
1477214785
config: Config{
1477314786
MinVersion: ver.version,
1477414787
MaxVersion: ver.version,
@@ -14779,22 +14792,21 @@ func addRSAKeyUsageTests() {
1477914792

1478014793
testCases = append(testCases, testCase{
1478114794
testType: clientTest,
14782-
name: "RSAKeyUsage-WantEncipherment-GotSignature-Unenforced" + ver.name,
14795+
name: "RSAKeyUsage-Client-WantEncipherment-GotSignature-Unenforced" + ver.name,
1478314796
config: Config{
1478414797
MinVersion: ver.version,
1478514798
MaxVersion: ver.version,
1478614799
Certificates: []Certificate{encCert},
1478714800
CipherSuites: dsSuites,
1478814801
},
1478914802
})
14790-
1479114803
}
1479214804

1479314805
if ver.version >= VersionTLS13 {
1479414806
// In 1.3 and above, we enforce keyUsage even without the flag.
1479514807
testCases = append(testCases, testCase{
1479614808
testType: clientTest,
14797-
name: "RSAKeyUsage-WantSignature-GotEncipherment-Enforced" + ver.name,
14809+
name: "RSAKeyUsage-Client-WantSignature-GotEncipherment-Enforced" + ver.name,
1479814810
config: Config{
1479914811
MinVersion: ver.version,
1480014812
MaxVersion: ver.version,
@@ -14804,8 +14816,33 @@ func addRSAKeyUsageTests() {
1480414816
shouldFail: true,
1480514817
expectedError: ":KEY_USAGE_BIT_INCORRECT:",
1480614818
})
14807-
1480814819
}
14820+
14821+
// The server only uses signatures and always enforces it.
14822+
testCases = append(testCases, testCase{
14823+
testType: serverTest,
14824+
name: "RSAKeyUsage-Server-WantSignature-GotEncipherment-" + ver.name,
14825+
config: Config{
14826+
MinVersion: ver.version,
14827+
MaxVersion: ver.version,
14828+
Certificates: []Certificate{encCert},
14829+
},
14830+
shouldFail: true,
14831+
expectedError: ":KEY_USAGE_BIT_INCORRECT:",
14832+
flags: []string{"-require-any-client-certificate"},
14833+
})
14834+
14835+
testCases = append(testCases, testCase{
14836+
testType: serverTest,
14837+
name: "RSAKeyUsage-Server-WantSignature-GotSignature-" + ver.name,
14838+
config: Config{
14839+
MinVersion: ver.version,
14840+
MaxVersion: ver.version,
14841+
Certificates: []Certificate{dsCert},
14842+
},
14843+
flags: []string{"-require-any-client-certificate"},
14844+
})
14845+
1480914846
}
1481014847
}
1481114848

0 commit comments

Comments
 (0)