| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | |
| 3 * | |
| 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 | |
| 6 * tree. An additional intellectual property rights grant can be found | |
| 7 * in the file PATENTS. All contributing project authors may | |
| 8 * be found in the AUTHORS file in the root of the source tree. | |
| 9 */ | |
| 10 | |
| 11 #include "webrtc/base/openssldigest.h" | |
| 12 | |
| 13 #include "webrtc/base/checks.h" | |
| 14 #include "webrtc/base/openssl.h" | |
| 15 | |
| 16 namespace rtc { | |
| 17 | |
| 18 OpenSSLDigest::OpenSSLDigest(const std::string& algorithm) { | |
| 19 EVP_MD_CTX_init(&ctx_); | |
| 20 if (GetDigestEVP(algorithm, &md_)) { | |
| 21 EVP_DigestInit_ex(&ctx_, md_, nullptr); | |
| 22 } else { | |
| 23 md_ = nullptr; | |
| 24 } | |
| 25 } | |
| 26 | |
| 27 OpenSSLDigest::~OpenSSLDigest() { | |
| 28 EVP_MD_CTX_cleanup(&ctx_); | |
| 29 } | |
| 30 | |
| 31 size_t OpenSSLDigest::Size() const { | |
| 32 if (!md_) { | |
| 33 return 0; | |
| 34 } | |
| 35 return EVP_MD_size(md_); | |
| 36 } | |
| 37 | |
| 38 void OpenSSLDigest::Update(const void* buf, size_t len) { | |
| 39 if (!md_) { | |
| 40 return; | |
| 41 } | |
| 42 EVP_DigestUpdate(&ctx_, buf, len); | |
| 43 } | |
| 44 | |
| 45 size_t OpenSSLDigest::Finish(void* buf, size_t len) { | |
| 46 if (!md_ || len < Size()) { | |
| 47 return 0; | |
| 48 } | |
| 49 unsigned int md_len; | |
| 50 EVP_DigestFinal_ex(&ctx_, static_cast<unsigned char*>(buf), &md_len); | |
| 51 EVP_DigestInit_ex(&ctx_, md_, nullptr); // prepare for future Update()s | |
| 52 RTC_DCHECK(md_len == Size()); | |
| 53 return md_len; | |
| 54 } | |
| 55 | |
| 56 bool OpenSSLDigest::GetDigestEVP(const std::string& algorithm, | |
| 57 const EVP_MD** mdp) { | |
| 58 const EVP_MD* md; | |
| 59 if (algorithm == DIGEST_MD5) { | |
| 60 md = EVP_md5(); | |
| 61 } else if (algorithm == DIGEST_SHA_1) { | |
| 62 md = EVP_sha1(); | |
| 63 } else if (algorithm == DIGEST_SHA_224) { | |
| 64 md = EVP_sha224(); | |
| 65 } else if (algorithm == DIGEST_SHA_256) { | |
| 66 md = EVP_sha256(); | |
| 67 } else if (algorithm == DIGEST_SHA_384) { | |
| 68 md = EVP_sha384(); | |
| 69 } else if (algorithm == DIGEST_SHA_512) { | |
| 70 md = EVP_sha512(); | |
| 71 } else { | |
| 72 return false; | |
| 73 } | |
| 74 | |
| 75 // Can't happen | |
| 76 RTC_DCHECK(EVP_MD_size(md) >= 16); | |
| 77 *mdp = md; | |
| 78 return true; | |
| 79 } | |
| 80 | |
| 81 bool OpenSSLDigest::GetDigestName(const EVP_MD* md, | |
| 82 std::string* algorithm) { | |
| 83 RTC_DCHECK(md != nullptr); | |
| 84 RTC_DCHECK(algorithm != nullptr); | |
| 85 | |
| 86 int md_type = EVP_MD_type(md); | |
| 87 if (md_type == NID_md5) { | |
| 88 *algorithm = DIGEST_MD5; | |
| 89 } else if (md_type == NID_sha1) { | |
| 90 *algorithm = DIGEST_SHA_1; | |
| 91 } else if (md_type == NID_sha224) { | |
| 92 *algorithm = DIGEST_SHA_224; | |
| 93 } else if (md_type == NID_sha256) { | |
| 94 *algorithm = DIGEST_SHA_256; | |
| 95 } else if (md_type == NID_sha384) { | |
| 96 *algorithm = DIGEST_SHA_384; | |
| 97 } else if (md_type == NID_sha512) { | |
| 98 *algorithm = DIGEST_SHA_512; | |
| 99 } else { | |
| 100 algorithm->clear(); | |
| 101 return false; | |
| 102 } | |
| 103 | |
| 104 return true; | |
| 105 } | |
| 106 | |
| 107 bool OpenSSLDigest::GetDigestSize(const std::string& algorithm, | |
| 108 size_t* length) { | |
| 109 const EVP_MD *md; | |
| 110 if (!GetDigestEVP(algorithm, &md)) | |
| 111 return false; | |
| 112 | |
| 113 *length = EVP_MD_size(md); | |
| 114 return true; | |
| 115 } | |
| 116 | |
| 117 } // namespace rtc | |
| OLD | NEW |