Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(742)

Side by Side Diff: content/renderer/webcrypto/webcrypto_impl_openssl.cc

Issue 23621050: Added WebCypto digest OpenSSL implementation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fixed minor rebase issues Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/renderer/webcrypto/webcrypto_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "content/renderer/webcrypto/webcrypto_impl.h" 5 #include "content/renderer/webcrypto/webcrypto_impl.h"
6 6
7 #include <vector> 7 #include <vector>
8 #include <openssl/evp.h>
8 #include <openssl/hmac.h> 9 #include <openssl/hmac.h>
9 #include <openssl/sha.h> 10 #include <openssl/sha.h>
10 11
11 #include "base/logging.h" 12 #include "base/logging.h"
12 #include "crypto/openssl_util.h" 13 #include "crypto/openssl_util.h"
13 #include "crypto/secure_util.h" 14 #include "crypto/secure_util.h"
14 #include "third_party/WebKit/public/platform/WebArrayBuffer.h" 15 #include "third_party/WebKit/public/platform/WebArrayBuffer.h"
15 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" 16 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h"
16 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" 17 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h"
17 18
(...skipping 28 matching lines...) Expand all
46 // Issue http://crbug.com/267888. 47 // Issue http://crbug.com/267888.
47 return false; 48 return false;
48 } 49 }
49 50
50 bool WebCryptoImpl::DecryptInternal( 51 bool WebCryptoImpl::DecryptInternal(
51 const WebKit::WebCryptoAlgorithm& algorithm, 52 const WebKit::WebCryptoAlgorithm& algorithm,
52 const WebKit::WebCryptoKey& key, 53 const WebKit::WebCryptoKey& key,
53 const unsigned char* data, 54 const unsigned char* data,
54 unsigned data_size, 55 unsigned data_size,
55 WebKit::WebArrayBuffer* buffer) { 56 WebKit::WebArrayBuffer* buffer) {
56 return false;
57 }
58
59 bool WebCryptoImpl::DigestInternal(
60 const WebKit::WebCryptoAlgorithm& algorithm,
61 const unsigned char* data,
62 unsigned data_size,
63 WebKit::WebArrayBuffer* buffer) {
64 // TODO(padolph): Placeholder for OpenSSL implementation. 57 // TODO(padolph): Placeholder for OpenSSL implementation.
65 // Issue http://crbug.com/267888. 58 // Issue http://crbug.com/267888.
66 return false; 59 return false;
67 } 60 }
68 61
62 bool WebCryptoImpl::DigestInternal(const WebKit::WebCryptoAlgorithm& algorithm,
63 const unsigned char* data,
64 unsigned data_size,
65 WebKit::WebArrayBuffer* buffer) {
66
67 crypto::OpenSSLErrStackTracer(FROM_HERE);
68
69 const EVP_MD* digest_algorithm;
70 switch (algorithm.id()) {
71 case WebKit::WebCryptoAlgorithmIdSha1:
72 digest_algorithm = EVP_sha1();
73 break;
74 case WebKit::WebCryptoAlgorithmIdSha224:
75 digest_algorithm = EVP_sha224();
76 break;
77 case WebKit::WebCryptoAlgorithmIdSha256:
78 digest_algorithm = EVP_sha256();
79 break;
80 case WebKit::WebCryptoAlgorithmIdSha384:
81 digest_algorithm = EVP_sha384();
82 break;
83 case WebKit::WebCryptoAlgorithmIdSha512:
84 digest_algorithm = EVP_sha512();
85 break;
86 default:
87 // Not a digest algorithm.
88 return false;
89 }
90
91 crypto::ScopedOpenSSL<EVP_MD_CTX, EVP_MD_CTX_destroy> digest_context(
92 EVP_MD_CTX_create());
93 if (!digest_context.get()) {
94 return false;
95 }
96
97 if (!EVP_DigestInit_ex(digest_context.get(), digest_algorithm, NULL) ||
98 !EVP_DigestUpdate(digest_context.get(), data, data_size)) {
99 return false;
100 }
101
102 const int hash_expected_size = EVP_MD_CTX_size(digest_context.get());
103 if (hash_expected_size <= 0) {
104 return false;
105 }
106 DCHECK_LE(hash_expected_size, EVP_MAX_MD_SIZE);
107
108 *buffer = WebKit::WebArrayBuffer::create(hash_expected_size, 1);
109 unsigned char* const hash_buffer =
110 reinterpret_cast<unsigned char* const>(buffer->data());
111
112 unsigned hash_size = 0;
113 if (!EVP_DigestFinal_ex(digest_context.get(), hash_buffer, &hash_size) ||
114 static_cast<int>(hash_size) != hash_expected_size) {
115 buffer->reset();
116 return false;
117 }
118
119 return true;
120 }
121
69 bool WebCryptoImpl::ImportKeyInternal( 122 bool WebCryptoImpl::ImportKeyInternal(
70 WebKit::WebCryptoKeyFormat format, 123 WebKit::WebCryptoKeyFormat format,
71 const unsigned char* key_data, 124 const unsigned char* key_data,
72 unsigned key_data_size, 125 unsigned key_data_size,
73 const WebKit::WebCryptoAlgorithm& algorithm, 126 const WebKit::WebCryptoAlgorithm& algorithm,
74 WebKit::WebCryptoKeyUsageMask /*usage_mask*/, 127 WebKit::WebCryptoKeyUsageMask /*usage_mask*/,
75 scoped_ptr<WebKit::WebCryptoKeyHandle>* handle, 128 scoped_ptr<WebKit::WebCryptoKeyHandle>* handle,
76 WebKit::WebCryptoKeyType* type) { 129 WebKit::WebCryptoKeyType* type) {
77 130
78 // TODO(padolph): Support all relevant alg types and then remove this gate. 131 // TODO(padolph): Support all relevant alg types and then remove this gate.
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 278
226 break; 279 break;
227 } 280 }
228 default: 281 default:
229 return false; 282 return false;
230 } 283 }
231 return true; 284 return true;
232 } 285 }
233 286
234 } // namespace content 287 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/renderer/webcrypto/webcrypto_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698