| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <limits> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include <base/strings/string_number_conversions.h> |
| #include <base/optional.h> |
| #include <base/logging.h> |
| #include <crypto/scoped_openssl_types.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "libhwsec/crypto_utility.h" |
| |
| using testing::_; |
| using testing::NiceMock; |
| using testing::Return; |
| |
| namespace { |
| |
| // RSA 1024 pre-generated key |
| // Public key: DER encoded SubjectPublicKeyInfo |
| // Private key: DER encoded PKCS#1 RSAPrivateKey |
| constexpr char kRsaDerPrivateKey[] = |
| "3082025c02010002818100c080fd814be63035ca6bd264a5b300ceea9e93702d66ebf0c0c3" |
| "cfd21a287c9195491225887b931d51a8b28813ecb2a256d427b13502b563103070d7de6ef8" |
| "e0dce3b48987926d576fa6136d9209e1da6fe3f59be83d879054c1e2233c5f28c4a426978e" |
| "97e18390c99e32f7e1ffd4187774c6939d15b5663c14ed08e741ea7b020301000102818025" |
| "2840c6764a06403bc43826293db6083a8d45543fcf3ff7869dc53d7ec315d85c0270b841f1" |
| "e8619e637ba27c8611acf8299747c33db4995c849d236dd1e9c3d7219ebaf3f90774144839" |
| "0284653102cac0bfbdd2da07903a71b62d4b4577136b87ba5f837c6e70baa3284610a2a770" |
| "598382e24e6b23c99824dc0ad0cec761024100fe441c16fc098a311b2b08f74e2ac58e269f" |
| "d12e6a72d4e83d5e0bb2c00ba71db7889481349367507883ebf6d82bfd1bb68e506ddc0472" |
| "57aa7ae8c9364d28d3024100c1d10ed2bcfea3806e60c991123727781fe9256332ead379de" |
| "9b1290599fd57f34ebed4adf0943da2349bc3bbf8ae7519181f4ac81db96be302bb8681140" |
| "aeb902407b3d5df4120339b4e57b2d6458c1c87146ed4d8156dd03aef117a549e565808199" |
| "d49c4e27c28e5fe599e384087101c42deebab314e21eddb8e6cbefc2df113b0240212930bd" |
| "13c3099c76c62e9698a4412787662f946a68cd2803d34a78d22ccbad891378b51fb6091af0" |
| "80b42910dba63a49880fa1d85206d7a18c496fdccbd159024100d932619513fe956c64428f" |
| "2dda042d3e20353b1b29b2e863b917708091866c47bf7a4492607af8eba66d8d7bf45d6ada" |
| "4d19aea9004c05449b8c6369a109e081"; |
| constexpr char kRsaDerPublicKey[] = |
| "30819f300d06092a864886f70d010101050003818d0030818902818100c080fd814be63035" |
| "ca6bd264a5b300ceea9e93702d66ebf0c0c3cfd21a287c9195491225887b931d51a8b28813" |
| "ecb2a256d427b13502b563103070d7de6ef8e0dce3b48987926d576fa6136d9209e1da6fe3" |
| "f59be83d879054c1e2233c5f28c4a426978e97e18390c99e32f7e1ffd4187774c6939d15b5" |
| "663c14ed08e741ea7b0203010001"; |
| |
| // EC P-256 (prime256v1) pre-generated key |
| // Public key: DER encoded SubjectPublicKeyInfo |
| // Private key: DER encoded ECPrivateKey |
| constexpr char kEcDerPrivateKey[] = |
| "307702010104207e1e647025d7bbf93ce583b88a0e554a22c5d711ea3754e39f9c6fabb2b6" |
| "6b6ba00a06082a8648ce3d030107a14403420004b6a397746f0cad8f1cdf1cb1ddafabe35e" |
| "65836a1a33a0f4b13ff5b0319cdb9f120b1e7cf733bcf0cdc490c251c982845e8326070e27" |
| "f007c82767acab1c2700"; |
| constexpr char kEcDerPublicKey[] = |
| "3059301306072a8648ce3d020106082a8648ce3d03010703420004b6a397746f0cad8f1cdf" |
| "1cb1ddafabe35e65836a1a33a0f4b13ff5b0319cdb9f120b1e7cf733bcf0cdc490c251c982" |
| "845e8326070e27f007c82767acab1c2700"; |
| |
| std::vector<uint8_t> HexDecode(const std::string& hex) { |
| std::vector<uint8_t> output; |
| CHECK(base::HexStringToBytes(hex, &output)); |
| return output; |
| } |
| |
| } // namespace |
| |
| namespace hwsec { |
| |
| class CryptoUtilityTest : public testing::Test { |
| public: |
| ~CryptoUtilityTest() override = default; |
| |
| void SetUp() override { |
| SetupPreGeneratedRsaKey(); |
| SetupPreGeneratedEcKey(); |
| } |
| |
| void SetupPreGeneratedRsaKey() { |
| std::vector<uint8_t> der_key = HexDecode(kRsaDerPrivateKey); |
| const unsigned char* buf = der_key.data(); |
| rsa_key_.reset(d2i_RSAPrivateKey(nullptr, &buf, der_key.size())); |
| } |
| |
| void SetupPreGeneratedEcKey() { |
| std::vector<uint8_t> der_key = HexDecode(kEcDerPrivateKey); |
| const unsigned char* buf = der_key.data(); |
| ecc_key_.reset(d2i_ECPrivateKey(nullptr, &buf, der_key.size())); |
| } |
| |
| protected: |
| crypto::ScopedRSA rsa_key_; |
| crypto::ScopedEC_KEY ecc_key_; |
| }; |
| |
| TEST_F(CryptoUtilityTest, CreateSecureRandomBlobBadLength) { |
| static_assert(sizeof(size_t) >= sizeof(int), "size_t is smaller than int!"); |
| size_t int_max = static_cast<size_t>(std::numeric_limits<int>::max()); |
| EXPECT_EQ(CreateSecureRandomBlob(int_max + 1).size(), 0); |
| } |
| |
| TEST_F(CryptoUtilityTest, PreGeneratedKeyIsValid) { |
| EXPECT_TRUE(rsa_key_); |
| EXPECT_TRUE(ecc_key_); |
| } |
| |
| TEST_F(CryptoUtilityTest, RsaKeyToSubjectPublicKeyInfoBytesSuccess) { |
| auto opt_public_key = RsaKeyToSubjectPublicKeyInfoBytes(rsa_key_); |
| EXPECT_TRUE(opt_public_key); |
| EXPECT_EQ(*opt_public_key, HexDecode(kRsaDerPublicKey)); |
| } |
| |
| TEST_F(CryptoUtilityTest, RsaKeyToSubjectPublicKeyInfoBytesFailWithNullptr) { |
| EXPECT_FALSE(RsaKeyToSubjectPublicKeyInfoBytes(nullptr)); |
| } |
| |
| TEST_F(CryptoUtilityTest, EccKeyToSubjectPublicKeyInfoBytesSuccess) { |
| auto opt_public_key = EccKeyToSubjectPublicKeyInfoBytes(ecc_key_); |
| EXPECT_TRUE(opt_public_key); |
| EXPECT_EQ(*opt_public_key, HexDecode(kEcDerPublicKey)); |
| } |
| |
| TEST_F(CryptoUtilityTest, EccKeyToSubjectPublicKeyInfoBytesFailWithNullptr) { |
| EXPECT_FALSE(EccKeyToSubjectPublicKeyInfoBytes(nullptr)); |
| } |
| |
| } // namespace hwsec |