| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/crypto/rsa_private_key.h" | 5 #include "base/crypto/rsa_private_key.h" |
| 6 | 6 |
| 7 #include <iostream> | 7 #include <iostream> |
| 8 #include <list> | 8 #include <list> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 const uint8 PrivateKeyInfoCodec::kRsaAlgorithmIdentifier[] = { | 47 const uint8 PrivateKeyInfoCodec::kRsaAlgorithmIdentifier[] = { |
| 48 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, | 48 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, |
| 49 0x05, 0x00 | 49 0x05, 0x00 |
| 50 }; | 50 }; |
| 51 | 51 |
| 52 void PrivateKeyInfoCodec::PrependBytes(uint8* val, | 52 void PrivateKeyInfoCodec::PrependBytes(uint8* val, |
| 53 int start, | 53 int start, |
| 54 int num_bytes, | 54 int num_bytes, |
| 55 std::list<uint8>* data) { | 55 std::list<uint8>* data) { |
| 56 while (num_bytes > 0) { | 56 while(num_bytes > 0) { |
| 57 --num_bytes; | 57 --num_bytes; |
| 58 data->push_front(val[start + num_bytes]); | 58 data->push_front(val[start + num_bytes]); |
| 59 } | 59 } |
| 60 } | 60 } |
| 61 | 61 |
| 62 void PrivateKeyInfoCodec::PrependLength(size_t size, std::list<uint8>* data) { | 62 void PrivateKeyInfoCodec::PrependLength(size_t size, std::list<uint8>* data) { |
| 63 // The high bit is used to indicate whether additional octets are needed to | 63 // The high bit is used to indicate whether additional octets are needed to |
| 64 // represent the length. | 64 // represent the length. |
| 65 if (size < 0x80) { | 65 if (size < 0x80) { |
| 66 data->push_front(static_cast<uint8>(size)); | 66 data->push_front(static_cast<uint8>(size)); |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 int num_bytes, | 281 int num_bytes, |
| 282 std::list<uint8>* data, | 282 std::list<uint8>* data, |
| 283 bool big_endian) { | 283 bool big_endian) { |
| 284 // Reverse input if little-endian. | 284 // Reverse input if little-endian. |
| 285 std::vector<uint8> tmp; | 285 std::vector<uint8> tmp; |
| 286 if (!big_endian) { | 286 if (!big_endian) { |
| 287 tmp.assign(val, val + num_bytes); | 287 tmp.assign(val, val + num_bytes); |
| 288 reverse(tmp.begin(), tmp.end()); | 288 reverse(tmp.begin(), tmp.end()); |
| 289 val = &tmp.front(); | 289 val = &tmp.front(); |
| 290 } | 290 } |
| 291 | 291 |
| 292 // ASN.1 integers are unpadded byte arrays, so skip any null padding bytes | 292 // ASN.1 integers are unpadded byte arrays, so skip any null padding bytes |
| 293 // from the most-significant end of the integer. | 293 // from the most-significant end of the integer. |
| 294 int start = 0; | 294 int start = 0; |
| 295 while (start < (num_bytes - 1) && val[start] == 0x00) { | 295 while (start < (num_bytes - 1) && val[start] == 0x00) { |
| 296 start++; | 296 start++; |
| 297 num_bytes--; | 297 num_bytes--; |
| 298 } | 298 } |
| 299 PrependBytes(val, start, num_bytes, data); | 299 PrependBytes(val, start, num_bytes, data); |
| 300 | 300 |
| 301 // ASN.1 integers are signed. To encode a positive integer whose sign bit | 301 // ASN.1 integers are signed. To encode a positive integer whose sign bit |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 int pad = expected_size - temp.size(); | 353 int pad = expected_size - temp.size(); |
| 354 int index = 0; | 354 int index = 0; |
| 355 if (out->size() == expected_size + 1) { | 355 if (out->size() == expected_size + 1) { |
| 356 READ_ASSERT(out->front() == 0x00); | 356 READ_ASSERT(out->front() == 0x00); |
| 357 pad++; | 357 pad++; |
| 358 index++; | 358 index++; |
| 359 } else { | 359 } else { |
| 360 READ_ASSERT(out->size() <= expected_size); | 360 READ_ASSERT(out->size() <= expected_size); |
| 361 } | 361 } |
| 362 | 362 |
| 363 while (pad) { | 363 while(pad) { |
| 364 out->push_back(0x00); | 364 out->push_back(0x00); |
| 365 pad--; | 365 pad--; |
| 366 } | 366 } |
| 367 out->insert(out->end(), temp.begin(), temp.end()); | 367 out->insert(out->end(), temp.begin(), temp.end()); |
| 368 | 368 |
| 369 // Reverse output if little-endian. | 369 // Reverse output if little-endian. |
| 370 if (!big_endian_) | 370 if (!big_endian_) |
| 371 reverse(out->begin(), out->end()); | 371 reverse(out->begin(), out->end()); |
| 372 return true; | 372 return true; |
| 373 } | 373 } |
| 374 | 374 |
| 375 } // namespace base | 375 } // namespace base |
| OLD | NEW |