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

Side by Side Diff: crypto/signature_verifier_unittest.cc

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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
« no previous file with comments | « crypto/mock_apple_keychain.h ('k') | gin/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/signature_verifier.h" 5 #include "crypto/signature_verifier.h"
6 6
7 #include "base/numerics/safe_conversions.h" 7 #include "base/numerics/safe_conversions.h"
8 #include "testing/gtest/include/gtest/gtest.h" 8 #include "testing/gtest/include/gtest/gtest.h"
9 9
10 TEST(SignatureVerifierTest, BasicTest) { 10 TEST(SignatureVerifierTest, BasicTest) {
(...skipping 982 matching lines...) Expand 10 before | Expand all | Expand 10 after
993 while (in[0] != '\0') { 993 while (in[0] != '\0') {
994 if (!isxdigit(in[0]) || !isxdigit(in[1]) || in[2] != ' ') 994 if (!isxdigit(in[0]) || !isxdigit(in[1]) || in[2] != ' ')
995 return false; 995 return false;
996 uint8 octet = HexDigitValue(in[0]) * 16 + HexDigitValue(in[1]); 996 uint8 octet = HexDigitValue(in[0]) * 16 + HexDigitValue(in[1]);
997 out->push_back(octet); 997 out->push_back(octet);
998 in += 3; 998 in += 3;
999 } 999 }
1000 return true; 1000 return true;
1001 } 1001 }
1002 1002
1003 // PrependASN1Length prepends an ASN.1 serialized length to the beginning of
1004 // |out|.
1005 static void PrependASN1Length(std::vector<uint8>* out, size_t len) {
1006 if (len < 128) {
1007 out->insert(out->begin(), static_cast<uint8>(len));
1008 } else if (len < 256) {
1009 out->insert(out->begin(), static_cast<uint8>(len));
1010 out->insert(out->begin(), 0x81);
1011 } else if (len < 0x10000) {
1012 out->insert(out->begin(), static_cast<uint8>(len));
1013 out->insert(out->begin(), static_cast<uint8>(len >> 8));
1014 out->insert(out->begin(), 0x82);
1015 } else {
1016 CHECK(false) << "ASN.1 length not handled: " << len;
1017 }
1018 }
1019
1003 static bool EncodeRSAPublicKey(const std::vector<uint8>& modulus_n, 1020 static bool EncodeRSAPublicKey(const std::vector<uint8>& modulus_n,
1004 const std::vector<uint8>& public_exponent_e, 1021 const std::vector<uint8>& public_exponent_e,
1005 std::vector<uint8>* public_key_info) { 1022 std::vector<uint8>* public_key_info) {
1006 // The public key is specified as the following ASN.1 structure: 1023 // The public key is specified as the following ASN.1 structure:
1007 // SubjectPublicKeyInfo ::= SEQUENCE { 1024 // SubjectPublicKeyInfo ::= SEQUENCE {
1008 // algorithm AlgorithmIdentifier, 1025 // algorithm AlgorithmIdentifier,
1009 // subjectPublicKey BIT STRING } 1026 // subjectPublicKey BIT STRING }
1010 // 1027 //
1011 // The signature algorithm is specified as the following ASN.1 structure: 1028 // The signature algorithm is specified as the following ASN.1 structure:
1012 // AlgorithmIdentifier ::= SEQUENCE { 1029 // AlgorithmIdentifier ::= SEQUENCE {
1013 // algorithm OBJECT IDENTIFIER, 1030 // algorithm OBJECT IDENTIFIER,
1014 // parameters ANY DEFINED BY algorithm OPTIONAL } 1031 // parameters ANY DEFINED BY algorithm OPTIONAL }
1015 // 1032 //
1016 // An RSA public key is specified as the following ASN.1 structure: 1033 // An RSA public key is specified as the following ASN.1 structure:
1017 // RSAPublicKey ::= SEQUENCE { 1034 // RSAPublicKey ::= SEQUENCE {
1018 // modulus INTEGER, -- n 1035 // modulus INTEGER, -- n
1019 // publicExponent INTEGER -- e 1036 // publicExponent INTEGER -- e
1020 // } 1037 // }
1021 static const uint8 kIntegerTag = 0x02; 1038 static const uint8 kIntegerTag = 0x02;
1022 static const uint8 kBitStringTag = 0x03; 1039 static const uint8 kBitStringTag = 0x03;
1023 static const uint8 kSequenceTag = 0x30; 1040 static const uint8 kSequenceTag = 0x30;
1024 public_key_info->clear(); 1041 public_key_info->clear();
1025 1042
1026 // Encode the public exponent e as an INTEGER. 1043 // Encode the public exponent e as an INTEGER.
1027 public_key_info->insert(public_key_info->begin(), 1044 public_key_info->insert(public_key_info->begin(),
1028 public_exponent_e.begin(), 1045 public_exponent_e.begin(),
1029 public_exponent_e.end()); 1046 public_exponent_e.end());
1030 uint8 exponent_size = base::checked_cast<uint8>(public_exponent_e.size()); 1047 PrependASN1Length(public_key_info, public_exponent_e.size());
1031 public_key_info->insert(public_key_info->begin(), exponent_size);
1032 public_key_info->insert(public_key_info->begin(), kIntegerTag); 1048 public_key_info->insert(public_key_info->begin(), kIntegerTag);
1033 1049
1034 // Encode the modulus n as an INTEGER. 1050 // Encode the modulus n as an INTEGER.
1035 public_key_info->insert(public_key_info->begin(), 1051 public_key_info->insert(public_key_info->begin(),
1036 modulus_n.begin(), modulus_n.end()); 1052 modulus_n.begin(), modulus_n.end());
1037 uint16 modulus_size = base::checked_cast<uint16>(modulus_n.size()); 1053 size_t modulus_size = modulus_n.size();
1038 if (modulus_n[0] & 0x80) { 1054 if (modulus_n[0] & 0x80) {
1039 public_key_info->insert(public_key_info->begin(), 0x00); 1055 public_key_info->insert(public_key_info->begin(), 0x00);
1040 modulus_size++; 1056 modulus_size++;
1041 } 1057 }
1042 public_key_info->insert(public_key_info->begin(), modulus_size & 0xff); 1058 PrependASN1Length(public_key_info, modulus_size);
1043 public_key_info->insert(public_key_info->begin(), (modulus_size >> 8) & 0xff);
1044 public_key_info->insert(public_key_info->begin(), 0x82);
1045 public_key_info->insert(public_key_info->begin(), kIntegerTag); 1059 public_key_info->insert(public_key_info->begin(), kIntegerTag);
1046 1060
1047 // Encode the RSAPublicKey SEQUENCE. 1061 // Encode the RSAPublicKey SEQUENCE.
1048 uint16 info_size = base::checked_cast<uint16>(public_key_info->size()); 1062 PrependASN1Length(public_key_info, public_key_info->size());
1049 public_key_info->insert(public_key_info->begin(), info_size & 0xff);
1050 public_key_info->insert(public_key_info->begin(), (info_size >> 8) & 0xff);
1051 public_key_info->insert(public_key_info->begin(), 0x82);
1052 public_key_info->insert(public_key_info->begin(), kSequenceTag); 1063 public_key_info->insert(public_key_info->begin(), kSequenceTag);
1053 1064
1054 // Encode the BIT STRING. 1065 // Encode the BIT STRING.
1055 // Number of unused bits. 1066 // Number of unused bits.
1056 public_key_info->insert(public_key_info->begin(), 0x00); 1067 public_key_info->insert(public_key_info->begin(), 0x00);
1057 info_size = base::checked_cast<uint16>(public_key_info->size()); 1068 PrependASN1Length(public_key_info, public_key_info->size());
1058 public_key_info->insert(public_key_info->begin(), info_size & 0xff);
1059 public_key_info->insert(public_key_info->begin(), (info_size >> 8) & 0xff);
1060 public_key_info->insert(public_key_info->begin(), 0x82);
1061 public_key_info->insert(public_key_info->begin(), kBitStringTag); 1069 public_key_info->insert(public_key_info->begin(), kBitStringTag);
1062 1070
1063 // Encode the AlgorithmIdentifier. 1071 // Encode the AlgorithmIdentifier.
1064 static const uint8 algorithm[] = { 1072 static const uint8 algorithm[] = {
1065 0x30, 0x0d, // a SEQUENCE of length 13 1073 0x30, 0x0d, // a SEQUENCE of length 13
1066 0x06, 0x09, // an OBJECT IDENTIFIER of length 9 1074 0x06, 0x09, // an OBJECT IDENTIFIER of length 9
1067 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 1075 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
1068 0x05, 0x00, 1076 0x05, 0x00,
1069 }; 1077 };
1070 public_key_info->insert(public_key_info->begin(), 1078 public_key_info->insert(public_key_info->begin(),
1071 algorithm, algorithm + sizeof(algorithm)); 1079 algorithm, algorithm + sizeof(algorithm));
1072 1080
1073 // Encode the outermost SEQUENCE. 1081 // Encode the outermost SEQUENCE.
1074 info_size = base::checked_cast<uint16>(public_key_info->size()); 1082 PrependASN1Length(public_key_info, public_key_info->size());
1075 public_key_info->insert(public_key_info->begin(), info_size & 0xff);
1076 public_key_info->insert(public_key_info->begin(), (info_size >> 8) & 0xff);
1077 public_key_info->insert(public_key_info->begin(), 0x82);
1078 public_key_info->insert(public_key_info->begin(), kSequenceTag); 1083 public_key_info->insert(public_key_info->begin(), kSequenceTag);
1079 1084
1080 return true; 1085 return true;
1081 } 1086 }
1082 1087
1083 TEST(SignatureVerifierTest, VerifyRSAPSS) { 1088 TEST(SignatureVerifierTest, VerifyRSAPSS) {
1084 for (unsigned int i = 0; i < arraysize(pss_test); i++) { 1089 for (unsigned int i = 0; i < arraysize(pss_test); i++) {
1090 SCOPED_TRACE(i);
1085 std::vector<uint8> modulus_n; 1091 std::vector<uint8> modulus_n;
1086 std::vector<uint8> public_exponent_e; 1092 std::vector<uint8> public_exponent_e;
1087 ASSERT_TRUE(DecodeTestInput(pss_test[i].modulus_n, &modulus_n)); 1093 ASSERT_TRUE(DecodeTestInput(pss_test[i].modulus_n, &modulus_n));
1088 ASSERT_TRUE(DecodeTestInput(pss_test[i].public_exponent_e, 1094 ASSERT_TRUE(DecodeTestInput(pss_test[i].public_exponent_e,
1089 &public_exponent_e)); 1095 &public_exponent_e));
1090 std::vector<uint8> public_key_info; 1096 std::vector<uint8> public_key_info;
1091 ASSERT_TRUE(EncodeRSAPublicKey(modulus_n, public_exponent_e, 1097 ASSERT_TRUE(EncodeRSAPublicKey(modulus_n, public_exponent_e,
1092 &public_key_info)); 1098 &public_key_info));
1093 1099
1094 for (unsigned int j = 0; j < arraysize(pss_test[i].example); j++) { 1100 for (unsigned int j = 0; j < arraysize(pss_test[i].example); j++) {
1101 SCOPED_TRACE(j);
1095 std::vector<uint8> message; 1102 std::vector<uint8> message;
1096 std::vector<uint8> salt; 1103 std::vector<uint8> salt;
1097 std::vector<uint8> signature; 1104 std::vector<uint8> signature;
1098 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].message, &message)); 1105 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].message, &message));
1099 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].salt, &salt)); 1106 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].salt, &salt));
1100 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].signature, 1107 ASSERT_TRUE(DecodeTestInput(pss_test[i].example[j].signature,
1101 &signature)); 1108 &signature));
1102 1109
1103 crypto::SignatureVerifier verifier; 1110 crypto::SignatureVerifier verifier;
1104 bool ok; 1111 bool ok;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1151 &public_key_info[0], 1158 &public_key_info[0],
1152 public_key_info.size()); 1159 public_key_info.size());
1153 signature[0] -= 1; 1160 signature[0] -= 1;
1154 ASSERT_TRUE(ok); 1161 ASSERT_TRUE(ok);
1155 verifier.VerifyUpdate(&message[0], message.size()); 1162 verifier.VerifyUpdate(&message[0], message.size());
1156 ok = verifier.VerifyFinal(); 1163 ok = verifier.VerifyFinal();
1157 EXPECT_FALSE(ok); 1164 EXPECT_FALSE(ok);
1158 } 1165 }
1159 } 1166 }
1160 } 1167 }
OLDNEW
« no previous file with comments | « crypto/mock_apple_keychain.h ('k') | gin/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698