Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Bug 1508673 - Added ChachaPoly testcases from Wycheproof, r=franziskus
Summary: Adapted chacha20_poly1305 unittests to wycheproof testcases. Extended test vector header generation script to include chacha. Depends on D12559. Reviewers: franziskus Subscribers: jcj Bug #: 1508673 Differential Revision: https://phabricator.services.mozilla.com/D13798 --HG-- rename : gtests/common/wycheproof/genaesgcm.py => gtests/common/wycheproof/genTestVectors.py extra : rebase_source : 984ca2efe3af49964d501d93271a33f7561fde43
- Loading branch information
Jonas Allmann
committed
Dec 13, 2018
1 parent
c059dbf
commit 7bc70a3
Showing
7 changed files
with
5,176 additions
and
213 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
#!/usr/bin/env python3 | ||
# -*- coding: utf-8 -*- | ||
|
||
# This Source Code Form is subject to the terms of the Mozilla Public | ||
# License, v. 2.0. If a copy of the MPL was not distributed with this file, | ||
# You can obtain one at http://mozilla.org/MPL/2.0/. | ||
|
||
import json | ||
import os | ||
|
||
script_dir = os.path.dirname(os.path.abspath(__file__)) | ||
|
||
# Imports a JSON testvector file. | ||
def import_testvector(file): | ||
"""Import a JSON testvector file and return an array of the contained objects.""" | ||
with open(file) as f: | ||
vectors = json.loads(f.read()) | ||
return vectors | ||
|
||
# Convert a test data string to a hex array. | ||
def string_to_hex_array(string): | ||
"""Convert a string of hex chars to a string representing a C-format array of hex bytes.""" | ||
b = bytearray.fromhex(string) | ||
result = '{' + ', '.join("{:#04x}".format(x) for x in b) + '}' | ||
return result | ||
|
||
# Writes one AES-GCM testvector into C-header format. (Not clang-format conform) | ||
class AESGCM(): | ||
"""Class that provides the generator function for a single AES-GCM test case.""" | ||
|
||
def format_testcase(self, vector): | ||
"""Format an AES-GCM testcase object. Return a string in C-header format.""" | ||
result = '{{ {},\n'.format(vector['tcId']) | ||
for key in ['key', 'msg', 'aad', 'iv']: | ||
result += ' \"{}\",\n'.format(vector[key]) | ||
result += ' \"\",\n' | ||
result += ' \"{}\",\n'.format(vector['tag']) | ||
result += ' \"{}\",\n'.format(vector['ct'] + vector['tag']) | ||
result += ' {},\n'.format(str(vector['result'] == 'invalid').lower()) | ||
result += ' {}}},\n\n'.format(str('ZeroLengthIv' in vector['flags']).lower()) | ||
|
||
return result | ||
|
||
# Writes one ChaChaPoly testvector into C-header format. (Not clang-format conform) | ||
class ChaChaPoly(): | ||
"""Class that provides the generator function for a single ChaCha test case.""" | ||
|
||
def format_testcase(self, testcase): | ||
"""Format an ChaCha testcase object. Return a string in C-header format.""" | ||
result = '\n// Comment: {}'.format(testcase['comment']) | ||
result += '\n{{{},\n'.format(testcase['tcId']-1) | ||
for key in ['msg', 'aad', 'key', 'iv']: | ||
result += '{},\n'.format(string_to_hex_array(testcase[key])) | ||
ct = testcase['ct'] + testcase['tag'] | ||
result += '{},\n'.format(string_to_hex_array(ct)) | ||
result += '{},\n'.format(str(testcase['result'] == 'invalid').lower()) | ||
result += '{}}},\n'.format(str(testcase['comment'] == 'invalid nonce size').lower()) | ||
|
||
return result | ||
|
||
|
||
def generate_header(params): | ||
""" | ||
Generate and store a .h-file with test vectors for one test. | ||
params -- Dictionary with parameters for test vector generation for the desired test. | ||
""" | ||
|
||
cases = import_testvector(os.path.join(script_dir, params['source'])) | ||
|
||
with open(os.path.join(script_dir, params['base'])) as base: | ||
header = base.read() | ||
|
||
header = header[:params['crop_size_start']] | ||
header += '\n\n// Testvectors from project wycheproof\n' | ||
header += '// <https://github.com/google/wycheproof>\n' | ||
vectors_file = header + params['array_init'] | ||
|
||
for group in cases['testGroups']: | ||
for test in group['tests']: | ||
vectors_file += params['formatter'].format_testcase(test) | ||
|
||
vectors_file = vectors_file[:params['crop_size_end']] + '};\n\n' | ||
vectors_file += params['finish'] | ||
|
||
with open(os.path.join(script_dir, params['target']), 'w') as target: | ||
target.write(vectors_file) | ||
|
||
# Parameters that describe the generation of a testvector file for each supoorted testself. | ||
# source -- relaive path the wycheproof JSON source file with testvectorsself. | ||
# base -- relative path to the pre-fabricated .h-file with general defintions and non-wycheproof vectors. | ||
# target -- relative path to where the finished .h-file is written. | ||
# crop_size_start -- number of characters removed from the end of the base file at start. | ||
# array_init -- string to initialize the c-header style array of testvectors. | ||
# formatter -- the test case formatter class to be used for this test. | ||
# crop_size_end -- number of characters removed from the end of the last generated test vector to close the array definiton. | ||
# finish -- string to re-insert at the end and finish the file. (identical to chars cropped at the start) | ||
aes_gcm_params = { | ||
'source': 'testvectors/aes_gcm_test.json', | ||
'base': 'header_bases/gcm-vectors.h', | ||
'target': '../gcm-vectors.h', | ||
'crop_size_start': -27, | ||
'array_init': 'const gcm_kat_value kGcmWycheproofVectors[] = {\n', | ||
'formatter' : AESGCM(), | ||
'crop_size_end': -3, | ||
'finish': '#endif // gcm_vectors_h__\n' | ||
} | ||
|
||
chacha_poly_params = { | ||
'source': 'testvectors/chacha20_poly1305_test.json', | ||
'base': 'header_bases/chachapoly-vectors.h', | ||
'target': '../chachapoly-vectors.h', | ||
'crop_size_start': -35, | ||
'array_init': 'const chacha_testvector kChaCha20WycheproofVectors[] = {\n', | ||
'formatter' : ChaChaPoly(), | ||
'crop_size_end': -2, | ||
'finish': '#endif // chachapoly_vectors_h__\n' | ||
} | ||
|
||
def generate_test_vectors(): | ||
"""Generate C-header files for all supported tests.""" | ||
all_params = [aes_gcm_params, chacha_poly_params] | ||
for param in all_params: | ||
generate_header(param) | ||
|
||
def main(): | ||
generate_test_vectors() | ||
|
||
if __name__ == '__main__': | ||
main() |
This file was deleted.
Oops, something went wrong.
117 changes: 117 additions & 0 deletions
117
gtests/common/wycheproof/header_bases/chachapoly-vectors.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
/* vim: set ts=2 et sw=2 tw=80: */ | ||
/* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this file, | ||
* You can obtain one at http://mozilla.org/MPL/2.0/. */ | ||
|
||
/* This file is generated from sources in nss/gtests/common/wycheproof | ||
* automatically and should not be touched manually. | ||
* Generation is trigged by calling ./mach wycheproof */ | ||
|
||
#ifndef chachapoly_vectors_h__ | ||
#define chachapoly_vectors_h__ | ||
|
||
#include <string> | ||
#include <vector> | ||
|
||
typedef struct chacha_testvector_str { | ||
uint32_t id; | ||
std::vector<uint8_t> Data; | ||
std::vector<uint8_t> AAD; | ||
std::vector<uint8_t> Key; | ||
std::vector<uint8_t> IV; | ||
std::vector<uint8_t> CT; | ||
bool invalid_tag; | ||
bool invalid_iv; | ||
} chacha_testvector; | ||
|
||
// ChaCha20/Poly1305 Test Vector 1, RFC 7539 | ||
// <http://tools.ietf.org/html/rfc7539#section-2.8.2> | ||
// ChaCha20/Poly1305 Test Vector 2, RFC 7539 | ||
// <http://tools.ietf.org/html/rfc7539#appendix-A.5> | ||
const chacha_testvector kChaCha20Vectors[] = { | ||
{0, | ||
{0x4c, 0x61, 0x64, 0x69, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, | ||
0x65, 0x6e, 0x74, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, | ||
0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6f, 0x66, | ||
0x20, 0x27, 0x39, 0x39, 0x3a, 0x20, 0x49, 0x66, 0x20, 0x49, 0x20, 0x63, | ||
0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x20, 0x79, | ||
0x6f, 0x75, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x65, 0x20, | ||
0x74, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, | ||
0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x6e, 0x73, | ||
0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, | ||
0x62, 0x65, 0x20, 0x69, 0x74, 0x2e}, | ||
{0x50, 0x51, 0x52, 0x53, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7}, | ||
{0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, | ||
0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, | ||
0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f}, | ||
{0x07, 0x00, 0x00, 0x00, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47}, | ||
{0xd3, 0x1a, 0x8d, 0x34, 0x64, 0x8e, 0x60, 0xdb, 0x7b, 0x86, 0xaf, 0xbc, | ||
0x53, 0xef, 0x7e, 0xc2, 0xa4, 0xad, 0xed, 0x51, 0x29, 0x6e, 0x08, 0xfe, | ||
0xa9, 0xe2, 0xb5, 0xa7, 0x36, 0xee, 0x62, 0xd6, 0x3d, 0xbe, 0xa4, 0x5e, | ||
0x8c, 0xa9, 0x67, 0x12, 0x82, 0xfa, 0xfb, 0x69, 0xda, 0x92, 0x72, 0x8b, | ||
0x1a, 0x71, 0xde, 0x0a, 0x9e, 0x06, 0x0b, 0x29, 0x05, 0xd6, 0xa5, 0xb6, | ||
0x7e, 0xcd, 0x3b, 0x36, 0x92, 0xdd, 0xbd, 0x7f, 0x2d, 0x77, 0x8b, 0x8c, | ||
0x98, 0x03, 0xae, 0xe3, 0x28, 0x09, 0x1b, 0x58, 0xfa, 0xb3, 0x24, 0xe4, | ||
0xfa, 0xd6, 0x75, 0x94, 0x55, 0x85, 0x80, 0x8b, 0x48, 0x31, 0xd7, 0xbc, | ||
0x3f, 0xf4, 0xde, 0xf0, 0x8e, 0x4b, 0x7a, 0x9d, 0xe5, 0x76, 0xd2, 0x65, | ||
0x86, 0xce, 0xc6, 0x4b, 0x61, 0x16, 0x1a, 0xe1, 0x0b, 0x59, 0x4f, 0x09, | ||
0xe2, 0x6a, 0x7e, 0x90, 0x2e, 0xcb, 0xd0, 0x60, 0x06, 0x91}, | ||
false, | ||
false}, | ||
{1, | ||
{0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x2d, 0x44, 0x72, 0x61, | ||
0x66, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x72, 0x61, 0x66, | ||
0x74, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, | ||
0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, | ||
0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6f, 0x66, 0x20, 0x73, | ||
0x69, 0x78, 0x20, 0x6d, 0x6f, 0x6e, 0x74, 0x68, 0x73, 0x20, 0x61, 0x6e, | ||
0x64, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x75, 0x70, 0x64, | ||
0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, | ||
0x65, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x73, 0x6f, 0x6c, | ||
0x65, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6f, 0x74, 0x68, 0x65, | ||
0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x20, | ||
0x61, 0x74, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, | ||
0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x61, 0x70, 0x70, | ||
0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, | ||
0x75, 0x73, 0x65, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, | ||
0x2d, 0x44, 0x72, 0x61, 0x66, 0x74, 0x73, 0x20, 0x61, 0x73, 0x20, 0x72, | ||
0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6d, 0x61, 0x74, | ||
0x65, 0x72, 0x69, 0x61, 0x6c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, | ||
0x63, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x6f, 0x74, | ||
0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x61, 0x73, 0x20, | ||
0x2f, 0xe2, 0x80, 0x9c, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x69, 0x6e, 0x20, | ||
0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x2f, 0xe2, 0x80, | ||
0x9d}, | ||
{0xf3, 0x33, 0x88, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x91}, | ||
{0x1c, 0x92, 0x40, 0xa5, 0xeb, 0x55, 0xd3, 0x8a, 0xf3, 0x33, 0x88, | ||
0x86, 0x04, 0xf6, 0xb5, 0xf0, 0x47, 0x39, 0x17, 0xc1, 0x40, 0x2b, | ||
0x80, 0x09, 0x9d, 0xca, 0x5c, 0xbc, 0x20, 0x70, 0x75, 0xc0}, | ||
{0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, | ||
{0x64, 0xa0, 0x86, 0x15, 0x75, 0x86, 0x1a, 0xf4, 0x60, 0xf0, 0x62, 0xc7, | ||
0x9b, 0xe6, 0x43, 0xbd, 0x5e, 0x80, 0x5c, 0xfd, 0x34, 0x5c, 0xf3, 0x89, | ||
0xf1, 0x08, 0x67, 0x0a, 0xc7, 0x6c, 0x8c, 0xb2, 0x4c, 0x6c, 0xfc, 0x18, | ||
0x75, 0x5d, 0x43, 0xee, 0xa0, 0x9e, 0xe9, 0x4e, 0x38, 0x2d, 0x26, 0xb0, | ||
0xbd, 0xb7, 0xb7, 0x3c, 0x32, 0x1b, 0x01, 0x00, 0xd4, 0xf0, 0x3b, 0x7f, | ||
0x35, 0x58, 0x94, 0xcf, 0x33, 0x2f, 0x83, 0x0e, 0x71, 0x0b, 0x97, 0xce, | ||
0x98, 0xc8, 0xa8, 0x4a, 0xbd, 0x0b, 0x94, 0x81, 0x14, 0xad, 0x17, 0x6e, | ||
0x00, 0x8d, 0x33, 0xbd, 0x60, 0xf9, 0x82, 0xb1, 0xff, 0x37, 0xc8, 0x55, | ||
0x97, 0x97, 0xa0, 0x6e, 0xf4, 0xf0, 0xef, 0x61, 0xc1, 0x86, 0x32, 0x4e, | ||
0x2b, 0x35, 0x06, 0x38, 0x36, 0x06, 0x90, 0x7b, 0x6a, 0x7c, 0x02, 0xb0, | ||
0xf9, 0xf6, 0x15, 0x7b, 0x53, 0xc8, 0x67, 0xe4, 0xb9, 0x16, 0x6c, 0x76, | ||
0x7b, 0x80, 0x4d, 0x46, 0xa5, 0x9b, 0x52, 0x16, 0xcd, 0xe7, 0xa4, 0xe9, | ||
0x90, 0x40, 0xc5, 0xa4, 0x04, 0x33, 0x22, 0x5e, 0xe2, 0x82, 0xa1, 0xb0, | ||
0xa0, 0x6c, 0x52, 0x3e, 0xaf, 0x45, 0x34, 0xd7, 0xf8, 0x3f, 0xa1, 0x15, | ||
0x5b, 0x00, 0x47, 0x71, 0x8c, 0xbc, 0x54, 0x6a, 0x0d, 0x07, 0x2b, 0x04, | ||
0xb3, 0x56, 0x4e, 0xea, 0x1b, 0x42, 0x22, 0x73, 0xf5, 0x48, 0x27, 0x1a, | ||
0x0b, 0xb2, 0x31, 0x60, 0x53, 0xfa, 0x76, 0x99, 0x19, 0x55, 0xeb, 0xd6, | ||
0x31, 0x59, 0x43, 0x4e, 0xce, 0xbb, 0x4e, 0x46, 0x6d, 0xae, 0x5a, 0x10, | ||
0x73, 0xa6, 0x72, 0x76, 0x27, 0x09, 0x7a, 0x10, 0x49, 0xe6, 0x17, 0xd9, | ||
0x1d, 0x36, 0x10, 0x94, 0xfa, 0x68, 0xf0, 0xff, 0x77, 0x98, 0x71, 0x30, | ||
0x30, 0x5b, 0xea, 0xba, 0x2e, 0xda, 0x04, 0xdf, 0x99, 0x7b, 0x71, 0x4d, | ||
0x6c, 0x6f, 0x2c, 0x29, 0xa6, 0xad, 0x5c, 0xb4, 0x02, 0x2b, 0x02, 0x70, | ||
0x9b, 0xee, 0xad, 0x9d, 0x67, 0x89, 0x0c, 0xbb, 0x22, 0x39, 0x23, 0x36, | ||
0xfe, 0xa1, 0x85, 0x1f, 0x38}, | ||
false, | ||
false}}; | ||
|
||
#endif // chachapoly_vectors_h__ |
Oops, something went wrong.