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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 629 public void testHmacDrbgGenerateEntropyInput() { 630 byte[] got = HmacDrbg.generateEntropyInput(); 631 assertEquals(got.length, HmacDrbg.ENTROPY_INPUT_SIZE_BYTES); 632 } 633 634 @Test 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 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