• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package com.google.android.rappor;
2 
3 import static org.junit.Assert.assertArrayEquals;
4 import static org.junit.Assert.assertEquals;
5 
6 import com.google.common.io.BaseEncoding;
7 import com.google.common.primitives.Bytes;
8 
9 import org.junit.Test;
10 import org.junit.runner.RunWith;
11 import org.junit.runners.JUnit4;
12 
13 /**
14  * Unit tests for {@link HmacDrbg}.
15  *
16  * Test vectors come from NIST's SHA-256 HMAC_DRBG no reseed known input test vectors at
17  * http://csrc.nist.gov/groups/STM/cavp/random-number-generation.html#drbgvs
18  */
19 @RunWith(JUnit4.class)
20 public final class HmacDrbgTest {
21 
hexToBytes(String s)22   private byte[] hexToBytes(String s) {
23     return BaseEncoding.base16().decode(s.toUpperCase());
24   }
25 
26   // ==== Test vectors for HMAC_DRBG with no personalization. ====
27   @Test
testHmacDrbgNistCase0()28   public void testHmacDrbgNistCase0() {
29     byte[] entropy =
30       hexToBytes("ca851911349384bffe89de1cbdc46e6831e44d34a4fb935ee285dd14b71a7488");
31     byte[] nonce = hexToBytes("659ba96c601dc69fc902940805ec0ca8");
32     byte[] expected = hexToBytes(
33       "e528e9abf2dece54d47c7e75e5fe302149f817ea9fb4bee6f4199697d04d5b89"
34       + "d54fbb978a15b5c443c9ec21036d2460b6f73ebad0dc2aba6e624abf07745bc1"
35       + "07694bb7547bb0995f70de25d6b29e2d3011bb19d27676c07162c8b5ccde0668"
36       + "961df86803482cb37ed6d5c0bb8d50cf1f50d476aa0458bdaba806f48be9dcb8");
37 
38     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
39     byte[] out1 = new byte[1024 / 8];
40     drbg.nextBytes(out1);
41     byte[] out2 = new byte[1024 / 8];
42     drbg.nextBytes(out2);
43     assertArrayEquals(expected, out2);
44   }
45 
46   @Test
testHmacDrbgNistCase1()47   public void testHmacDrbgNistCase1() {
48     byte[] entropy =
49       hexToBytes("79737479ba4e7642a221fcfd1b820b134e9e3540a35bb48ffae29c20f5418ea3");
50     byte[] nonce = hexToBytes("3593259c092bef4129bc2c6c9e19f343");
51     byte[] expected = hexToBytes(
52       "cf5ad5984f9e43917aa9087380dac46e410ddc8a7731859c84e9d0f31bd43655"
53       + "b924159413e2293b17610f211e09f770f172b8fb693a35b85d3b9e5e63b1dc25"
54       + "2ac0e115002e9bedfb4b5b6fd43f33b8e0eafb2d072e1a6fee1f159df9b51e6c"
55       + "8da737e60d5032dd30544ec51558c6f080bdbdab1de8a939e961e06b5f1aca37");
56 
57     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
58     byte[] out1 = new byte[1024 / 8];
59     drbg.nextBytes(out1);
60     byte[] out2 = new byte[1024 / 8];
61     drbg.nextBytes(out2);
62     assertArrayEquals(expected, out2);
63   }
64 
65   @Test
testHmacDrbgNistCase2()66   public void testHmacDrbgNistCase2() {
67     byte[] entropy =
68       hexToBytes("b340907445b97a8b589264de4a17c0bea11bb53ad72f9f33297f05d2879d898d");
69     byte[] nonce = hexToBytes("65cb27735d83c0708f72684ea58f7ee5");
70     byte[] expected = hexToBytes(
71       "75183aaaf3574bc68003352ad655d0e9ce9dd17552723b47fab0e84ef903694a"
72       + "32987eeddbdc48efd24195dbdac8a46ba2d972f5808f23a869e71343140361f5"
73       + "8b243e62722088fe10a98e43372d252b144e00c89c215a76a121734bdc485486"
74       + "f65c0b16b8963524a3a70e6f38f169c12f6cbdd169dd48fe4421a235847a23ff");
75 
76     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
77     byte[] out1 = new byte[1024 / 8];
78     drbg.nextBytes(out1);
79     byte[] out2 = new byte[1024 / 8];
80     drbg.nextBytes(out2);
81     assertArrayEquals(expected, out2);
82   }
83 
84   @Test
testHmacDrbgNistCase3()85   public void testHmacDrbgNistCase3() {
86     byte[] entropy =
87       hexToBytes("8e159f60060a7d6a7e6fe7c9f769c30b98acb1240b25e7ee33f1da834c0858e7");
88     byte[] nonce = hexToBytes("c39d35052201bdcce4e127a04f04d644");
89     byte[] expected = hexToBytes(
90       "62910a77213967ea93d6457e255af51fc79d49629af2fccd81840cdfbb491099"
91       + "1f50a477cbd29edd8a47c4fec9d141f50dfde7c4d8fcab473eff3cc2ee9e7cc9"
92       + "0871f180777a97841597b0dd7e779eff9784b9cc33689fd7d48c0dcd341515ac"
93       + "8fecf5c55a6327aea8d58f97220b7462373e84e3b7417a57e80ce946d6120db5");
94 
95     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
96     byte[] out1 = new byte[1024 / 8];
97     drbg.nextBytes(out1);
98     byte[] out2 = new byte[1024 / 8];
99     drbg.nextBytes(out2);
100     assertArrayEquals(expected, out2);
101   }
102 
103   @Test
testHmacDrbgNistCase4()104   public void testHmacDrbgNistCase4() {
105     byte[] entropy =
106       hexToBytes("74755f196305f7fb6689b2fe6835dc1d81484fc481a6b8087f649a1952f4df6a");
107     byte[] nonce = hexToBytes("c36387a544a5f2b78007651a7b74b749");
108     byte[] expected = hexToBytes(
109       "b2896f3af4375dab67e8062d82c1a005ef4ed119d13a9f18371b1b8737744186"
110       + "84805fd659bfd69964f83a5cfe08667ddad672cafd16befffa9faed49865214f"
111       + "703951b443e6dca22edb636f3308380144b9333de4bcb0735710e4d926678634"
112       + "2fc53babe7bdbe3c01a3addb7f23c63ce2834729fabbd419b47beceb4a460236");
113 
114     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
115     byte[] out1 = new byte[1024 / 8];
116     drbg.nextBytes(out1);
117     byte[] out2 = new byte[1024 / 8];
118     drbg.nextBytes(out2);
119     assertArrayEquals(expected, out2);
120   }
121 
122   @Test
testHmacDrbgNistCase5()123   public void testHmacDrbgNistCase5() {
124     byte[] entropy =
125       hexToBytes("4b222718f56a3260b3c2625a4cf80950b7d6c1250f170bd5c28b118abdf23b2f");
126     byte[] nonce = hexToBytes("7aed52d0016fcaef0b6492bc40bbe0e9");
127     byte[] expected = hexToBytes(
128       "a6da029b3665cd39fd50a54c553f99fed3626f4902ffe322dc51f0670dfe8742"
129       + "ed48415cf04bbad5ed3b23b18b7892d170a7dcf3ef8052d5717cb0c1a8b3010d"
130       + "9a9ea5de70ae5356249c0e098946030c46d9d3d209864539444374d8fbcae068"
131       + "e1d6548fa59e6562e6b2d1acbda8da0318c23752ebc9be0c1c1c5b3cf66dd967");
132 
133     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
134     byte[] out1 = new byte[1024 / 8];
135     drbg.nextBytes(out1);
136     byte[] out2 = new byte[1024 / 8];
137     drbg.nextBytes(out2);
138     assertArrayEquals(expected, out2);
139   }
140 
141   @Test
testHmacDrbgNistCase6()142   public void testHmacDrbgNistCase6() {
143     byte[] entropy =
144       hexToBytes("b512633f27fb182a076917e39888ba3ff35d23c3742eb8f3c635a044163768e0");
145     byte[] nonce = hexToBytes("e2c39b84629a3de5c301db5643af1c21");
146     byte[] expected = hexToBytes(
147       "fb931d0d0194a97b48d5d4c231fdad5c61aedf1c3a55ac24983ecbf38487b1c9"
148       + "3396c6b86ff3920cfa8c77e0146de835ea5809676e702dee6a78100da9aa43d8"
149       + "ec0bf5720befa71f82193205ac2ea403e8d7e0e6270b366dc4200be26afd9f63"
150       + "b7e79286a35c688c57cbff55ac747d4c28bb80a2b2097b3b62ea439950d75dff");
151 
152     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
153     byte[] out1 = new byte[1024 / 8];
154     drbg.nextBytes(out1);
155     byte[] out2 = new byte[1024 / 8];
156     drbg.nextBytes(out2);
157     assertArrayEquals(expected, out2);
158   }
159 
160   @Test
testHmacDrbgNistCase7()161   public void testHmacDrbgNistCase7() {
162     byte[] entropy =
163       hexToBytes("aae3ffc8605a975befefcea0a7a286642bc3b95fb37bd0eb0585a4cabf8b3d1e");
164     byte[] nonce = hexToBytes("9504c3c0c4310c1c0746a036c91d9034");
165     byte[] expected = hexToBytes(
166       "2819bd3b0d216dad59ddd6c354c4518153a2b04374b07c49e64a8e4d055575df"
167       + "bc9a8fcde68bd257ff1ba5c6000564b46d6dd7ecd9c5d684fd757df62d852115"
168       + "75d3562d7814008ab5c8bc00e7b5a649eae2318665b55d762de36eba00c2906c"
169       + "0e0ec8706edb493e51ca5eb4b9f015dc932f262f52a86b11c41e9a6d5b3bd431");
170 
171     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
172     byte[] out1 = new byte[1024 / 8];
173     drbg.nextBytes(out1);
174     byte[] out2 = new byte[1024 / 8];
175     drbg.nextBytes(out2);
176     assertArrayEquals(expected, out2);
177   }
178 
179   @Test
testHmacDrbgNistCase8()180   public void testHmacDrbgNistCase8() {
181     byte[] entropy =
182       hexToBytes("b9475210b79b87180e746df704b3cbc7bf8424750e416a7fbb5ce3ef25a82cc6");
183     byte[] nonce = hexToBytes("24baf03599c10df6ef44065d715a93f7");
184     byte[] expected = hexToBytes(
185       "ae12d784f796183c50db5a1a283aa35ed9a2b685dacea97c596ff8c294906d1b"
186       + "1305ba1f80254eb062b874a8dfffa3378c809ab2869aa51a4e6a489692284a25"
187       + "038908a347342175c38401193b8afc498077e10522bec5c70882b7f760ea5946"
188       + "870bd9fc72961eedbe8bff4fd58c7cc1589bb4f369ed0d3bf26c5bbc62e0b2b2");
189 
190     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
191     byte[] out1 = new byte[1024 / 8];
192     drbg.nextBytes(out1);
193     byte[] out2 = new byte[1024 / 8];
194     drbg.nextBytes(out2);
195     assertArrayEquals(expected, out2);
196   }
197 
198   @Test
testHmacDrbgNistCase9()199   public void testHmacDrbgNistCase9() {
200     byte[] entropy =
201       hexToBytes("27838eb44ceccb4e36210703ebf38f659bc39dd3277cd76b7a9bcd6bc964b628");
202     byte[] nonce = hexToBytes("39cfe0210db2e7b0eb52a387476e7ea1");
203     byte[] expected = hexToBytes(
204       "e5e72a53605d2aaa67832f97536445ab774dd9bff7f13a0d11fd27bf6593bfb5"
205       + "2309f2d4f09d147192199ea584503181de87002f4ee085c7dc18bf32ce531564"
206       + "7a3708e6f404d6588c92b2dda599c131aa350d18c747b33dc8eda15cf40e9526"
207       + "3d1231e1b4b68f8d829f86054d49cfdb1b8d96ab0465110569c8583a424a099a");
208 
209     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
210     byte[] out1 = new byte[1024 / 8];
211     drbg.nextBytes(out1);
212     byte[] out2 = new byte[1024 / 8];
213     drbg.nextBytes(out2);
214     assertArrayEquals(expected, out2);
215   }
216 
217   @Test
testHmacDrbgNistCase10()218   public void testHmacDrbgNistCase10() {
219     byte[] entropy =
220       hexToBytes("d7129e4f47008ad60c9b5d081ff4ca8eb821a6e4deb91608bf4e2647835373a5");
221     byte[] nonce = hexToBytes("a72882773f78c2fc4878295840a53012");
222     byte[] expected = hexToBytes(
223       "0cbf48585c5de9183b7ff76557f8fc9ebcfdfde07e588a8641156f61b7952725"
224       + "bbee954f87e9b937513b16bba0f2e523d095114658e00f0f3772175acfcb3240"
225       + "a01de631c19c5a834c94cc58d04a6837f0d2782fa53d2f9f65178ee9c8372224"
226       + "94c799e64c60406069bd319549b889fa00a0032dd7ba5b1cc9edbf58de82bfcd");
227 
228     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
229     byte[] out1 = new byte[1024 / 8];
230     drbg.nextBytes(out1);
231     byte[] out2 = new byte[1024 / 8];
232     drbg.nextBytes(out2);
233     assertArrayEquals(expected, out2);
234   }
235 
236   @Test
testHmacDrbgNistCase11()237   public void testHmacDrbgNistCase11() {
238     byte[] entropy =
239       hexToBytes("67fe5e300c513371976c80de4b20d4473889c9f1214bce718bc32d1da3ab7532");
240     byte[] nonce = hexToBytes("e256d88497738a33923aa003a8d7845c");
241     byte[] expected = hexToBytes(
242       "b44660d64ef7bcebc7a1ab71f8407a02285c7592d755ae6766059e894f694373"
243       + "ed9c776c0cfc8594413eefb400ed427e158d687e28da3ecc205e0f7370fb0896"
244       + "76bbb0fa591ec8d916c3d5f18a3eb4a417120705f3e2198154cd60648dbfcfc9"
245       + "01242e15711cacd501b2c2826abe870ba32da785ed6f1fdc68f203d1ab43a64f");
246 
247     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
248     byte[] out1 = new byte[1024 / 8];
249     drbg.nextBytes(out1);
250     byte[] out2 = new byte[1024 / 8];
251     drbg.nextBytes(out2);
252     assertArrayEquals(expected, out2);
253   }
254 
255   @Test
testHmacDrbgNistCase12()256   public void testHmacDrbgNistCase12() {
257     byte[] entropy =
258       hexToBytes("de8142541255c46d66efc6173b0fe3ffaf5936c897a3ce2e9d5835616aafa2cb");
259     byte[] nonce = hexToBytes("d01f9002c407127bc3297a561d89b81d");
260     byte[] expected = hexToBytes(
261       "64d1020929d74716446d8a4e17205d0756b5264867811aa24d0d0da8644db25d"
262       + "5cde474143c57d12482f6bf0f31d10af9d1da4eb6d701bdd605a8db74fb4e77f"
263       + "79aaa9e450afda50b18d19fae68f03db1d7b5f1738d2fdce9ad3ee9461b58ee2"
264       + "42daf7a1d72c45c9213eca34e14810a9fca5208d5c56d8066bab1586f1513de7");
265 
266     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
267     byte[] out1 = new byte[1024 / 8];
268     drbg.nextBytes(out1);
269     byte[] out2 = new byte[1024 / 8];
270     drbg.nextBytes(out2);
271     assertArrayEquals(expected, out2);
272   }
273 
274   @Test
testHmacDrbgNistCase13()275   public void testHmacDrbgNistCase13() {
276     byte[] entropy =
277       hexToBytes("4a8e0bd90bdb12f7748ad5f147b115d7385bb1b06aee7d8b76136a25d779bcb7");
278     byte[] nonce = hexToBytes("7f3cce4af8c8ce3c45bdf23c6b181a00");
279     byte[] expected = hexToBytes(
280       "320c7ca4bbeb7af977bc054f604b5086a3f237aa5501658112f3e7a33d2231f5"
281       + "536d2c85c1dad9d9b0bf7f619c81be4854661626839c8c10ae7fdc0c0b571be3"
282       + "4b58d66da553676167b00e7d8e49f416aacb2926c6eb2c66ec98bffae20864cf"
283       + "92496db15e3b09e530b7b9648be8d3916b3c20a3a779bec7d66da63396849aaf");
284 
285     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
286     byte[] out1 = new byte[1024 / 8];
287     drbg.nextBytes(out1);
288     byte[] out2 = new byte[1024 / 8];
289     drbg.nextBytes(out2);
290     assertArrayEquals(expected, out2);
291   }
292 
293   @Test
testHmacDrbgNistCase14()294   public void testHmacDrbgNistCase14() {
295     byte[] entropy =
296       hexToBytes("451ed024bc4b95f1025b14ec3616f5e42e80824541dc795a2f07500f92adc665");
297     byte[] nonce = hexToBytes("2f28e6ee8de5879db1eccd58c994e5f0");
298     byte[] expected = hexToBytes(
299       "3fb637085ab75f4e95655faae95885166a5fbb423bb03dbf0543be063bcd4879"
300       + "9c4f05d4e522634d9275fe02e1edd920e26d9accd43709cb0d8f6e50aa54a5f3"
301       + "bdd618be23cf73ef736ed0ef7524b0d14d5bef8c8aec1cf1ed3e1c38a808b35e"
302       + "61a44078127c7cb3a8fd7addfa50fcf3ff3bc6d6bc355d5436fe9b71eb44f7fd");
303 
304     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
305     byte[] out1 = new byte[1024 / 8];
306     drbg.nextBytes(out1);
307     byte[] out2 = new byte[1024 / 8];
308     drbg.nextBytes(out2);
309     assertArrayEquals(expected, out2);
310   }
311 
312   // ==== Test vectors for HMAC_DRBG with personalization. ====
313   @Test
testHmacDrbgNistWithPersonalizationCase0()314   public void testHmacDrbgNistWithPersonalizationCase0() {
315     byte[] entropy =
316       hexToBytes("5cacc68165a2e2ee20812f35ec73a79dbf30fd475476ac0c44fc6174cdac2b55");
317     byte[] nonce = hexToBytes("6f885496c1e63af620becd9e71ecb824");
318     byte[] personalizationString =
319       hexToBytes("e72dd8590d4ed5295515c35ed6199e9d211b8f069b3058caa6670b96ef1208d0");
320     byte[] expected = hexToBytes(
321       "f1012cf543f94533df27fedfbf58e5b79a3dc517a9c402bdbfc9a0c0f721f9d5"
322       + "3faf4aafdc4b8f7a1b580fcaa52338d4bd95f58966a243cdcd3f446ed4bc546d"
323       + "9f607b190dd69954450d16cd0e2d6437067d8b44d19a6af7a7cfa8794e5fbd72"
324       + "8e8fb2f2e8db5dd4ff1aa275f35886098e80ff844886060da8b1e7137846b23b");
325 
326     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
327     byte[] out1 = new byte[1024 / 8];
328     drbg.nextBytes(out1);
329     byte[] out2 = new byte[1024 / 8];
330     drbg.nextBytes(out2);
331     assertArrayEquals(expected, out2);
332   }
333 
334   @Test
testHmacDrbgNistWithPersonalizationCase1()335   public void testHmacDrbgNistWithPersonalizationCase1() {
336     byte[] entropy =
337       hexToBytes("8df013b4d103523073917ddf6a869793059e9943fc8654549e7ab22f7c29f122");
338     byte[] nonce = hexToBytes("da2625af2ddd4abcce3cf4fa4659d84e");
339     byte[] personalizationString =
340       hexToBytes("b571e66d7c338bc07b76ad3757bb2f9452bf7e07437ae8581ce7bc7c3ac651a9");
341     byte[] expected = hexToBytes(
342       "b91cba4cc84fa25df8610b81b641402768a2097234932e37d590b1154cbd23f9"
343       + "7452e310e291c45146147f0da2d81761fe90fba64f94419c0f662b28c1ed94da"
344       + "487bb7e73eec798fbcf981b791d1be4f177a8907aa3c401643a5b62b87b89d66"
345       + "b3a60e40d4a8e4e9d82af6d2700e6f535cdb51f75c321729103741030ccc3a56");
346 
347     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
348     byte[] out1 = new byte[1024 / 8];
349     drbg.nextBytes(out1);
350     byte[] out2 = new byte[1024 / 8];
351     drbg.nextBytes(out2);
352     assertArrayEquals(expected, out2);
353   }
354 
355   @Test
testHmacDrbgNistWithPersonalizationCase2()356   public void testHmacDrbgNistWithPersonalizationCase2() {
357     byte[] entropy =
358       hexToBytes("565b2b77937ba46536b0f693b3d5e4a8a24563f9ef1f676e8b5b2ef17823832f");
359     byte[] nonce = hexToBytes("4ef3064ec29f5b7f9686d75a23d170e3");
360     byte[] personalizationString =
361       hexToBytes("3b722433226c9dba745087270ab3af2c909425ba6d39f5ce46f07256068319d9");
362     byte[] expected = hexToBytes(
363       "d144ee7f8363d128872f82c15663fe658413cd42651098e0a7c51a970de75287"
364       + "ec943f9061e902280a5a9e183a7817a44222d198fbfab184881431b4adf35d3d"
365       + "1019da5a90b3696b2349c8fba15a56d0f9d010a88e3f9eeedb67a69bcaa71281"
366       + "b41afa11af576b765e66858f0eb2e4ec4081609ec81da81df0a0eb06787340ea");
367 
368     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
369     byte[] out1 = new byte[1024 / 8];
370     drbg.nextBytes(out1);
371     byte[] out2 = new byte[1024 / 8];
372     drbg.nextBytes(out2);
373     assertArrayEquals(expected, out2);
374   }
375 
376   @Test
testHmacDrbgNistWithPersonalizationCase3()377   public void testHmacDrbgNistWithPersonalizationCase3() {
378     byte[] entropy =
379       hexToBytes("fc3832a91b1dcdcaa944f2d93cbceb85c267c491b7b59d017cde4add79a836b6");
380     byte[] nonce = hexToBytes("d5e76ce9eabafed06e33a913e395c5e0");
381     byte[] personalizationString =
382       hexToBytes("ffc5f6eefd51da64a0f67b5f0cf60d7ab43fc7836bca650022a0cee57a43c148");
383     byte[] expected = hexToBytes(
384       "0e713c6cc9a4dbd4249201d12b7bf5c69c3e18eb504bf3252db2f43675e17d99"
385       + "b6a908400cea304011c2e54166dae1f20260008efe4e06a87e0ce525ca482bca"
386       + "223a902a14adcf2374a739a5dfeaf14cadd72efa4d55d15154c974d9521535bc"
387       + "b70658c5b6c944020afb04a87b223b4b8e5d89821704a9985bb010405ba8f3d4");
388 
389     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
390     byte[] out1 = new byte[1024 / 8];
391     drbg.nextBytes(out1);
392     byte[] out2 = new byte[1024 / 8];
393     drbg.nextBytes(out2);
394     assertArrayEquals(expected, out2);
395   }
396 
397   @Test
testHmacDrbgNistWithPersonalizationCase4()398   public void testHmacDrbgNistWithPersonalizationCase4() {
399     byte[] entropy =
400       hexToBytes("8009eb2cb49fdf16403bcdfd4a9f952191062acb9cc111eca019f957fb9f4451");
401     byte[] nonce = hexToBytes("355598866952394b1eddd85d59f81c9d");
402     byte[] personalizationString =
403       hexToBytes("09ff1d4b97d83b223d002e05f754be480d13ba968e5aac306d71cc9fc49cc2dd");
404     byte[] expected = hexToBytes(
405       "9550903c2f02cf77c8f9c9a37041d0040ee1e3ef65ba1a1fbbcf44fb7a2172bd"
406       + "6b3aaabe850281c3a1778277bacd09614dfefececac64338ae24a1bf150cbf9d"
407       + "9541173a82ecba08aa19b75abb779eb10efa4257d5252e8afcac414bc3bb5d30"
408       + "06b6f36fb9daea4c8c359ef6cdbeff27c1068571dd3c89dc87eda9190086888d");
409 
410     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
411     byte[] out1 = new byte[1024 / 8];
412     drbg.nextBytes(out1);
413     byte[] out2 = new byte[1024 / 8];
414     drbg.nextBytes(out2);
415     assertArrayEquals(expected, out2);
416   }
417 
418   @Test
testHmacDrbgNistWithPersonalizationCase5()419   public void testHmacDrbgNistWithPersonalizationCase5() {
420     byte[] entropy =
421       hexToBytes("a6e4c9a8bd6da23b9c2b10a7748fd08c4f782fadbac7ea501c17efdc6f6087bd");
422     byte[] nonce = hexToBytes("acdc47edf1d3b21d0aec7631abb6d7d5");
423     byte[] personalizationString =
424       hexToBytes("c16ee0908a5886dccf332fbc61de9ec7b7972d2c4c83c477409ce8a15c623294");
425     byte[] expected = hexToBytes(
426       "a52f93ccb363e2bdf0903622c3caedb7cffd04b726052b8d455744c71b76dee1"
427       + "b71db9880dc3c21850489cb29e412d7d80849cfa9151a151dcbf32a32b4a54ca"
428       + "c01d3200200ed66a3a5e5c131a49655ffbf1a8824ff7f265690dffb4054df46a"
429       + "707b9213924c631c5bce379944c856c4f7846e281ac89c64fad3a49909dfb92b");
430 
431     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
432     byte[] out1 = new byte[1024 / 8];
433     drbg.nextBytes(out1);
434     byte[] out2 = new byte[1024 / 8];
435     drbg.nextBytes(out2);
436     assertArrayEquals(expected, out2);
437   }
438 
439   @Test
testHmacDrbgNistWithPersonalizationCase6()440   public void testHmacDrbgNistWithPersonalizationCase6() {
441     byte[] entropy =
442       hexToBytes("59d6307460a9bdd392dfc0904973991d585696010a71e52d590a5039b4849fa4");
443     byte[] nonce = hexToBytes("34a0aafb95917cbf8c38fc5548373c05");
444     byte[] personalizationString =
445       hexToBytes("0407b7c57bc11361747c3d67526c36e228028a5d0b145d66ab9a2fe4b07507a0");
446     byte[] expected = hexToBytes(
447       "299aba0661315211b09d2861855d0b4b125ab24649461341af6abd903ed6f025"
448       + "223b3299f2126fcad44c675166d800619cf49540946b12138989417904324b0d"
449       + "dad121327211a297f11259c9c34ce4c70c322a653675f78d385e4e2443f8058d"
450       + "141195e17e0bd1b9d44bf3e48c376e6eb44ef020b11cf03eb141c46ecb43cf3d");
451 
452     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
453     byte[] out1 = new byte[1024 / 8];
454     drbg.nextBytes(out1);
455     byte[] out2 = new byte[1024 / 8];
456     drbg.nextBytes(out2);
457     assertArrayEquals(expected, out2);
458   }
459 
460   @Test
testHmacDrbgNistWithPersonalizationCase7()461   public void testHmacDrbgNistWithPersonalizationCase7() {
462     byte[] entropy =
463       hexToBytes("9ae3506aadbc8358696ba1ba17e876e1157b7048235921503d36d9211b430342");
464     byte[] nonce = hexToBytes("9abf7d66afee5d2b811cba358bbc527d");
465     byte[] personalizationString =
466       hexToBytes("0d645f6238e9ceb038e4af9772426ca110c5be052f8673b8b5a65c4e53d2f519");
467     byte[] expected = hexToBytes(
468       "5f032c7fec6320fe423b6f38085cbad59d826085afe915247b3d546c4c6b1745"
469       + "54dd4877c0d671de9554b505393a44e71f209b70f991ac8aa6e08f983fff2a4c"
470       + "817b0cd26c12b2c929378506489a75b2025b358cb5d0400821e7e252ac6376cd"
471       + "94a40c911a7ed8b6087e3de5fa39fa6b314c3ba1c593b864ce4ff281a97c325b");
472 
473     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
474     byte[] out1 = new byte[1024 / 8];
475     drbg.nextBytes(out1);
476     byte[] out2 = new byte[1024 / 8];
477     drbg.nextBytes(out2);
478     assertArrayEquals(expected, out2);
479   }
480 
481   @Test
testHmacDrbgNistWithPersonalizationCase8()482   public void testHmacDrbgNistWithPersonalizationCase8() {
483     byte[] entropy =
484       hexToBytes("96ae3b8775b36da2a29b889ad878941f43c7d51295d47440cd0e3c4999193109");
485     byte[] nonce = hexToBytes("1fe022a6fc0237b055d4d6a7036b18d5");
486     byte[] personalizationString =
487       hexToBytes("1e40e97362d0a823d3964c26b81ab53825c56446c5261689011886f19b08e5c2");
488     byte[] expected = hexToBytes(
489       "e707cd14b06ce1e6dbcceaedbf08d88891b03f44ad6a797bd12fdeb557d0151d"
490       + "f9346a028dec004844ca46adec3051dafb345895fa9f4604d8a13c8ff66ae093"
491       + "fa63c4d9c0816d55a0066d31e8404c841e87b6b2c7b5ae9d7afb6840c2f7b441"
492       + "bf2d3d8bd3f40349c1c014347c1979213c76103e0bece26ad7720601eff42275");
493 
494     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
495     byte[] out1 = new byte[1024 / 8];
496     drbg.nextBytes(out1);
497     byte[] out2 = new byte[1024 / 8];
498     drbg.nextBytes(out2);
499     assertArrayEquals(expected, out2);
500   }
501 
502   @Test
testHmacDrbgNistWithPersonalizationCase9()503   public void testHmacDrbgNistWithPersonalizationCase9() {
504     byte[] entropy =
505       hexToBytes("33f5120396336e51ee3b0b619b5f873db05ca57cda86aeae2964f51480d14992");
506     byte[] nonce = hexToBytes("6f1f6e9807ba5393edcf3cb4e4bb6113");
507     byte[] personalizationString =
508       hexToBytes("3709605af44d90196867c927512aa8ba31837063337b4879408d91a05c8efa9f");
509     byte[] expected = hexToBytes(
510       "8b8291126ded9acef12516025c99ccce225d844308b584b872c903c7bc646759"
511       + "9a1cead003dc4c70f6d519f5b51ce0da57f53da90dbe8f666a1a1dde297727fe"
512       + "e2d44cebd1301fc1ca75956a3fcae0d374e0df6009b668fd21638d2b733e6902"
513       + "d22d5bfb4af1b455975e08eef0ebe4dc87705801e7776583c8de11672729f723");
514 
515     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
516     byte[] out1 = new byte[1024 / 8];
517     drbg.nextBytes(out1);
518     byte[] out2 = new byte[1024 / 8];
519     drbg.nextBytes(out2);
520     assertArrayEquals(expected, out2);
521   }
522 
523   @Test
testHmacDrbgNistWithPersonalizationCase10()524   public void testHmacDrbgNistWithPersonalizationCase10() {
525     byte[] entropy =
526       hexToBytes("ad300b799005f290fee7f930eebce158b98fb6cb449987fe433f955456b35300");
527     byte[] nonce = hexToBytes("06aa2514e4bd114edf7ac105cfef2772");
528     byte[] personalizationString =
529       hexToBytes("87ada711465e4169da2a74c931afb9b5a5b190d07b7af342aa99570401c3ee8a");
530     byte[] expected = hexToBytes(
531       "80d7c606ff49415a3a92ba1f2943235c01339c8f9cd0b0511fbfdf3ef23c42ff"
532       + "ff008524193faaa4b7f2f2eb0cfa221d9df89bd373fe4e158ec06fad3ecf1eb4"
533       + "8b8239b0bb826ee69d773883a3e8edac66254610ff70b6609836860e39ea1f3b"
534       + "fa04596fee1f2baca6cebb244774c6c3eb4af1f02899eba8f4188f91776de16f");
535 
536     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
537     byte[] out1 = new byte[1024 / 8];
538     drbg.nextBytes(out1);
539     byte[] out2 = new byte[1024 / 8];
540     drbg.nextBytes(out2);
541     assertArrayEquals(expected, out2);
542   }
543 
544   @Test
testHmacDrbgNistWithPersonalizationCase11()545   public void testHmacDrbgNistWithPersonalizationCase11() {
546     byte[] entropy =
547       hexToBytes("130b044e2c15ab89375e54b72e7baae6d4cad734b013a090f4df057e634f6ff0");
548     byte[] nonce = hexToBytes("65fd6ac602cd44107d705dbc066e52b6");
549     byte[] personalizationString =
550       hexToBytes("f374aba16f34d54aae5e494505b67d3818ef1c08ea24967a76876d4361379aec");
551     byte[] expected = hexToBytes(
552       "5d179534fb0dba3526993ed8e27ec9f915183d967336bb24352c67f4ab5d7935"
553       + "d3168e57008da851515efbaecb69904b6d899d3bfa6e9805659aef2942c49038"
554       + "75b8fcbc0d1d24d1c075f0ff667c1fc240d8b410dff582fa71fa30878955ce2e"
555       + "d786ef32ef852706e62439b69921f26e84e0f54f62b938f04905f05fcd7c2204");
556 
557     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
558     byte[] out1 = new byte[1024 / 8];
559     drbg.nextBytes(out1);
560     byte[] out2 = new byte[1024 / 8];
561     drbg.nextBytes(out2);
562     assertArrayEquals(expected, out2);
563   }
564 
565   @Test
testHmacDrbgNistWithPersonalizationCase12()566   public void testHmacDrbgNistWithPersonalizationCase12() {
567     byte[] entropy =
568       hexToBytes("716430e999964b35459c17921fe5f60e09bd9ab234cb8f4ba4932bec4a60a1d5");
569     byte[] nonce = hexToBytes("9533b711e061b07d505da707cafbca03");
570     byte[] personalizationString =
571       hexToBytes("372ae616d1a1fc45c5aecad0939c49b9e01c93bfb40c835eebd837af747f079d");
572     byte[] expected = hexToBytes(
573       "a80d6a1b2d0ce01fe0d26e70fb73da20d45841cf01bfbd50b90d2751a46114c0"
574       + "e758cb787d281a0a9cf62f5c8ce2ee7ca74fefff330efe74926acca6d6f0646e"
575       + "4e3c1a1e52fce1d57b88beda4a5815896f25f38a652cc240deb582921c8b1d03"
576       + "a1da966dd04c2e7eee274df2cd1837096b9f7a0d89a82434076bc30173229a60");
577 
578     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
579     byte[] out1 = new byte[1024 / 8];
580     drbg.nextBytes(out1);
581     byte[] out2 = new byte[1024 / 8];
582     drbg.nextBytes(out2);
583     assertArrayEquals(expected, out2);
584   }
585 
586   @Test
testHmacDrbgNistWithPersonalizationCase13()587   public void testHmacDrbgNistWithPersonalizationCase13() {
588     byte[] entropy =
589       hexToBytes("7679f154296e6d580854826539003a82d1c54e2e062c619d00da6c6ac820789b");
590     byte[] nonce = hexToBytes("55d12941b0896462e7d888e5322a99a3");
591     byte[] personalizationString =
592       hexToBytes("ba4d1ed696f58ef64596c76cee87cc1ca83069a79e7982b9a06f9d62f4209faf");
593     byte[] expected = hexToBytes(
594       "10dc7cd2bb68c2c28f76d1b04ae2aa287071e04c3b688e1986b05cc1209f691d"
595       + "aa55868ebb05b633c75a40a32b49663185fe5bb8f906008347ef51590530948b"
596       + "87613920014802e5864e0758f012e1eae31f0c4c031ef823aecfb2f8a73aaa94"
597       + "6fc507037f9050b277bdeaa023123f9d22da1606e82cb7e56de34bf009eccb46");
598 
599     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
600     byte[] out1 = new byte[1024 / 8];
601     drbg.nextBytes(out1);
602     byte[] out2 = new byte[1024 / 8];
603     drbg.nextBytes(out2);
604     assertArrayEquals(expected, out2);
605   }
606 
607   @Test
testHmacDrbgNistWithPersonalizationCase14()608   public void testHmacDrbgNistWithPersonalizationCase14() {
609     byte[] entropy =
610       hexToBytes("8ca4a964e1ff68753db86753d09222e09b888b500be46f2a3830afa9172a1d6d");
611     byte[] nonce = hexToBytes("a59394e0af764e2f21cf751f623ffa6c");
612     byte[] personalizationString =
613       hexToBytes("eb8164b3bf6c1750a8de8528af16cffdf400856d82260acd5958894a98afeed5");
614     byte[] expected = hexToBytes(
615       "fc5701b508f0264f4fdb88414768e1afb0a5b445400dcfdeddd0eba67b4fea8c"
616       + "056d79a69fd050759fb3d626b29adb8438326fd583f1ba0475ce7707bd294ab0"
617       + "1743d077605866425b1cbd0f6c7bba972b30fbe9fce0a719b044fcc139435489"
618       + "5a9f8304a2b5101909808ddfdf66df6237142b6566588e4e1e8949b90c27fc1f");
619 
620     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), personalizationString);
621     byte[] out1 = new byte[1024 / 8];
622     drbg.nextBytes(out1);
623     byte[] out2 = new byte[1024 / 8];
624     drbg.nextBytes(out2);
625     assertArrayEquals(expected, out2);
626   }
627 
628   @Test
testHmacDrbgGenerateEntropyInput()629   public void testHmacDrbgGenerateEntropyInput() {
630     byte[] got = HmacDrbg.generateEntropyInput();
631     assertEquals(got.length, HmacDrbg.ENTROPY_INPUT_SIZE_BYTES);
632   }
633 
634   @Test
testHmacDrbgZeroLengthOutput()635   public void testHmacDrbgZeroLengthOutput() {
636     byte[] entropy =
637       hexToBytes("8ca4a964e1ff68753db86753d09222e09b888b500be46f2a3830afa9172a1d6d");
638     byte[] nonce = hexToBytes("a59394e0af764e2f21cf751f623ffa6c");
639     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
640     byte[] out = drbg.nextBytes(0);
641     assertArrayEquals(new byte[0], out);
642   }
643 
644   @Test
testHmacDrbgCanGenerateMaxBytesOutput()645   public void testHmacDrbgCanGenerateMaxBytesOutput() {
646     byte[] entropy =
647       hexToBytes("8ca4a964e1ff68753db86753d09222e09b888b500be46f2a3830afa9172a1d6d");
648     byte[] nonce = hexToBytes("a59394e0af764e2f21cf751f623ffa6c");
649     HmacDrbg drbg = new HmacDrbg(Bytes.concat(entropy, nonce), null);
650     byte[] out = drbg.nextBytes(HmacDrbg.MAX_BYTES_TOTAL);
651     assertEquals(HmacDrbg.MAX_BYTES_TOTAL, out.length);
652   }
653 }
654