Changeset View
Changeset View
Standalone View
Standalone View
protocols/jabber/libjingle/talk/base/openssldigest.cc
Show All 26 Lines | |||||
27 | 27 | | |||
28 | #include "talk/base/openssldigest.h" | 28 | #include "talk/base/openssldigest.h" | ||
29 | 29 | | |||
30 | #include "talk/base/common.h" | 30 | #include "talk/base/common.h" | ||
31 | 31 | | |||
32 | namespace talk_base { | 32 | namespace talk_base { | ||
33 | 33 | | |||
34 | OpenSSLDigest::OpenSSLDigest(const std::string& algorithm) { | 34 | OpenSSLDigest::OpenSSLDigest(const std::string& algorithm) { | ||
35 | EVP_MD_CTX_init(&ctx_); | 35 | EVP_MD_CTX_init(ctx_); | ||
36 | if (GetDigestEVP(algorithm, &md_)) { | 36 | if (GetDigestEVP(algorithm, &md_)) { | ||
37 | EVP_DigestInit_ex(&ctx_, md_, NULL); | 37 | EVP_DigestInit_ex(ctx_, md_, NULL); | ||
38 | } else { | 38 | } else { | ||
39 | md_ = NULL; | 39 | md_ = NULL; | ||
40 | } | 40 | } | ||
41 | } | 41 | } | ||
42 | 42 | | |||
43 | OpenSSLDigest::~OpenSSLDigest() { | 43 | OpenSSLDigest::~OpenSSLDigest() { | ||
44 | EVP_MD_CTX_cleanup(&ctx_); | 44 | EVP_MD_CTX_destroy(ctx_); | ||
45 | } | 45 | } | ||
46 | 46 | | |||
47 | size_t OpenSSLDigest::Size() const { | 47 | size_t OpenSSLDigest::Size() const { | ||
48 | if (!md_) { | 48 | if (!md_) { | ||
49 | return 0; | 49 | return 0; | ||
50 | } | 50 | } | ||
51 | return EVP_MD_size(md_); | 51 | return EVP_MD_size(md_); | ||
52 | } | 52 | } | ||
53 | 53 | | |||
54 | void OpenSSLDigest::Update(const void* buf, size_t len) { | 54 | void OpenSSLDigest::Update(const void* buf, size_t len) { | ||
55 | if (!md_) { | 55 | if (!md_) { | ||
56 | return; | 56 | return; | ||
57 | } | 57 | } | ||
58 | EVP_DigestUpdate(&ctx_, buf, len); | 58 | EVP_DigestUpdate(ctx_, buf, len); | ||
59 | } | 59 | } | ||
60 | 60 | | |||
61 | size_t OpenSSLDigest::Finish(void* buf, size_t len) { | 61 | size_t OpenSSLDigest::Finish(void* buf, size_t len) { | ||
62 | if (!md_ || len < Size()) { | 62 | if (!md_ || len < Size()) { | ||
63 | return 0; | 63 | return 0; | ||
64 | } | 64 | } | ||
65 | unsigned int md_len; | 65 | unsigned int md_len; | ||
66 | EVP_DigestFinal_ex(&ctx_, static_cast<unsigned char*>(buf), &md_len); | 66 | EVP_DigestFinal_ex(ctx_, static_cast<unsigned char*>(buf), &md_len); | ||
67 | EVP_DigestInit_ex(&ctx_, md_, NULL); // prepare for future Update()s | 67 | EVP_DigestInit_ex(ctx_, md_, NULL); // prepare for future Update()s | ||
68 | ASSERT(md_len == Size()); | 68 | ASSERT(md_len == Size()); | ||
69 | return md_len; | 69 | return md_len; | ||
70 | } | 70 | } | ||
71 | 71 | | |||
72 | bool OpenSSLDigest::GetDigestEVP(const std::string& algorithm, | 72 | bool OpenSSLDigest::GetDigestEVP(const std::string& algorithm, | ||
73 | const EVP_MD** mdp) { | 73 | const EVP_MD** mdp) { | ||
74 | const EVP_MD* md; | 74 | const EVP_MD* md; | ||
75 | if (algorithm == DIGEST_MD5) { | 75 | if (algorithm == DIGEST_MD5) { | ||
Show All 34 Lines |