| Index: base/crypto/rsa_private_key.cc
|
| diff --git a/base/crypto/rsa_private_key.cc b/base/crypto/rsa_private_key.cc
|
| index 75da7e42b9093c2aa07efc1e78503f08ba2dc9b5..4048ed1401df7c97811da6d399fd21c5b7a0439d 100644
|
| --- a/base/crypto/rsa_private_key.cc
|
| +++ b/base/crypto/rsa_private_key.cc
|
| @@ -48,118 +48,6 @@ const uint8 PrivateKeyInfoCodec::kRsaAlgorithmIdentifier[] = {
|
| 0x05, 0x00
|
| };
|
|
|
| -void PrivateKeyInfoCodec::PrependBytes(uint8* val,
|
| - int start,
|
| - int num_bytes,
|
| - std::list<uint8>* data) {
|
| - while (num_bytes > 0) {
|
| - --num_bytes;
|
| - data->push_front(val[start + num_bytes]);
|
| - }
|
| -}
|
| -
|
| -void PrivateKeyInfoCodec::PrependLength(size_t size, std::list<uint8>* data) {
|
| - // The high bit is used to indicate whether additional octets are needed to
|
| - // represent the length.
|
| - if (size < 0x80) {
|
| - data->push_front(static_cast<uint8>(size));
|
| - } else {
|
| - uint8 num_bytes = 0;
|
| - while (size > 0) {
|
| - data->push_front(static_cast<uint8>(size & 0xFF));
|
| - size >>= 8;
|
| - num_bytes++;
|
| - }
|
| - CHECK_LE(num_bytes, 4);
|
| - data->push_front(0x80 | num_bytes);
|
| - }
|
| -}
|
| -
|
| -void PrivateKeyInfoCodec::PrependTypeHeaderAndLength(uint8 type,
|
| - uint32 length,
|
| - std::list<uint8>* output) {
|
| - PrependLength(length, output);
|
| - output->push_front(type);
|
| -}
|
| -
|
| -void PrivateKeyInfoCodec::PrependBitString(uint8* val,
|
| - int num_bytes,
|
| - std::list<uint8>* output) {
|
| - // Start with the data.
|
| - PrependBytes(val, 0, num_bytes, output);
|
| - // Zero unused bits.
|
| - output->push_front(0);
|
| - // Add the length.
|
| - PrependLength(num_bytes + 1, output);
|
| - // Finally, add the bit string tag.
|
| - output->push_front((uint8) kBitStringTag);
|
| -}
|
| -
|
| -bool PrivateKeyInfoCodec::ReadLength(uint8** pos, uint8* end, uint32* result) {
|
| - READ_ASSERT(*pos < end);
|
| - int length = 0;
|
| -
|
| - // If the MSB is not set, the length is just the byte itself.
|
| - if (!(**pos & 0x80)) {
|
| - length = **pos;
|
| - (*pos)++;
|
| - } else {
|
| - // Otherwise, the lower 7 indicate the length of the length.
|
| - int length_of_length = **pos & 0x7F;
|
| - READ_ASSERT(length_of_length <= 4);
|
| - (*pos)++;
|
| - READ_ASSERT(*pos + length_of_length < end);
|
| -
|
| - length = 0;
|
| - for (int i = 0; i < length_of_length; ++i) {
|
| - length <<= 8;
|
| - length |= **pos;
|
| - (*pos)++;
|
| - }
|
| - }
|
| -
|
| - READ_ASSERT(*pos + length <= end);
|
| - if (result) *result = length;
|
| - return true;
|
| -}
|
| -
|
| -bool PrivateKeyInfoCodec::ReadTypeHeaderAndLength(uint8** pos,
|
| - uint8* end,
|
| - uint8 expected_tag,
|
| - uint32* length) {
|
| - READ_ASSERT(*pos < end);
|
| - READ_ASSERT(**pos == expected_tag);
|
| - (*pos)++;
|
| -
|
| - return ReadLength(pos, end, length);
|
| -}
|
| -
|
| -bool PrivateKeyInfoCodec::ReadSequence(uint8** pos, uint8* end) {
|
| - return ReadTypeHeaderAndLength(pos, end, kSequenceTag, NULL);
|
| -}
|
| -
|
| -bool PrivateKeyInfoCodec::ReadAlgorithmIdentifier(uint8** pos, uint8* end) {
|
| - READ_ASSERT(*pos + sizeof(kRsaAlgorithmIdentifier) < end);
|
| - READ_ASSERT(memcmp(*pos, kRsaAlgorithmIdentifier,
|
| - sizeof(kRsaAlgorithmIdentifier)) == 0);
|
| - (*pos) += sizeof(kRsaAlgorithmIdentifier);
|
| - return true;
|
| -}
|
| -
|
| -bool PrivateKeyInfoCodec::ReadVersion(uint8** pos, uint8* end) {
|
| - uint32 length = 0;
|
| - if (!ReadTypeHeaderAndLength(pos, end, kIntegerTag, &length))
|
| - return false;
|
| -
|
| - // The version should be zero.
|
| - for (uint32 i = 0; i < length; ++i) {
|
| - READ_ASSERT(**pos == 0x00);
|
| - (*pos)++;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| PrivateKeyInfoCodec::PrivateKeyInfoCodec(bool big_endian)
|
| : big_endian_(big_endian) {}
|
|
|
| @@ -321,6 +209,36 @@ bool PrivateKeyInfoCodec::ReadInteger(uint8** pos,
|
| return ReadIntegerImpl(pos, end, out, big_endian_);
|
| }
|
|
|
| +bool PrivateKeyInfoCodec::ReadIntegerWithExpectedSize(uint8** pos,
|
| + uint8* end,
|
| + size_t expected_size,
|
| + std::vector<uint8>* out) {
|
| + std::vector<uint8> temp;
|
| + if (!ReadIntegerImpl(pos, end, &temp, true)) // Big-Endian
|
| + return false;
|
| +
|
| + int pad = expected_size - temp.size();
|
| + int index = 0;
|
| + if (out->size() == expected_size + 1) {
|
| + READ_ASSERT(out->front() == 0x00);
|
| + pad++;
|
| + index++;
|
| + } else {
|
| + READ_ASSERT(out->size() <= expected_size);
|
| + }
|
| +
|
| + while (pad) {
|
| + out->push_back(0x00);
|
| + pad--;
|
| + }
|
| + out->insert(out->end(), temp.begin(), temp.end());
|
| +
|
| + // Reverse output if little-endian.
|
| + if (!big_endian_)
|
| + reverse(out->begin(), out->end());
|
| + return true;
|
| +}
|
| +
|
| bool PrivateKeyInfoCodec::ReadIntegerImpl(uint8** pos,
|
| uint8* end,
|
| std::vector<uint8>* out,
|
| @@ -346,33 +264,115 @@ bool PrivateKeyInfoCodec::ReadIntegerImpl(uint8** pos,
|
| return true;
|
| }
|
|
|
| -bool PrivateKeyInfoCodec::ReadIntegerWithExpectedSize(uint8** pos,
|
| - uint8* end,
|
| - size_t expected_size,
|
| - std::vector<uint8>* out) {
|
| - std::vector<uint8> temp;
|
| - if (!ReadIntegerImpl(pos, end, &temp, true)) // Big-Endian
|
| - return false;
|
| +void PrivateKeyInfoCodec::PrependBytes(uint8* val,
|
| + int start,
|
| + int num_bytes,
|
| + std::list<uint8>* data) {
|
| + while (num_bytes > 0) {
|
| + --num_bytes;
|
| + data->push_front(val[start + num_bytes]);
|
| + }
|
| +}
|
|
|
| - int pad = expected_size - temp.size();
|
| - int index = 0;
|
| - if (out->size() == expected_size + 1) {
|
| - READ_ASSERT(out->front() == 0x00);
|
| - pad++;
|
| - index++;
|
| +void PrivateKeyInfoCodec::PrependLength(size_t size, std::list<uint8>* data) {
|
| + // The high bit is used to indicate whether additional octets are needed to
|
| + // represent the length.
|
| + if (size < 0x80) {
|
| + data->push_front(static_cast<uint8>(size));
|
| } else {
|
| - READ_ASSERT(out->size() <= expected_size);
|
| + uint8 num_bytes = 0;
|
| + while (size > 0) {
|
| + data->push_front(static_cast<uint8>(size & 0xFF));
|
| + size >>= 8;
|
| + num_bytes++;
|
| + }
|
| + CHECK_LE(num_bytes, 4);
|
| + data->push_front(0x80 | num_bytes);
|
| }
|
| +}
|
|
|
| - while (pad) {
|
| - out->push_back(0x00);
|
| - pad--;
|
| +void PrivateKeyInfoCodec::PrependTypeHeaderAndLength(uint8 type,
|
| + uint32 length,
|
| + std::list<uint8>* output) {
|
| + PrependLength(length, output);
|
| + output->push_front(type);
|
| +}
|
| +
|
| +void PrivateKeyInfoCodec::PrependBitString(uint8* val,
|
| + int num_bytes,
|
| + std::list<uint8>* output) {
|
| + // Start with the data.
|
| + PrependBytes(val, 0, num_bytes, output);
|
| + // Zero unused bits.
|
| + output->push_front(0);
|
| + // Add the length.
|
| + PrependLength(num_bytes + 1, output);
|
| + // Finally, add the bit string tag.
|
| + output->push_front((uint8) kBitStringTag);
|
| +}
|
| +
|
| +bool PrivateKeyInfoCodec::ReadLength(uint8** pos, uint8* end, uint32* result) {
|
| + READ_ASSERT(*pos < end);
|
| + int length = 0;
|
| +
|
| + // If the MSB is not set, the length is just the byte itself.
|
| + if (!(**pos & 0x80)) {
|
| + length = **pos;
|
| + (*pos)++;
|
| + } else {
|
| + // Otherwise, the lower 7 indicate the length of the length.
|
| + int length_of_length = **pos & 0x7F;
|
| + READ_ASSERT(length_of_length <= 4);
|
| + (*pos)++;
|
| + READ_ASSERT(*pos + length_of_length < end);
|
| +
|
| + length = 0;
|
| + for (int i = 0; i < length_of_length; ++i) {
|
| + length <<= 8;
|
| + length |= **pos;
|
| + (*pos)++;
|
| + }
|
| + }
|
| +
|
| + READ_ASSERT(*pos + length <= end);
|
| + if (result) *result = length;
|
| + return true;
|
| +}
|
| +
|
| +bool PrivateKeyInfoCodec::ReadTypeHeaderAndLength(uint8** pos,
|
| + uint8* end,
|
| + uint8 expected_tag,
|
| + uint32* length) {
|
| + READ_ASSERT(*pos < end);
|
| + READ_ASSERT(**pos == expected_tag);
|
| + (*pos)++;
|
| +
|
| + return ReadLength(pos, end, length);
|
| +}
|
| +
|
| +bool PrivateKeyInfoCodec::ReadSequence(uint8** pos, uint8* end) {
|
| + return ReadTypeHeaderAndLength(pos, end, kSequenceTag, NULL);
|
| +}
|
| +
|
| +bool PrivateKeyInfoCodec::ReadAlgorithmIdentifier(uint8** pos, uint8* end) {
|
| + READ_ASSERT(*pos + sizeof(kRsaAlgorithmIdentifier) < end);
|
| + READ_ASSERT(memcmp(*pos, kRsaAlgorithmIdentifier,
|
| + sizeof(kRsaAlgorithmIdentifier)) == 0);
|
| + (*pos) += sizeof(kRsaAlgorithmIdentifier);
|
| + return true;
|
| +}
|
| +
|
| +bool PrivateKeyInfoCodec::ReadVersion(uint8** pos, uint8* end) {
|
| + uint32 length = 0;
|
| + if (!ReadTypeHeaderAndLength(pos, end, kIntegerTag, &length))
|
| + return false;
|
| +
|
| + // The version should be zero.
|
| + for (uint32 i = 0; i < length; ++i) {
|
| + READ_ASSERT(**pos == 0x00);
|
| + (*pos)++;
|
| }
|
| - out->insert(out->end(), temp.begin(), temp.end());
|
|
|
| - // Reverse output if little-endian.
|
| - if (!big_endian_)
|
| - reverse(out->begin(), out->end());
|
| return true;
|
| }
|
|
|
|
|