Path: blob/main/python/pylang/test/aes_vectors.py
1396 views
# vim:fileencoding=utf-81# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>23from aes import CBC, CTR, GCM, generate_tag, as_hex, AES, string_to_bytes, random_bytes45def from_hex(text):6text = str.replace(text, ' ', '')7ans = Uint8Array(text.length // 2)8for i in range(ans.length):9ans[i] = int(text[2*i:2*i+2], 16)10return ans1112def from32(ints):13ans = Uint8Array(ints.length * 4)14for i, num in enumerate(ints):15off = i*416ans[off] = (num & 0xff000000) >> 2417ans[off+1] = (num & 0x00ff0000) >> 1618ans[off+2] = (num & 0x0000ff00) >> 819ans[off+3] = num & 0x000000ff20return ans2122def rungcm(keys, ivs, inputs, adatas, outputs, tags):23for i in range(keys.length):24iv = from_hex(ivs[i])25gcm = GCM(from_hex(keys[i]))26inputbytes = from_hex(inputs[i])27outputbytes = from_hex(outputs[i])28adata = from_hex(adatas[i])29ans = gcm._crypt(iv, inputbytes, adata, False)30assrt.equal(as_hex(ans.cipherbytes), outputs[i])31assrt.equal(as_hex(ans.tag), tags[i])32ans = gcm._crypt(iv, outputbytes, adata, True)33assrt.equal(as_hex(ans.cipherbytes), inputs[i])34assrt.equal(as_hex(ans.tag), tags[i])3536def run_tests():37# Test basic AES {{{38k1 = '000102030405060708090a0b0c0d0e0f'39k2 = k1 + '1011121314151617'40k3 = k2 + '18191a1b1c1d1e1f'41b = [0x00112233, 0x44556677, 0x8899aabb, 0xccddeeff]4243for data in [44(b, k1, '69c4e0d86a7b0430d8cdb78070b4c55a', False),45([0x69c4e0d8, 0x6a7b0430, 0xd8cdb780, 0x70b4c55a], k1, '00112233445566778899aabbccddeeff', True),46(b, k2, 'dda97ca4864cdfe06eaf70a0ec0d7191', False),47([0xdda97ca4, 0x864cdfe0, 0x6eaf70a0, 0xec0d7191], k2, '00112233445566778899aabbccddeeff', True),48(b, k3, '8ea2b7ca516745bfeafc49904b496089', False),49([0x8ea2b7ca, 0x516745bf, 0xeafc4990, 0x4b496089], k3, '00112233445566778899aabbccddeeff', True),50]:51block, key, expected, decrypt = data52aes = AES(from_hex(key))53output = Uint8Array(block.length * 4)54aes.decrypt32(block, output, 0) if decrypt else aes.encrypt32(block, output, 0)55assrt.equal(expected, as_hex(output))5657# Test AES-CBC58keys = [59'06a9214036b8a15b512e03d534120006',60'c286696d887c9aa0611bbb3e2025a45a',61'6c3ea0477630ce21a2ce334aa746c2cd',62'56e47a38c5598974bc46903dba290349'63]6465ivs = [66'3dafba429d9eb430b422da802c9fac41',67'562e17996d093d28ddb3ba695a2e6f58',68'c782dc4c098c66cbd9cd27d825682c81',69'8ce82eefbea0da3c44699ed7db51b7d9'70]7172inputs = [73'Single block msg',74'000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f',75'This is a 48-byte message (exactly 3 AES blocks)',76'a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf'77]7879outputs = [80'e353779c1079aeb82708942dbe77181a',81'd296cd94c2cccf8a3a863028b5e1dc0a7586602d253cfff91b8266bea6d61ab1',82'd0a02b3836451753d493665d33f0e8862dea54cdb293abc7506939276772f8d5021c19216bad525c8579695d83ba2684',83'c30e32ffedc0774e6aff6af0869f71aa0f3af07a9a31a9c684db207eb0ef8e4e35907aa632c3ffdf868bb7b29d3d46ad83ce9f9a102ee99d49a53e87f4c3da55'84]85for i in range(keys.length):86cbc = CBC(from_hex(keys[i]))87x = inputs[i]88inputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)89x = outputs[i]90outputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)91iv = from_hex(ivs[i])92ans = cbc.encrypt_bytes(inputbytes, [], iv)93assrt.equal(as_hex(ans.cipherbytes), outputs[i])94ans = cbc.decrypt_bytes(outputbytes, [], iv)95assrt.equal(as_hex(ans), as_hex(inputbytes))96# }}}9798# Test AES-CTR {{{99keys = [100'00000000000000000000000000000000',101'2b7e151628aed2a6abf7158809cf4f3c'102]103104ivs = [105'650cdb80ff9fc758342d2bd99ee2abcf',106'f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff'107]108109inputs = [110'This is a 48-byte message (exactly 3 AES blocks)',111'6bc1bee22e409f96e93d7e117393172a' 'ae2d8a571e03ac9c9eb76fac45af8e51' '30c81c46a35ce411e5fbc1191a0a52ef' 'f69f2445df4f9b17ad2b417be66c3710'112]113114outputs = [115'5ede11d00e9a76ec1d5e7e811ea3dd1c' 'e09ee941210f825d35718d3282796f1c' '07c3f1cb424f2b365766ab5229f5b5a4',116'874d6191b620e3261bef6864990db6ce' '9806f66b7970fdff8617187bb9fffdff' '5ae4df3edbd5d35e5b4f09020db03eab' '1e031dda2fbe03d1792170a0f3009cee'117]118119for i in range(keys.length):120iv = from_hex(ivs[i])121ctr = CTR(from_hex(keys[i]), iv)122x = inputs[i]123inputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)124x = outputs[i]125outputbytes = string_to_bytes(x) if ' ' in x else from_hex(x)126temp = Uint8Array(inputbytes)127ctr._crypt(temp)128assrt.equal(as_hex(temp), outputs[i])129# }}}130131# Test AES-GCM {{{132keys = [133'00000000000000000000000000000000',134'00000000000000000000000000000000',135'feffe9928665731c6d6a8f9467308308',136'feffe9928665731c6d6a8f9467308308',137'feffe9928665731c6d6a8f9467308308',138'feffe9928665731c6d6a8f9467308308',139'00000000000000000000000000000000'140]141142ivs = [143'000000000000000000000000',144'000000000000000000000000',145'cafebabefacedbaddecaf888',146'cafebabefacedbaddecaf888',147'cafebabefacedbad',148'9313225df88406e555909c5aff5269aa' + '6a7a9538534f7da1e4c303d2a318a728' + 'c3c0c95156809539fcf0e2429a6b5254' + '16aedbf5a0de6a57a637b39b',149'000000000000000000000000'150]151152adatas = [153'',154'',155'',156'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',157'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',158'feedfacedeadbeeffeedfacedeadbeef' + 'abaddad2',159''160]161162inputs = [163'',164'00000000000000000000000000000000',165'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b391aafd255',166'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',167'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',168'd9313225f88406e5a55909c5aff5269a' + '86a7a9531534f7da2e4c303d8a318a72' + '1c3c0c95956809532fcf0e2449a6b525' + 'b16aedf5aa0de657ba637b39',169'0000'170]171172outputs = [173'',174'0388dace60b6a392f328c2b971b2fe78',175'42831ec2217774244b7221b784d0d49c' + 'e3aa212f2c02a4e035c17e2329aca12e' + '21d514b25466931c7d8f6a5aac84aa05' + '1ba30b396a0aac973d58e091473f5985',176'42831ec2217774244b7221b784d0d49c' + 'e3aa212f2c02a4e035c17e2329aca12e' + '21d514b25466931c7d8f6a5aac84aa05' + '1ba30b396a0aac973d58e091',177'61353b4c2806934a777ff51fa22a4755' + '699b2a714fcdc6f83766e5f97b6c7423' + '73806900e49f24b22b097544d4896b42' + '4989b5e1ebac0f07c23f4598',178'8ce24998625615b603a033aca13fb894' + 'be9112a5c3a211a8ba262a3cca7e2ca7' + '01e4a9a4fba43c90ccdcb281d48c7c6f' + 'd62875d2aca417034c34aee5',179'0388'180]181182tags = [183'58e2fccefa7e3061367f1d57a4e7455a',184'ab6e47d42cec13bdf53a67b21257bddf',185'4d5c2af327cd64a62cf35abd2ba6fab4',186'5bc94fbc3221a5db94fae95ae7121a47',187'3612d2e79e3b0785561be14aaca2fccb',188'619cc5aefffe0bfa462af43c1699d050',189'93dcdd26f79ec1dd9bff57204d9b33f5'190]191rungcm(keys, ivs, inputs, adatas, outputs, tags)192193keys = [194'00000000000000000000000000000000' +195'0000000000000000',196'00000000000000000000000000000000' +197'0000000000000000',198'feffe9928665731c6d6a8f9467308308' +199'feffe9928665731c',200'feffe9928665731c6d6a8f9467308308' +201'feffe9928665731c',202'feffe9928665731c6d6a8f9467308308' +203'feffe9928665731c',204'feffe9928665731c6d6a8f9467308308' +205'feffe9928665731c'206]207208ivs = [209'000000000000000000000000',210'000000000000000000000000',211'cafebabefacedbaddecaf888',212'cafebabefacedbaddecaf888',213'cafebabefacedbad',214'9313225df88406e555909c5aff5269aa' +215'6a7a9538534f7da1e4c303d2a318a728' +216'c3c0c95156809539fcf0e2429a6b5254' +217'16aedbf5a0de6a57a637b39b'218]219220adatas = [221'',222'',223'',224'feedfacedeadbeeffeedfacedeadbeef' +225'abaddad2',226'feedfacedeadbeeffeedfacedeadbeef' +227'abaddad2',228'feedfacedeadbeeffeedfacedeadbeef' +229'abaddad2'230]231232inputs = [233'',234'00000000000000000000000000000000',235'd9313225f88406e5a55909c5aff5269a' +236'86a7a9531534f7da2e4c303d8a318a72' +237'1c3c0c95956809532fcf0e2449a6b525' +238'b16aedf5aa0de657ba637b391aafd255',239'd9313225f88406e5a55909c5aff5269a' +240'86a7a9531534f7da2e4c303d8a318a72' +241'1c3c0c95956809532fcf0e2449a6b525' +242'b16aedf5aa0de657ba637b39',243'd9313225f88406e5a55909c5aff5269a' +244'86a7a9531534f7da2e4c303d8a318a72' +245'1c3c0c95956809532fcf0e2449a6b525' +246'b16aedf5aa0de657ba637b39',247'd9313225f88406e5a55909c5aff5269a' +248'86a7a9531534f7da2e4c303d8a318a72' +249'1c3c0c95956809532fcf0e2449a6b525' +250'b16aedf5aa0de657ba637b39'251]252253outputs = [254'',255'98e7247c07f0fe411c267e4384b0f600',256'3980ca0b3c00e841eb06fac4872a2757' +257'859e1ceaa6efd984628593b40ca1e19c' +258'7d773d00c144c525ac619d18c84a3f47' +259'18e2448b2fe324d9ccda2710acade256',260'3980ca0b3c00e841eb06fac4872a2757' +261'859e1ceaa6efd984628593b40ca1e19c' +262'7d773d00c144c525ac619d18c84a3f47' +263'18e2448b2fe324d9ccda2710',264'0f10f599ae14a154ed24b36e25324db8' +265'c566632ef2bbb34f8347280fc4507057' +266'fddc29df9a471f75c66541d4d4dad1c9' +267'e93a19a58e8b473fa0f062f7',268'd27e88681ce3243c4830165a8fdcf9ff' +269'1de9a1d8e6b447ef6ef7b79828666e45' +270'81e79012af34ddd9e2f037589b292db3' +271'e67c036745fa22e7e9b7373b'272]273274tags = [275'cd33b28ac773f74ba00ed1f312572435',276'2ff58d80033927ab8ef4d4587514f0fb',277'9924a7c8587336bfb118024db8674a14',278'2519498e80f1478f37ba55bd6d27618c',279'65dcc57fcf623a24094fcca40d3533f8',280'dcf566ff291c25bbb8568fc3d376a6d9'281]282rungcm(keys, ivs, inputs, adatas, outputs, tags)283284keys = [285'00000000000000000000000000000000' +286'00000000000000000000000000000000',287'00000000000000000000000000000000' +288'00000000000000000000000000000000',289'feffe9928665731c6d6a8f9467308308' +290'feffe9928665731c6d6a8f9467308308',291'feffe9928665731c6d6a8f9467308308' +292'feffe9928665731c6d6a8f9467308308',293'feffe9928665731c6d6a8f9467308308' +294'feffe9928665731c6d6a8f9467308308',295'feffe9928665731c6d6a8f9467308308' +296'feffe9928665731c6d6a8f9467308308'297]298299ivs = [300'000000000000000000000000',301'000000000000000000000000',302'cafebabefacedbaddecaf888',303'cafebabefacedbaddecaf888',304'cafebabefacedbad',305'9313225df88406e555909c5aff5269aa' +306'6a7a9538534f7da1e4c303d2a318a728' +307'c3c0c95156809539fcf0e2429a6b5254' +308'16aedbf5a0de6a57a637b39b'309]310311adatas = [312'',313'',314'',315'feedfacedeadbeeffeedfacedeadbeef' +316'abaddad2',317'feedfacedeadbeeffeedfacedeadbeef' +318'abaddad2',319'feedfacedeadbeeffeedfacedeadbeef' +320'abaddad2'321]322323inputs = [324'',325'00000000000000000000000000000000',326'd9313225f88406e5a55909c5aff5269a' +327'86a7a9531534f7da2e4c303d8a318a72' +328'1c3c0c95956809532fcf0e2449a6b525' +329'b16aedf5aa0de657ba637b391aafd255',330'd9313225f88406e5a55909c5aff5269a' +331'86a7a9531534f7da2e4c303d8a318a72' +332'1c3c0c95956809532fcf0e2449a6b525' +333'b16aedf5aa0de657ba637b39',334'd9313225f88406e5a55909c5aff5269a' +335'86a7a9531534f7da2e4c303d8a318a72' +336'1c3c0c95956809532fcf0e2449a6b525' +337'b16aedf5aa0de657ba637b39',338'd9313225f88406e5a55909c5aff5269a' +339'86a7a9531534f7da2e4c303d8a318a72' +340'1c3c0c95956809532fcf0e2449a6b525' +341'b16aedf5aa0de657ba637b39'342]343344outputs = [345'',346'cea7403d4d606b6e074ec5d3baf39d18',347'522dc1f099567d07f47f37a32a84427d' +348'643a8cdcbfe5c0c97598a2bd2555d1aa' +349'8cb08e48590dbb3da7b08b1056828838' +350'c5f61e6393ba7a0abcc9f662898015ad',351'522dc1f099567d07f47f37a32a84427d' +352'643a8cdcbfe5c0c97598a2bd2555d1aa' +353'8cb08e48590dbb3da7b08b1056828838' +354'c5f61e6393ba7a0abcc9f662',355'c3762df1ca787d32ae47c13bf19844cb' +356'af1ae14d0b976afac52ff7d79bba9de0' +357'feb582d33934a4f0954cc2363bc73f78' +358'62ac430e64abe499f47c9b1f',359'5a8def2f0c9e53f1f75d7853659e2a20' +360'eeb2b22aafde6419a058ab4f6f746bf4' +361'0fc0c3b780f244452da3ebf1c5d82cde' +362'a2418997200ef82e44ae7e3f'363]364365tags = [366'530f8afbc74536b9a963b4f1c4cb738b',367'd0d1c8a799996bf0265b98b5d48ab919',368'b094dac5d93471bdec1a502270e3cc6c',369'76fc6ece0f4e1768cddf8853bb2d551b',370'3a337dbf46a792c45e454913fe2ea8f2',371'a44a8266ee1c8eb0c8b5d4cf5ae9f19a'372]373rungcm(keys, ivs, inputs, adatas, outputs, tags)374375# Test that IVs do not repeat (they are incrementing)376gcm = GCM(random_bytes(16))377for i in range(5):378iv = gcm.encrypt(str(i)).iv379assrt.equal(iv[11], i+1)380for j in range(10):381assrt.equal(iv[j], 0)382# Test that iv rollover is not allowed383gcm.current_iv.fill(255)384assrt.throws(def(): gcm.encrypt('iv over');)385386# }}}387388# Test roundtripping {{{389390text = 'testing a basic roundtrip ø̄ū'391392cbc = CBC()393crypted = cbc.encrypt(text)394decrypted = cbc.decrypt(crypted)395assrt.equal(text, decrypted)396secret_tag = generate_tag()397crypted = cbc.encrypt(text, secret_tag)398decrypted = cbc.decrypt(crypted, secret_tag)399assrt.equal(text, decrypted)400401ctr = CTR()402crypted = ctr.encrypt(text)403decrypted = ctr.decrypt(crypted)404assrt.equal(text, decrypted)405crypted = ctr.encrypt(text, secret_tag)406decrypted = ctr.decrypt(crypted, secret_tag)407assrt.equal(text, decrypted)408409gcm = GCM()410crypted = gcm.encrypt(text)411decrypted = gcm.decrypt(crypted)412assrt.equal(text, decrypted)413crypted = gcm.encrypt(text, secret_tag)414decrypted = gcm.decrypt(crypted, secret_tag)415assrt.equal(text, decrypted)416417assrt.ok(equals(from_hex('69c4e0d86a7b0430d8cdb78070b4c55a'), from32([0x69c4e0d8, 0x6a7b0430, 0xd8cdb780, 0x70b4c55a])))418# }}}419420run_tests()421422423