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_encrypter.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 gcmEncryptExtIV128.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 = 11754cd72aec309bf52f7687212e8957 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IV = 3c819d9a9bed087615030b65 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PT = 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AAD = 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CT = 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tag = 250327c674aaf477aef2675748cf6971 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Count = 1 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Key = ca47248ac0b6f8372a97ac43508308ed 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IV = ffd2b598feabc9019262d2be 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// PT = 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// AAD = 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CT = 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tag = 60d20404af527d248d893ae495707d1a 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ... 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The gcmEncryptExtIV128.rsp file is huge (2.8 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) const char* key; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* iv; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* pt; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* aad; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ct; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* tag; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestGroupInfo test_group_info[] = { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 0, 0, 128 }, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 0, 128, 128 }, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 128, 0, 128 }, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 408, 160, 128 }, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 408, 720, 128 }, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 128, 96, 104, 0, 128 }, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_0[] = { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "11754cd72aec309bf52f7687212e8957", 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3c819d9a9bed087615030b65", 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "250327c674aaf477aef2675748cf6971" 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ca47248ac0b6f8372a97ac43508308ed", 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "ffd2b598feabc9019262d2be", 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "60d20404af527d248d893ae495707d1a" 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_1[] = { 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "77be63708971c4e240d1cb79e8d77feb", 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e0e00f19fed7ba0136a797f3", 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "7a43ec1d9c0a5a78a0b16533a6213cab", 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "209fcc8d3675ed938e9c7166709dd946" 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "7680c5d3ca6154758e510f4d25b98820", 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f8f105f9c3df4965780321f8", 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "c94c410194c765e3dcc7964379758ed3", 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "94dca8edfcf90bb74b153c8d48a17930" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_2[] = { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "7fddb57453c241d03efbed3ac44e371c", 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "ee283a3fc75575e33efd4887", 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "d5de42b461646c255c87bd2962d3b9a2", 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2ccda4a5415cb91e135c2a0f78c9b2fd", 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b36d1df9b9d5e596f83e8b7f52971cb3" 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ab72c77b97cb5fe9a382d9fe81ffdbed", 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "54cc7dc2c37ec006bcc6d1da", 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "007c5e5b3e59df24a7c355584fc1518d", 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "0e1bde206a07a9c2c1b65300f8c64997", 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "2b4401346697138c7a4891ee59867d0c" 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_3[] = { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "fe47fcce5fc32665d2ae399e4eec72ba", 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5adb9609dbaeb58cbd6e7275", 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "7c0e88c88899a779228465074797cd4c2e1498d259b54390b85e3eef1c02df60e743f1" 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b840382c4bccaf3bafb4ca8429bea063", 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "88319d6e1d3ffa5f987199166c8a9b56c2aeba5a", 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "98f4826f05a265e6dd2be82db241c0fbbbf9ffb1c173aa83964b7cf539304373636525" 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3ddbc5db8778371495da76d269e5db3e", 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "291ef1982e4defedaa2249f898556b47" 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "ec0c2ba17aa95cd6afffe949da9cc3a8", 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "296bce5b50b7d66096d627ef", 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b85b3753535b825cbe5f632c0b843c741351f18aa484281aebec2f45bb9eea2d79d987" 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b764b9611f6c0f8641843d5d58f3a242", 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f8d00f05d22bf68599bcdeb131292ad6e2df5d14", 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "a7443d31c26bdf2a1c945e29ee4bd344a99cfaf3aa71f8b3f191f83c2adfc7a0716299" 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5506fde6309ffc19e716eddf1a828c5a", 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "890147971946b627c40016da1ecf3e77" 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_4[] = { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "2c1f21cf0f6fb3661943155c3e3d8492", 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "23cb5ff362e22426984d1907", 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "42f758836986954db44bf37c6ef5e4ac0adaf38f27252a1b82d02ea949c8a1a2dbc0d6" 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "8b5615ba7c1220ff6510e259f06655d8", 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "5d3624879d35e46849953e45a32a624d6a6c536ed9857c613b572b0333e701557a713e" 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3f010ecdf9a6bd6c9e3e44b065208645aff4aabee611b391528514170084ccf587177f" 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "4488f33cfb5e979e42b6e1cfc0a60238982a7aec", 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "81824f0e0d523db30d3da369fdc0d60894c7a0a20646dd015073ad2732bd989b14a222" 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b6ad57af43e1895df9dca2a5344a62cc", 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "57a3ee28136e94c74838997ae9823f3a" 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "d9f7d2411091f947b4d6f1e2d1f0fb2e", 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "e1934f5db57cc983e6b180e7", 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "73ed042327f70fe9c572a61545eda8b2a0c6e1d6c291ef19248e973aee6c312012f490" 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "c2c6f6166f4a59431e182663fcaea05a", 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "0a8a18a7150e940c3d87b38e73baee9a5c049ee21795663e264b694a949822b639092d" 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "0e67015e86363583fcf0ca645af9f43375f05fdb4ce84f411dcbca73c2220dea03a201" 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "15d2e51398344b16bee1ed7c499b353d6c597af8", 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "aaadbd5c92e9151ce3db7210b8714126b73e43436d242677afa50384f2149b831f1d57" 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "3c7891c2a91fbc48db29967ec9542b23", 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "21b51ca862cb637cdd03b99a0f93b134" 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector test_group_5[] = { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "fe9bb47deb3a61e423c2231841cfd1fb", 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "4d328eb776f500a2f7fb47aa", 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "f1cc3818e421876bb6b8bbd6c9", 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b88c5c1977b35b517b0aeae967", 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "43fd4727fe5cdb4b5b42818dea7ef8c9" 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { "6703df3701a7f54911ca72e24dca046a", 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "12823ab601c350ea4bc2488c", 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "793cd125b0b84a043e3ac67717", 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "", 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "b2051c80014f42f08735a7b0cd", 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "38e6bcd29962e5f2c13626b85a877101" 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { NULL } 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const TestVector* const test_group_array[] = { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_0, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_1, 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_2, 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_3, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_4, 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_group_5, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// EncryptWithNonce wraps the |Encrypt| method of |encrypter| to allow passing 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// in an nonce and also to allocate the buffer needed for the ciphertext. 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)QuicData* EncryptWithNonce(Aes128Gcm12Encrypter* encrypter, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece nonce, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece associated_data, 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringPiece plaintext) { 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t ciphertext_size = encrypter->GetCiphertextSize(plaintext.length()); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<char[]> ciphertext(new char[ciphertext_size]); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!encrypter->Encrypt(nonce, associated_data, plaintext, 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) reinterpret_cast<unsigned char*>(ciphertext.get()))) { 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return new QuicData(ciphertext.release(), ciphertext_size, true); 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(Aes128Gcm12EncrypterTest, Encrypt) { 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < arraysize(test_group_array); i++) { 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SCOPED_TRACE(i); 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const TestVector* test_vectors = test_group_array[i]; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TestGroupInfo& test_info = test_group_info[i]; 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (size_t j = 0; test_vectors[j].key != NULL; j++) { 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Decode the test vector. 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string key; 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string iv; 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string pt; 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string aad; 237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string ct; 238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) string tag; 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].key, &key)); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].iv, &iv)); 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].pt, &pt)); 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].aad, &aad)); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].ct, &ct)); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(DecodeHexString(test_vectors[j].tag, &tag)); 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The test vector's lengths should look sane. Note that the lengths 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in |test_info| are in bits. 24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.key_len, key.length() * 8); 24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.iv_len, iv.length() * 8); 25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.pt_len, pt.length() * 8); 25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.aad_len, aad.length() * 8); 25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.pt_len, ct.length() * 8); 25323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) EXPECT_EQ(test_info.tag_len, tag.length() * 8); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Aes128Gcm12Encrypter encrypter; 256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(encrypter.SetKey(key)); 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<QuicData> encrypted(EncryptWithNonce( 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) &encrypter, iv, 259a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This deliberately tests that the encrypter can handle an AAD that 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // is set to NULL, as opposed to a zero-length, non-NULL pointer. 26123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) aad.length() ? aad : StringPiece(), pt)); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(encrypted.get()); 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The test vectors have 16 byte authenticators but this code only uses 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // the first 12. 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_LE(static_cast<size_t>(Aes128Gcm12Encrypter::kAuthTagSize), 26723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) tag.length()); 26823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) tag.resize(Aes128Gcm12Encrypter::kAuthTagSize); 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 27023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ASSERT_EQ(ct.length() + tag.length(), encrypted->length()); 271b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) test::CompareCharArraysWithHexError("ciphertext", encrypted->data(), 27223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ct.length(), ct.data(), ct.length()); 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test::CompareCharArraysWithHexError( 27423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) "authentication tag", encrypted->data() + ct.length(), tag.length(), 27523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) tag.data(), tag.length()); 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(Aes128Gcm12EncrypterTest, GetMaxPlaintextSize) { 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Aes128Gcm12Encrypter encrypter; 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1000u, encrypter.GetMaxPlaintextSize(1012)); 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(100u, encrypter.GetMaxPlaintextSize(112)); 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(10u, encrypter.GetMaxPlaintextSize(22)); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(Aes128Gcm12EncrypterTest, GetCiphertextSize) { 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) Aes128Gcm12Encrypter encrypter; 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(1012u, encrypter.GetCiphertextSize(1000)); 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(112u, encrypter.GetCiphertextSize(100)); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(22u, encrypter.GetCiphertextSize(10)); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 296