12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "net/quic/crypto/aes_128_gcm_12_decrypter.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::StringPiece; 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The AES GCM test vectors come from the file gcmDecrypt128.rsp 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// downloaded from http://csrc.nist.gov/groups/STM/cavp/index.html on 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2013-02-01. The test vectors in that file look like this: 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// [Keylen = 128] 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// [IVlen = 96] 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// [PTlen = 0] 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// [AADlen = 0] 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// [Taglen = 128] 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Count = 0 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Key = cf063a34d4a9a76c2c86787d3f96db71 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IV = 113b9785971864c83b01c787 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CT = 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AAD = 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tag = 72ac8493e3a5228b5d130a69d2510e42 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PT = 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Count = 1 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Key = a49a5e26a2f8cb63d05546c2a62f5343 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IV = 907763b19b9b4ab6bd4f0281 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CT = 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AAD = 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tag = a2be08210d8c470a8df6e8fbd79ec5cf 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FAIL 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ... 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The gcmDecrypt128.rsp file is huge (2.6 MB), so I selected just a 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// few test vectors for this unit test. 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Describes a group of test vectors that all have a given key length, IV 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// length, plaintext length, AAD length, and tag length. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct TestGroupInfo { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t key_len; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t iv_len; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t pt_len; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t aad_len; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t tag_len; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Each test vector consists of six strings of lowercase hexadecimal digits. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The strings may be empty (zero length). A test vector with a NULL |key| 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// marks the end of an array of test vectors. 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct TestVector { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Input: 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* key; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* iv; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ct; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* aad; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* tag; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expected output: 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* pt; // An empty string "" means decryption succeeded and 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the plaintext is zero-length. NULL means decryption 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // failed. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestGroupInfo test_group_info[] = { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 0, 0, 128 }, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 0, 128, 128 }, 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 128, 0, 128 }, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 408, 160, 128 }, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 408, 720, 128 }, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 104, 0, 128 }, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_0[] = { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "cf063a34d4a9a76c2c86787d3f96db71", 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "113b9785971864c83b01c787", 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "72ac8493e3a5228b5d130a69d2510e42", 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "" 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "a49a5e26a2f8cb63d05546c2a62f5343", 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "907763b19b9b4ab6bd4f0281", 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "a2be08210d8c470a8df6e8fbd79ec5cf", 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_1[] = { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "d1f6af919cde85661208bdce0c27cb22", 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "898c6929b435017bf031c3c5", 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "7c5faa40e636bbc91107e68010c92b9f", 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "ae45f11777540a2caeb128be8092468a", 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "2370e320d4344208e0ff5683f243b213", 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "04dbb82f044d30831c441228", 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "d43a8e5089eea0d026c03a85178b27da", 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2a049c049d25aa95969b451d93c31c6e", 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_2[] = { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "e98b72a9881a84ca6b76e0f43e68647a", 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "8b23299fde174053f3d652ba", 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5a3c1cf1985dbb8bed818036fdd5ab42", 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "23c7ab0f952b7091cd324835043b5eb5", 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "28286a321293253c3e0aa2704a278032" 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "33240636cd3236165f1a553b773e728e", 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "17c4d61493ecdc8f31700b12", 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "47bb7e23f7bdfe05a8091ac90e4f8b2e", 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b723c70e931d9785f40fd4ab1d612dc9", 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "95695a5b12f2870b9cc5fdc8f218a97d" 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "5164df856f1e9cac04a79b808dc5be39", 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e76925d5355e0584ce871b2b", 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "0216c899c88d6e32c958c7e553daa5bc", 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "a145319896329c96df291f64efbe0e3a", 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_3[] = { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "af57f42c60c0fc5a09adb81ab86ca1c3", 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "a2dc01871f37025dc0fc9a79", 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b9a535864f48ea7b6b1367914978f9bfa087d854bb0e269bed8d279d2eea1210e48947" 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "338b22f9bad09093276a331e9c79c7f4", 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "41dc38988945fcb44faf2ef72d0061289ef8efd8", 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "4f71e72bde0018f555c5adcce062e005", 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3803a0727eeb0ade441e0ec107161ded2d425ec0d102f21f51bf2cf9947c7ec4aa7279" 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5b2f69b041596e8817d0a3c16f8fadeb" 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ebc753e5422b377d3cb64b58ffa41b61", 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2e1821efaced9acf1f241c9b", 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "069567190554e9ab2b50a4e1fbf9c147340a5025fdbd201929834eaf6532325899ccb9" 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f401823e04b05817243d2142a3589878", 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b9673412fd4f88ba0e920f46dd6438ff791d8eef", 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "534d9234d2351cf30e565de47baece0b", 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "39077edb35e9c5a4b1e4c2a6b9bb1fce77f00f5023af40333d6d699014c2bcf4209c18" 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "353a18017f5b36bfc00b1f6dcb7ed485" 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "52bdbbf9cf477f187ec010589cb39d58", 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "d3be36d3393134951d324b31", 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "700188da144fa692cf46e4a8499510a53d90903c967f7f13e8a1bd8151a74adc4fe63e" 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "32b992760b3a5f99e9a47838867000a9", 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "93c4fc6a4135f54d640b0c976bf755a06a292c33", 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "8ca4e38aa3dfa6b1d0297021ccf3ea5f", 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_4[] = { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "da2bb7d581493d692380c77105590201", 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "44aa3e7856ca279d2eb020c6", 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "9290d430c9e89c37f0446dbd620c9a6b34b1274aeb6f911f75867efcf95b6feda69f1a" 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f4ee16c761b3c9aeac3da03aa9889c88", 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "4cd171b23bddb3a53cdf959d5c1710b481eb3785a90eb20a2345ee00d0bb7868c367ab" 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "12e6f4dd1dee72af4eee1d197777d1d6499cc541f34edbf45cda6ef90b3c024f9272d7" 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2ec1909fb8fba7db88a4d6f7d3d925980f9f9f72", 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "9e3ac938d3eb0cadd6f5c9e35d22ba38", 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "9bbf4c1a2742f6ac80cb4e8a052e4a8f4f07c43602361355b717381edf9fabd4cb7e3a" 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "d65dbd1378b196ac270588dd0621f642" 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "d74e4958717a9d5c0e235b76a926cae8", 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "0b7471141e0c70b1995fd7b1", 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e701c57d2330bf066f9ff8cf3ca4343cafe4894651cd199bdaaa681ba486b4a65c5a22" 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b0f1420be29ea547d42c713bc6af66aa", 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "4a42b7aae8c245c6f1598a395316e4b8484dbd6e64648d5e302021b1d3fa0a38f46e22" 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "bd9c8080b863dc0016482538a8562a4bd0ba84edbe2697c76fd039527ac179ec5506cf" 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "34a6039312774cedebf4961f3978b14a26509f96", 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e192c23cb036f0b31592989119eed55d", 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "840d9fb95e32559fb3602e48590280a172ca36d9b49ab69510f5bd552bfab7a306f85f" 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f0a34bc305b88b804c60b90add594a17" 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "1986310c725ac94ecfe6422e75fc3ee7", 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "93ec4214fa8e6dc4e3afc775", 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b178ec72f85a311ac4168f42a4b2c23113fbea4b85f4b9dabb74e143eb1b8b0a361e02" 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "43edfd365b90d5b325950df0ada058f9", 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e80b88e62c49c958b5e0b8b54f532d9ff6aa84c8a40132e93e55b59fc24e8decf28463" 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "139f155d1e8ce4ee76aaeefcd245baa0fc519f83a5fb9ad9aa40c4b21126013f576c42" 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "72c2cb136c8fd091cc4539877a5d1e72d607f960", 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "8b347853f11d75e81e8a95010be81f17", 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_5[] = { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "387218b246c1a8257748b56980e50c94", 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dd7e014198672be39f95b69d", 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "cdba9e73eaf3d38eceb2b04a8d", 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "ecf90f4a47c9c626d6fb2c765d201556", 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "48f5b426baca03064554cc2b30" 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "294de463721e359863887c820524b3d4", 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3338b35c9d57a5d28190e8c9", 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2f46634e74b8e4c89812ac83b9", 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dabd506764e68b82a7e720aa18da0abe", 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "46a2e55c8e264df211bd112685" 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "28ead7fd2179e0d12aa6d5d88c58c2dc", 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5055347f18b4d5add0ae5c41", 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "142d8210c3fb84774cdbd0447a", 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5fd321d9cdb01952dc85f034736c2a7d", 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3b95b981086ee73cc4d0cc1422" 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "7d7b6c988137b8d470c57bf674a09c87", 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "9edf2aa970d016ac962e1fd8", 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "a85b66c3cb5eab91d5bdc8bc0e", 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "dc054efc01f3afd21d9c2484819f569a", 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL // FAIL 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector* const test_group_array[] = { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_0, 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_1, 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_2, 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_3, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_4, 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_5, 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DecryptWithNonce wraps the |Decrypt| method of |decrypter| to allow passing 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// in an nonce and also to allocate the buffer needed for the plaintext. 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)QuicData* DecryptWithNonce(Aes128Gcm12Decrypter* decrypter, 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece nonce, 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece associated_data, 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece ciphertext) { 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t plaintext_size = ciphertext.length(); 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> plaintext(new char[plaintext_size]); 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!decrypter->Decrypt(nonce, associated_data, ciphertext, 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinterpret_cast<unsigned char*>(plaintext.get()), 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &plaintext_size)) { 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new QuicData(plaintext.release(), plaintext_size, true); 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(Aes128Gcm12DecrypterTest, Decrypt) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(test_group_array); i++) { 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCOPED_TRACE(i); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const TestVector* test_vectors = test_group_array[i]; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TestGroupInfo& test_info = test_group_info[i]; 275a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t j = 0; test_vectors[j].key != NULL; j++) { 276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // If not present then decryption is expected to fail. 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool has_pt = test_vectors[j].pt; 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Decode the test vector. 280a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string key; 281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string iv; 282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string ct; 283a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string aad; 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string tag; 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string pt; 286a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].key, &key)); 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].iv, &iv)); 288a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].ct, &ct)); 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].aad, &aad)); 290a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].tag, &tag)); 291a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (has_pt) { 292a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].pt, &pt)); 293a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test vector's lengths should look sane. Note that the lengths 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in |test_info| are in bits. 29723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.key_len, key.length() * 8); 29823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.iv_len, iv.length() * 8); 29923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.pt_len, ct.length() * 8); 30023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.aad_len, aad.length() * 8); 30123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.tag_len, tag.length() * 8); 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (has_pt) { 30323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.pt_len, pt.length() * 8); 304a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The test vectors have 16 byte authenticators but this code only uses 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the first 12. 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_LE(static_cast<size_t>(Aes128Gcm12Decrypter::kAuthTagSize), 30923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) tag.length()); 31023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) tag.resize(Aes128Gcm12Decrypter::kAuthTagSize); 31123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) string ciphertext = ct + tag; 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Aes128Gcm12Decrypter decrypter; 314a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(decrypter.SetKey(key)); 315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<QuicData> decrypted(DecryptWithNonce( 317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &decrypter, iv, 318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This deliberately tests that the decrypter can handle an AAD that 319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // is set to NULL, as opposed to a zero-length, non-NULL pointer. 32023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) aad.length() ? aad : StringPiece(), ciphertext)); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!decrypted.get()) { 322a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_FALSE(has_pt); 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 325a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(has_pt); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 32723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ASSERT_EQ(pt.length(), decrypted->length()); 328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test::CompareCharArraysWithHexError("plaintext", decrypted->data(), 32923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) pt.length(), pt.data(), pt.length()); 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 336