Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/base/x509_certificate.h" | 5 #include "net/base/x509_certificate.h" |
| 6 | 6 |
| 7 #include <openssl/asn1.h> | 7 #include <openssl/asn1.h> |
| 8 #include <openssl/crypto.h> | 8 #include <openssl/crypto.h> |
| 9 #include <openssl/obj_mac.h> | 9 #include <openssl/obj_mac.h> |
| 10 #include <openssl/pem.h> | 10 #include <openssl/pem.h> |
| 11 #include <openssl/pkcs7.h> | 11 #include <openssl/pkcs7.h> |
| 12 #include <openssl/sha.h> | 12 #include <openssl/sha.h> |
| 13 #include <openssl/ssl.h> | 13 #include <openssl/ssl.h> |
| 14 #include <openssl/x509v3.h> | 14 #include <openssl/x509v3.h> |
| 15 | 15 |
| 16 #include "base/memory/singleton.h" | 16 #include "base/memory/singleton.h" |
| 17 #include "base/pickle.h" | 17 #include "base/pickle.h" |
| 18 #include "base/sha1.h" | 18 #include "base/sha1.h" |
| 19 #include "base/string_number_conversions.h" | 19 #include "base/string_number_conversions.h" |
| 20 #include "base/string_util.h" | 20 #include "base/string_util.h" |
| 21 #include "crypto/openssl_util.h" | 21 #include "crypto/openssl_util.h" |
| 22 #include "net/base/net_errors.h" | 22 #include "net/base/net_errors.h" |
| 23 #include "net/base/net_util.h" | 23 #include "net/base/net_util.h" |
| 24 #include "net/base/ssl_cert_request_info.h" | |
| 25 #include "net/base/x509_cert_types.h" | |
| 24 #include "net/base/x509_util_openssl.h" | 26 #include "net/base/x509_util_openssl.h" |
| 25 | 27 |
| 26 #if defined(OS_ANDROID) | 28 #if defined(OS_ANDROID) |
| 27 #include "base/logging.h" | 29 #include "base/logging.h" |
| 28 #include "net/android/network_library.h" | 30 #include "net/android/network_library.h" |
| 29 #endif | 31 #endif |
| 30 | 32 |
| 31 namespace net { | 33 namespace net { |
| 32 | 34 |
| 33 namespace { | 35 namespace { |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 464 *type = kPublicKeyTypeECDSA; | 466 *type = kPublicKeyTypeECDSA; |
| 465 *size_bits = EVP_PKEY_size(key); | 467 *size_bits = EVP_PKEY_size(key); |
| 466 break; | 468 break; |
| 467 case EVP_PKEY_DH: | 469 case EVP_PKEY_DH: |
| 468 *type = kPublicKeyTypeDH; | 470 *type = kPublicKeyTypeDH; |
| 469 *size_bits = EVP_PKEY_size(key) * 8; | 471 *size_bits = EVP_PKEY_size(key) * 8; |
| 470 break; | 472 break; |
| 471 } | 473 } |
| 472 } | 474 } |
| 473 | 475 |
| 476 bool X509Certificate::IsValidClientCertificate( | |
| 477 const SSLCertRequestInfo& cert_info) { | |
| 478 | |
| 479 bool cert_still_valid = true; | |
| 480 DCHECK(cert_info.no_client_certs == true); | |
| 481 | |
| 482 // TODO(digit): Check certificate authorities. | |
| 483 // It's unclear what the best way to do this is, i.e. the specication | |
| 484 // states that about the "certificate_authorities" field of a | |
| 485 // CertificateRequest message: | |
| 486 // | |
| 487 // A list of the distinguished names of acceptable certificate | |
| 488 // authorities. These distinguished names may specify a desired | |
| 489 // distinguished name for a root CA or for a subordinate CA; | |
| 490 // thus, this message can be used both to describe known roots | |
| 491 // and a desired authorization space. | |
| 492 // | |
| 493 // The "authorization space" seems to indicate that each listed | |
| 494 // distinguished name may only include a small set of strings that | |
| 495 // need to be matched against those in the certificate chain. | |
| 496 // | |
| 497 // For now, ignore this step, and assume that the server will | |
| 498 // perform the verification itself. | |
| 499 // | |
| 500 | |
| 501 // Check the key type | |
| 502 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> scoped_key( | |
| 503 X509_get_pubkey(cert_handle_)); | |
| 504 if (!scoped_key.get()) | |
| 505 return false; | |
| 506 | |
| 507 SSLClientCertType key_type; | |
| 508 switch (scoped_key.get()->type) { | |
| 509 case EVP_PKEY_RSA: | |
| 510 key_type = CLIENT_CERT_RSA_SIGN; | |
| 511 break; | |
| 512 #if 0 | |
| 513 // TODO(digit): Add CLIENT_CERT_DSA_SIGN to SSLClientCertType. | |
| 514 case EVP_PKEY_DSA: | |
| 515 key_type = CLIENT_CERT_DSA_SIGN; | |
| 516 break; | |
| 517 #endif | |
|
Ryan Sleevi
2012/12/11 21:30:24
While NACKed, I don't think we should add unreacha
digit1
2012/12/11 23:05:31
Thanks, I'll remove the #if .. #endif block. A bug
| |
| 518 case EVP_PKEY_EC: | |
| 519 key_type = CLIENT_CERT_ECDSA_SIGN; | |
| 520 break; | |
| 521 default: | |
| 522 // Unknown key type | |
| 523 return false; | |
| 524 } | |
| 525 | |
| 526 cert_still_valid = false; | |
| 527 for (size_t n = 0; n < cert_info.valid_key_types.size(); ++n) { | |
| 528 if (cert_info.valid_key_types[n] == key_type) { | |
| 529 cert_still_valid = true; | |
| 530 break; | |
| 531 } | |
| 532 } | |
| 533 | |
| 534 return cert_still_valid; | |
| 535 } | |
| 536 | |
| 474 } // namespace net | 537 } // namespace net |
| OLD | NEW |