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

Side by Side Diff: content/child/webcrypto/platform_crypto_nss.cc

Issue 200763005: Support for the new WebCrypto digest by chunks API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated return param of FinishWithWebArrayAndStatus Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/child/webcrypto/platform_crypto.h" 5 #include "content/child/webcrypto/platform_crypto.h"
6 6
7 #include <cryptohi.h> 7 #include <cryptohi.h>
8 #include <pk11pub.h> 8 #include <pk11pub.h>
9 #include <secerr.h> 9 #include <secerr.h>
10 #include <sechash.h> 10 #include <sechash.h>
11 #include <secoid.h> 11 #include <secoid.h>
12 12
13 #include <vector> 13 #include <vector>
14 14
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/memory/scoped_ptr.h"
17 #include "content/child/webcrypto/crypto_data.h" 18 #include "content/child/webcrypto/crypto_data.h"
18 #include "content/child/webcrypto/status.h" 19 #include "content/child/webcrypto/status.h"
19 #include "content/child/webcrypto/webcrypto_util.h" 20 #include "content/child/webcrypto/webcrypto_util.h"
20 #include "crypto/nss_util.h" 21 #include "crypto/nss_util.h"
21 #include "crypto/scoped_nss_types.h" 22 #include "crypto/scoped_nss_types.h"
22 #include "third_party/WebKit/public/platform/WebArrayBuffer.h" 23 #include "third_party/WebKit/public/platform/WebArrayBuffer.h"
23 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h" 24 #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h"
24 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h" 25 #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h"
25 #include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h" 26 #include "third_party/WebKit/public/platform/WebCryptoKeyAlgorithm.h"
26 27
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 SECITEM_FreeItem(&out->prime1, PR_FALSE); 648 SECITEM_FreeItem(&out->prime1, PR_FALSE);
648 SECITEM_FreeItem(&out->prime2, PR_FALSE); 649 SECITEM_FreeItem(&out->prime2, PR_FALSE);
649 SECITEM_FreeItem(&out->exponent1, PR_FALSE); 650 SECITEM_FreeItem(&out->exponent1, PR_FALSE);
650 SECITEM_FreeItem(&out->exponent2, PR_FALSE); 651 SECITEM_FreeItem(&out->exponent2, PR_FALSE);
651 SECITEM_FreeItem(&out->coefficient, PR_FALSE); 652 SECITEM_FreeItem(&out->coefficient, PR_FALSE);
652 } 653 }
653 }; 654 };
654 655
655 } // namespace 656 } // namespace
656 657
658 class DigestorNSS : public blink::WebCryptoDigestor {
659 public:
660 explicit DigestorNSS(blink::WebCryptoAlgorithmId algorithm_id)
661 : hash_context_(NULL), algorithm_id_(algorithm_id) {}
662
663 virtual ~DigestorNSS() OVERRIDE {
eroman 2014/03/26 01:43:54 no need for override here, suggest removing (in pr
jww 2014/03/26 18:49:40 Done.
664 if (!hash_context_)
665 return;
666
667 HASH_Destroy(hash_context_);
668 hash_context_ = NULL;
669 }
670
671 virtual bool consume(const unsigned char* data, unsigned int size) {
672 return ConsumeWithStatus(data, size).IsSuccess();
673 }
674
675 Status ConsumeWithStatus(const unsigned char* data, unsigned int size) {
676 // Initialize everything if the object hasn't been initialized yet.
677 if (!hash_context_) {
678 Status error = Init();
679 if (!error.IsSuccess())
680 return error;
681 }
682
683 HASH_Update(hash_context_, data, size);
684
685 return Status::Success();
686 }
687
688 virtual bool finish(unsigned char*& result_data,
689 unsigned int& result_data_size) {
690 Status error = FinishInternal(result_, &result_data_size);
691 if (!error.IsSuccess())
692 return false;
693 result_data = result_;
694 return true;
695 }
696
697 Status FinishWithWebArrayAndStatus(blink::WebArrayBuffer* result) {
698 if (!hash_context_)
699 return Status::ErrorUnexpected();
700
701 unsigned int result_length = HASH_ResultLenContext(hash_context_);
702 *result = blink::WebArrayBuffer::create(result_length, 1);
703 unsigned char* digest = reinterpret_cast<unsigned char*>(result->data());
704 unsigned int digest_size; // ignored
705 return FinishInternal(digest, &digest_size);
706 }
707
708 private:
709 HASHContext* hash_context_;
eroman 2014/03/26 01:43:54 [style] members go after functions. Move all the m
jww 2014/03/26 18:49:40 Done.
710 blink::WebCryptoAlgorithmId algorithm_id_;
711 unsigned char result_[HASH_LENGTH_MAX];
712
713 Status Init() {
714 HASH_HashType hash_type = WebCryptoAlgorithmToNSSHashType(algorithm_id_);
715
716 if (hash_type == HASH_AlgNULL)
717 return Status::ErrorUnsupported();
718
719 hash_context_ = HASH_Create(hash_type);
720 if (!hash_context_)
721 return Status::Error();
722
723 HASH_Begin(hash_context_);
724
725 return Status::Success();
726 }
727
728 Status FinishInternal(unsigned char* result, unsigned int* result_size) {
729 if (!hash_context_) {
730 Status error = Init();
731 if (!error.IsSuccess())
732 return error;
733 }
734
735 unsigned int hash_result_length = HASH_ResultLenContext(hash_context_);
736 DCHECK_LE(hash_result_length, static_cast<size_t>(HASH_LENGTH_MAX));
737
738 HASH_End(hash_context_, result, result_size, hash_result_length);
739
740 if (*result_size != hash_result_length)
741 return Status::ErrorUnexpected();
742 return Status::Success();
743 }
744 };
745
657 Status ImportKeyRaw(const blink::WebCryptoAlgorithm& algorithm, 746 Status ImportKeyRaw(const blink::WebCryptoAlgorithm& algorithm,
658 const CryptoData& key_data, 747 const CryptoData& key_data,
659 bool extractable, 748 bool extractable,
660 blink::WebCryptoKeyUsageMask usage_mask, 749 blink::WebCryptoKeyUsageMask usage_mask,
661 blink::WebCryptoKey* key) { 750 blink::WebCryptoKey* key) {
662 751
663 DCHECK(!algorithm.isNull()); 752 DCHECK(!algorithm.isNull());
664 753
665 CK_MECHANISM_TYPE mechanism; 754 CK_MECHANISM_TYPE mechanism;
666 CK_FLAGS flags; 755 CK_FLAGS flags;
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
1170 usage_mask); 1259 usage_mask);
1171 1260
1172 return Status::Success(); 1261 return Status::Success();
1173 } 1262 }
1174 1263
1175 void Init() { crypto::EnsureNSSInit(); } 1264 void Init() { crypto::EnsureNSSInit(); }
1176 1265
1177 Status DigestSha(blink::WebCryptoAlgorithmId algorithm, 1266 Status DigestSha(blink::WebCryptoAlgorithmId algorithm,
1178 const CryptoData& data, 1267 const CryptoData& data,
1179 blink::WebArrayBuffer* buffer) { 1268 blink::WebArrayBuffer* buffer) {
1180 HASH_HashType hash_type = WebCryptoAlgorithmToNSSHashType(algorithm); 1269 DigestorNSS digestor(algorithm);
1181 if (hash_type == HASH_AlgNULL) 1270 Status error = digestor.ConsumeWithStatus(data.bytes(), data.byte_length());
1182 return Status::ErrorUnsupported(); 1271 if (!error.IsSuccess())
1272 return error;
1273 return digestor.FinishWithWebArrayAndStatus(buffer);
1274 }
1183 1275
1184 HASHContext* context = HASH_Create(hash_type); 1276 scoped_ptr<blink::WebCryptoDigestor> CreateDigestor(
1185 if (!context) 1277 blink::WebCryptoAlgorithmId algorithm_id) {
1186 return Status::Error(); 1278 return scoped_ptr<blink::WebCryptoDigestor>(new DigestorNSS(algorithm_id));
1187
1188 HASH_Begin(context);
1189
1190 HASH_Update(context, data.bytes(), data.byte_length());
1191
1192 unsigned int hash_result_length = HASH_ResultLenContext(context);
1193 DCHECK_LE(hash_result_length, static_cast<size_t>(HASH_LENGTH_MAX));
1194
1195 *buffer = blink::WebArrayBuffer::create(hash_result_length, 1);
1196
1197 unsigned char* digest = reinterpret_cast<unsigned char*>(buffer->data());
1198
1199 unsigned int result_length = 0;
1200 HASH_End(context, digest, &result_length, hash_result_length);
1201
1202 HASH_Destroy(context);
1203
1204 if (result_length != hash_result_length)
1205 return Status::ErrorUnexpected();
1206 return Status::Success();
1207 } 1279 }
1208 1280
1209 Status GenerateSecretKey(const blink::WebCryptoAlgorithm& algorithm, 1281 Status GenerateSecretKey(const blink::WebCryptoAlgorithm& algorithm,
1210 bool extractable, 1282 bool extractable,
1211 blink::WebCryptoKeyUsageMask usage_mask, 1283 blink::WebCryptoKeyUsageMask usage_mask,
1212 unsigned keylen_bytes, 1284 unsigned keylen_bytes,
1213 blink::WebCryptoKey* key) { 1285 blink::WebCryptoKey* key) {
1214 CK_MECHANISM_TYPE mech = WebCryptoAlgorithmToGenMechanism(algorithm); 1286 CK_MECHANISM_TYPE mech = WebCryptoAlgorithmToGenMechanism(algorithm);
1215 blink::WebCryptoKeyType key_type = blink::WebCryptoKeyTypeSecret; 1287 blink::WebCryptoKeyType key_type = blink::WebCryptoKeyTypeSecret;
1216 1288
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 key_algorithm, 1546 key_algorithm,
1475 usage_mask); 1547 usage_mask);
1476 return Status::Success(); 1548 return Status::Success();
1477 } 1549 }
1478 1550
1479 } // namespace platform 1551 } // namespace platform
1480 1552
1481 } // namespace webcrypto 1553 } // namespace webcrypto
1482 1554
1483 } // namespace content 1555 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698