xref: /aosp_15_r20/external/tink/cc/experimental/pqcrypto/kem/subtle/cecpq2_subtle_boringssl_util_test.cc (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1 // Copyright 2017 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //      http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 ////////////////////////////////////////////////////////////////////////////////
16 
17 #include "tink/experimental/pqcrypto/kem/subtle/cecpq2_subtle_boringssl_util.h"
18 
19 #include <string>
20 
21 #include "openssl/hrss.h"
22 #include "tink/subtle/random.h"
23 #include "tink/subtle/subtle_util.h"
24 #include "tink/util/secret_data.h"
25 #include "tink/util/test_matchers.h"
26 #include "tink/util/test_util.h"
27 
28 namespace crypto {
29 namespace tink {
30 namespace pqc {
31 
32 // CECPQ2 test vector from BoringSSL
33 const char kHrssKeyGenEntropy[] =
34     "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324"
35     "25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546474849"
36     "4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e"
37     "6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293"
38     "9495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8"
39     "b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdd"
40     "dedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102"
41     "030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627"
42     "28292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c"
43     "4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071"
44     "72737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293949596"
45     "9798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babb"
46     "bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0"
47     "e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405"
48     "060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a"
49     "2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f"
50     "505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374"
51     "75767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293949596979899"
52     "9a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbebfc0"
53     "c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5"
54     "e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a"
55     "0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f"
56     "303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354"
57     "55565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717273747576777879"
58     "7a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e"
59     "9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3"
60     "c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8"
61     "e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d"
62     "0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132"
63     "333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354555657"
64     "58595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c"
65     "7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1"
66     "a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6"
67     "c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaeb"
68     "ecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f10"
69     "1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435"
70     "363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a"
71     "5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797c7d7e7f8081"
72     "82838485868788898a8b8c8d8e8f909192939495969798999a9b";
73 
74 const char kExpectedPub[] =
75     "4a21397cb4a658153577e42a0279c002e221275f49c72c14b6e067c2c709620ce5239c40d7"
76     "7ef5555aa2d09fd38c677b48a4538d39b1cc9929f783bf6f9b167323ccc38698b17c53b1f5"
77     "f4ddc8975ed36d63cef3a2f6ef94ed4a3ee64ba2fb87a3bc651c176425a7b4a1e68406720c"
78     "28e8fcaacaf8207989a9f060dfd6d4e0af995421af76d59a3180ea7f036c1474069c93e393"
79     "cc464d82dadf67e96d582b49f31071a0c5eca029d77c43d5057e148c3928f9463dc1106c2f"
80     "aaca11876ae2b1f63176b0dc308a977ddce4d118e90391f5d2944d71f735c83e46afa3eb35"
81     "070177c558ca82673e4f0188a4a0ea0ab71306beb661a4a228e232cf2546cfcef5579b748f"
82     "fdbcfa3aa21822f1b14312e8e2e306e61ca7762d0de55fbd8fa095cde928dbcce56633d44b"
83     "f90c429b27ee11d0e30b9dce2c917a0eb8de3173868e3459932e379dc23e890b47ffa65521"
84     "e64f727ccce5b8182c10cbce48a5c526b61976c538f03872ec22f925de1c0c1b3e43c55c8c"
85     "dbf14266bcdfa0824bece15042578460fd89121bf6f94d0d16e8a4e2672c8f22eaba4634ce"
86     "978b4c380e1682b6f334380787732a3d80564b8567ca2a19b6b62cfed802e5add0617973ab"
87     "da3ba451b3f78599b2d06497b73c0e58dfd29898181af559cdc54817109fd819bdd042711c"
88     "30c676e9b0eef53805be9b6c0db0d0da1c89bd405dc25abe83a6b547a7f8b9bfa265171ed8"
89     "2842beb035f67b8838bef5b51b637a83920d64ad925997555c60ab488e232722753b7c9c69"
90     "13526baefd38e54b36785592b58f25de0e93e31d8362056a5aff7f77f71bfc2145f7b8facb"
91     "005e85f92f152fcf179e84f6f5156eddb47344c22c74ae275f19e75161c182cef15ba06f0b"
92     "131068b7eefb8a85e2d6175526a5c5b39445df49e650f899d83ccb9480673b73acf6463163"
93     "b31b47ce403f8cd082c4793a7c4810e39798dc0b6242fa2605f68c32a9b62c4f85d29bf389"
94     "1f91ca123de2a80bca64280ea7fdd8a3cb0ad9972dc3f23974dbe39a871ae033e392e8deb5"
95     "0828cbd7b679ec71cce5d14b89965ffafd4bd0a8660db4a75156bca774077fae0ef69c13d9"
96     "f2ed12a9873eb79d538a822d032fac948495002909013862ffaffd102b3103b24f51fb7627"
97     "1e2582796569fa24afcbe8408d7dd29a12692fe4ce99984f6c46fd634050ef2202682e53bb"
98     "00a365613e97d45fa2c166cd04dcda5510280d4011e668ed68387d20c3979dcb6e30fcbe63"
99     "e7724705f50b7e663bc53a855aa3c5729db9c1b480986e4086c9cba3ab77c256fccb6e12f5"
100     "6362f8ff9115a7a15eb6ee694d5b5f4efad361caec14fdd910f54a055f29cb772c2de29067"
101     "627875a94e20000c9184baed1ccebd574fa52f596c4cdf5faa32f086091536c6e66a24b4b3"
102     "09dd32c595ac60b5099736a13c8f0e908ecdd04975f7f38080cb1feef26a2f198cba1000da"
103     "13ef102bb7effdd1e07cf84601699b9980511f743b6793185ed4346c817602ef91a4222a23"
104     "1b584375651387986014252867a3348ce0d5d3513368ff65595aa7b26b01ad70067301511b"
105     "e1ec282f8a855a10d00e6b35452e61dd7720b1353ba8dd8ae2157907";
106 
TEST(CreatesNewCecpq2KeyPairTest,GeneratesDifferentKeysEveryTime)107 TEST(CreatesNewCecpq2KeyPairTest, GeneratesDifferentKeysEveryTime) {
108   // Generating two HRSS key pairs
109   crypto::tink::util::SecretData hrss_key_entropy1 =
110       crypto::tink::subtle::Random::GetRandomKeyBytes(HRSS_GENERATE_KEY_BYTES);
111   auto keypair1 = crypto::tink::pqc::GenerateHrssKeyPair(hrss_key_entropy1);
112   crypto::tink::util::SecretData hrss_key_entropy2 =
113       crypto::tink::subtle::Random::GetRandomKeyBytes(HRSS_GENERATE_KEY_BYTES);
114   auto keypair2 = crypto::tink::pqc::GenerateHrssKeyPair(hrss_key_entropy2);
115 
116   std::string keypair1_pub_marsh_str(
117       reinterpret_cast<const char*>(
118           keypair1.value().hrss_public_key_marshaled.data()),
119       HRSS_PUBLIC_KEY_BYTES);
120   std::string keypair2_pub_marsh_str(
121       reinterpret_cast<const char*>(
122           keypair2.value().hrss_public_key_marshaled.data()),
123       HRSS_PUBLIC_KEY_BYTES);
124 
125   // the two HRSS key pairs should be different with very high probability
126   EXPECT_NE(keypair1_pub_marsh_str, keypair2_pub_marsh_str);
127 }
128 
TEST(CreatesNewCecpq2KeyPairTest,SuccessfullHrssKeyGen)129 TEST(CreatesNewCecpq2KeyPairTest, SuccessfullHrssKeyGen) {
130   // Generating HRSS key pair from BoringSSL test vector
131   std::string hrss_key_gen_entropy_str(
132       reinterpret_cast<const char*>(
133           test::HexDecodeOrDie(kHrssKeyGenEntropy).data()),
134       HRSS_GENERATE_KEY_BYTES);
135   util::SecretData hrss_key_gen_entropy =
136       util::SecretDataFromStringView(hrss_key_gen_entropy_str);
137   auto keypair = crypto::tink::pqc::GenerateHrssKeyPair(hrss_key_gen_entropy);
138 
139   // Checking that the generated HRSS public key matched the test vector one
140   EXPECT_EQ(test::HexEncode(keypair.value().hrss_public_key_marshaled),
141             kExpectedPub);
142 }
143 
144 }  // namespace pqc
145 }  // namespace tink
146 }  // namespace crypto
147