OLD | NEW |
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 "components/crx_file/crx_file.h" | 5 #include "components/crx_file/crx_file.h" |
6 | 6 |
7 #include "base/base64.h" | 7 #include "base/base64.h" |
8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/files/scoped_file.h" | 10 #include "base/files/scoped_file.h" |
11 #include "base/macros.h" | 11 #include "base/macros.h" |
12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
13 #include "base/numerics/safe_math.h" | 13 #include "base/numerics/safe_math.h" |
14 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
15 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
16 #include "components/crx_file/constants.h" | |
17 #include "components/crx_file/id_util.h" | 16 #include "components/crx_file/id_util.h" |
18 #include "crypto/secure_hash.h" | 17 #include "crypto/secure_hash.h" |
19 #include "crypto/sha2.h" | 18 #include "crypto/sha2.h" |
20 #include "crypto/signature_verifier.h" | 19 #include "crypto/signature_verifier.h" |
21 | 20 |
22 namespace crx_file { | 21 namespace crx_file { |
23 | 22 |
24 namespace { | 23 namespace { |
25 | 24 |
26 // The current version of the crx format. | 25 // The current version of the crx format. |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
153 if (len != header.key_size) | 152 if (len != header.key_size) |
154 return ValidateError::CRX_PUBLIC_KEY_INVALID; | 153 return ValidateError::CRX_PUBLIC_KEY_INVALID; |
155 | 154 |
156 std::vector<uint8_t> signature(header.signature_size); | 155 std::vector<uint8_t> signature(header.signature_size); |
157 len = ReadAndHash(&signature.front(), sizeof(uint8_t), header.signature_size, | 156 len = ReadAndHash(&signature.front(), sizeof(uint8_t), header.signature_size, |
158 file.get(), hash.get()); | 157 file.get(), hash.get()); |
159 if (len < header.signature_size) | 158 if (len < header.signature_size) |
160 return ValidateError::CRX_SIGNATURE_INVALID; | 159 return ValidateError::CRX_SIGNATURE_INVALID; |
161 | 160 |
162 crypto::SignatureVerifier verifier; | 161 crypto::SignatureVerifier verifier; |
163 if (!verifier.VerifyInit( | 162 if (!verifier.VerifyInit(crypto::SignatureVerifier::RSA_PKCS1_SHA1, |
164 crx_file::kSignatureAlgorithm, sizeof(crx_file::kSignatureAlgorithm), | 163 signature.data(), static_cast<int>(signature.size()), |
165 &signature.front(), static_cast<int>(signature.size()), &key.front(), | 164 key.data(), static_cast<int>(key.size()))) { |
166 static_cast<int>(key.size()))) { | |
167 // Signature verification initialization failed. This is most likely | 165 // Signature verification initialization failed. This is most likely |
168 // caused by a public key in the wrong format (should encode algorithm). | 166 // caused by a public key in the wrong format (should encode algorithm). |
169 return ValidateError::CRX_SIGNATURE_VERIFICATION_INITIALIZATION_FAILED; | 167 return ValidateError::CRX_SIGNATURE_VERIFICATION_INITIALIZATION_FAILED; |
170 } | 168 } |
171 | 169 |
172 uint8_t buf[1 << 12] = {}; | 170 uint8_t buf[1 << 12] = {}; |
173 while ((len = ReadAndHash(buf, sizeof(buf[0]), arraysize(buf), file.get(), | 171 while ((len = ReadAndHash(buf, sizeof(buf[0]), arraysize(buf), file.get(), |
174 hash.get())) > 0) | 172 hash.get())) > 0) |
175 verifier.VerifyUpdate(buf, static_cast<int>(len)); | 173 verifier.VerifyUpdate(buf, static_cast<int>(len)); |
176 | 174 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 else if (header.signature_size > kMaxSignatureSize) | 211 else if (header.signature_size > kMaxSignatureSize) |
214 *error = kInvalidSignatureTooLarge; | 212 *error = kInvalidSignatureTooLarge; |
215 else if (header.signature_size == 0) | 213 else if (header.signature_size == 0) |
216 *error = kInvalidSignatureTooSmall; | 214 *error = kInvalidSignatureTooSmall; |
217 else | 215 else |
218 valid = true; | 216 valid = true; |
219 return valid; | 217 return valid; |
220 } | 218 } |
221 | 219 |
222 } // namespace crx_file | 220 } // namespace crx_file |
OLD | NEW |