OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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 "crypto/hkdf.h" | 5 #include "crypto/hkdf.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "crypto/hmac.h" | 8 #include "crypto/hmac.h" |
9 | 9 |
10 namespace crypto { | 10 namespace crypto { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 | 65 |
66 result = hmac.Sign(base::StringPiece(buf.get(), j), digest, sizeof(digest)); | 66 result = hmac.Sign(base::StringPiece(buf.get(), j), digest, sizeof(digest)); |
67 DCHECK(result); | 67 DCHECK(result); |
68 | 68 |
69 memcpy(&output_[i*sizeof(digest)], digest, sizeof(digest)); | 69 memcpy(&output_[i*sizeof(digest)], digest, sizeof(digest)); |
70 previous = base::StringPiece(reinterpret_cast<char*>(digest), | 70 previous = base::StringPiece(reinterpret_cast<char*>(digest), |
71 sizeof(digest)); | 71 sizeof(digest)); |
72 } | 72 } |
73 | 73 |
74 size_t j = 0; | 74 size_t j = 0; |
75 client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), | 75 // On Windows, when the size of output_ is zero, dereference of 0'th element |
76 key_bytes_to_generate); | 76 // results in a crash. C++11 solves this problem by adding a data() getter |
77 j += key_bytes_to_generate; | 77 // method to std::vector. |
78 server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), | 78 if (key_bytes_to_generate > 0) { |
79 key_bytes_to_generate); | 79 client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), |
80 j += key_bytes_to_generate; | 80 key_bytes_to_generate); |
81 client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), | 81 j += key_bytes_to_generate; |
82 iv_bytes_to_generate); | 82 server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), |
83 j += iv_bytes_to_generate; | 83 key_bytes_to_generate); |
84 server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), | 84 j += key_bytes_to_generate; |
85 iv_bytes_to_generate); | 85 } |
| 86 |
| 87 if (iv_bytes_to_generate > 0) { |
| 88 client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), |
| 89 iv_bytes_to_generate); |
| 90 j += iv_bytes_to_generate; |
| 91 server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]), |
| 92 iv_bytes_to_generate); |
| 93 } |
86 } | 94 } |
87 | 95 |
88 HKDF::~HKDF() { | 96 HKDF::~HKDF() { |
89 } | 97 } |
90 | 98 |
91 } // namespace crypto | 99 } // namespace crypto |
OLD | NEW |