| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 4  *  Use of this source code is governed by a BSD-style license | 
| 5  *  that can be found in the LICENSE file in the root of the source | 5  *  that can be found in the LICENSE file in the root of the source | 
| 6  *  tree. An additional intellectual property rights grant can be found | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| 11 // Handling of certificates and keypairs for SSLStreamAdapter's peer mode. | 11 // Handling of certificates and keypairs for SSLStreamAdapter's peer mode. | 
| 12 #include "webrtc/base/sslidentity.h" | 12 #include "webrtc/base/sslidentity.h" | 
| 13 | 13 | 
| 14 #include <ctime> | 14 #include <ctime> | 
| 15 #include <string> | 15 #include <string> | 
| 16 | 16 | 
| 17 #include "webrtc/base/base64.h" | 17 #include "webrtc/base/base64.h" | 
| 18 #include "webrtc/base/checks.h" | 18 #include "webrtc/base/checks.h" | 
| 19 #include "webrtc/base/logging.h" | 19 #include "webrtc/base/logging.h" | 
| 20 #include "webrtc/base/sslconfig.h" | 20 #include "webrtc/base/sslconfig.h" | 
|  | 21 #include "webrtc/base/sslfingerprint.h" | 
| 21 | 22 | 
| 22 #if SSL_USE_OPENSSL | 23 #if SSL_USE_OPENSSL | 
| 23 | 24 | 
| 24 #include "webrtc/base/opensslidentity.h" | 25 #include "webrtc/base/opensslidentity.h" | 
| 25 | 26 | 
| 26 #endif  // SSL_USE_OPENSSL | 27 #endif  // SSL_USE_OPENSSL | 
| 27 | 28 | 
| 28 namespace rtc { | 29 namespace rtc { | 
| 29 | 30 | 
| 30 const char kPemTypeCertificate[] = "CERTIFICATE"; | 31 const char kPemTypeCertificate[] = "CERTIFICATE"; | 
| 31 const char kPemTypeRsaPrivateKey[] = "RSA PRIVATE KEY"; | 32 const char kPemTypeRsaPrivateKey[] = "RSA PRIVATE KEY"; | 
| 32 const char kPemTypeEcPrivateKey[] = "EC PRIVATE KEY"; | 33 const char kPemTypeEcPrivateKey[] = "EC PRIVATE KEY"; | 
| 33 | 34 | 
|  | 35 SSLCertificateStats::SSLCertificateStats( | 
|  | 36     std::string&& fingerprint, | 
|  | 37     std::string&& fingerprint_algorithm, | 
|  | 38     std::string&& base64_certificate, | 
|  | 39     std::unique_ptr<SSLCertificateStats>&& issuer) | 
|  | 40     : fingerprint(std::move(fingerprint)), | 
|  | 41       fingerprint_algorithm(std::move(fingerprint_algorithm)), | 
|  | 42       base64_certificate(std::move(base64_certificate)), | 
|  | 43       issuer(std::move(issuer)) { | 
|  | 44 } | 
|  | 45 | 
|  | 46 SSLCertificateStats::~SSLCertificateStats() { | 
|  | 47 } | 
|  | 48 | 
|  | 49 std::unique_ptr<SSLCertificateStats> SSLCertificate::GetStats() const { | 
|  | 50   // We have a certificate and optionally a chain of certificates. This forms a | 
|  | 51   // linked list, starting with |this|, then the first element of |chain| and | 
|  | 52   // ending with the last element of |chain|. The "issuer" of a certificate is | 
|  | 53   // the next certificate in the chain. Stats are produced for each certificate | 
|  | 54   // in the list. Here, the "issuer" is the issuer's stats. | 
|  | 55   std::unique_ptr<SSLCertChain> chain = GetChain(); | 
|  | 56   std::unique_ptr<SSLCertificateStats> issuer; | 
|  | 57   if (chain) { | 
|  | 58     // The loop runs in reverse so that the |issuer| is known before the | 
|  | 59     // |cert|'s stats. | 
|  | 60     for (ptrdiff_t i = chain->GetSize() - 1; i >= 0; --i) { | 
|  | 61       const SSLCertificate* cert = &chain->Get(i); | 
|  | 62       issuer = cert->GetStats(std::move(issuer)); | 
|  | 63     } | 
|  | 64   } | 
|  | 65   return GetStats(std::move(issuer)); | 
|  | 66 } | 
|  | 67 | 
|  | 68 std::unique_ptr<SSLCertificateStats> SSLCertificate::GetStats( | 
|  | 69     std::unique_ptr<SSLCertificateStats> issuer) const { | 
|  | 70   // TODO(bemasc): Move this computation to a helper class that caches these | 
|  | 71   // values to reduce CPU use in |StatsCollector::GetStats|. This will require | 
|  | 72   // adding a fast |SSLCertificate::Equals| to detect certificate changes. | 
|  | 73   std::string digest_algorithm; | 
|  | 74   if (!GetSignatureDigestAlgorithm(&digest_algorithm)) | 
|  | 75     return nullptr; | 
|  | 76 | 
|  | 77   // |SSLFingerprint::Create| can fail if the algorithm returned by | 
|  | 78   // |SSLCertificate::GetSignatureDigestAlgorithm| is not supported by the | 
|  | 79   // implementation of |SSLCertificate::ComputeDigest|. This currently happens | 
|  | 80   // with MD5- and SHA-224-signed certificates when linked to libNSS. | 
|  | 81   std::unique_ptr<SSLFingerprint> ssl_fingerprint( | 
|  | 82       SSLFingerprint::Create(digest_algorithm, this)); | 
|  | 83   if (!ssl_fingerprint) | 
|  | 84     return nullptr; | 
|  | 85   std::string fingerprint = ssl_fingerprint->GetRfc4572Fingerprint(); | 
|  | 86 | 
|  | 87   Buffer der_buffer; | 
|  | 88   ToDER(&der_buffer); | 
|  | 89   std::string der_base64; | 
|  | 90   Base64::EncodeFromArray(der_buffer.data(), der_buffer.size(), &der_base64); | 
|  | 91 | 
|  | 92   return std::unique_ptr<SSLCertificateStats>(new SSLCertificateStats( | 
|  | 93       std::move(fingerprint), | 
|  | 94       std::move(digest_algorithm), | 
|  | 95       std::move(der_base64), | 
|  | 96       std::move(issuer))); | 
|  | 97 } | 
|  | 98 | 
| 34 KeyParams::KeyParams(KeyType key_type) { | 99 KeyParams::KeyParams(KeyType key_type) { | 
| 35   if (key_type == KT_ECDSA) { | 100   if (key_type == KT_ECDSA) { | 
| 36     type_ = KT_ECDSA; | 101     type_ = KT_ECDSA; | 
| 37     params_.curve = EC_NIST_P256; | 102     params_.curve = EC_NIST_P256; | 
| 38   } else if (key_type == KT_RSA) { | 103   } else if (key_type == KT_RSA) { | 
| 39     type_ = KT_RSA; | 104     type_ = KT_RSA; | 
| 40     params_.rsa.mod_size = kRsaDefaultModSize; | 105     params_.rsa.mod_size = kRsaDefaultModSize; | 
| 41     params_.rsa.pub_exp = kRsaDefaultExponent; | 106     params_.rsa.pub_exp = kRsaDefaultExponent; | 
| 42   } else { | 107   } else { | 
| 43     RTC_NOTREACHED(); | 108     RTC_NOTREACHED(); | 
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 265 | 330 | 
| 266   if (bytes_left != 1) { | 331   if (bytes_left != 1) { | 
| 267     // Now just Z should remain.  Its existence was asserted above. | 332     // Now just Z should remain.  Its existence was asserted above. | 
| 268     return -1; | 333     return -1; | 
| 269   } | 334   } | 
| 270 | 335 | 
| 271   return TmToSeconds(tm); | 336   return TmToSeconds(tm); | 
| 272 } | 337 } | 
| 273 | 338 | 
| 274 }  // namespace rtc | 339 }  // namespace rtc | 
| OLD | NEW | 
|---|