comparison libtomcrypt/notes/rsa-testvectors/rt.py @ 1471:6dba84798cd5

Update to libtomcrypt 1.18.1, merged with Dropbear changes
author Matt Johnston <matt@ucc.asn.au>
date Fri, 09 Feb 2018 21:44:05 +0800
parents
children
comparison
equal deleted inserted replaced
1470:8bba51a55704 1471:6dba84798cd5
1 #!/usr/bin/env python
2
3 import sys
4 import os
5 import hashlib
6
7 def md5_for_file(path, block_size=256*128):
8 '''
9 Block size directly depends on the block size of your filesystem
10 to avoid performances issues
11 Here I have blocks of 4096 octets (Default NTFS)
12 '''
13 md5 = hashlib.md5()
14 with open(path,'rb') as f:
15 for chunk in iter(lambda: f.read(block_size), b''):
16 md5.update(chunk)
17 f.close()
18 return md5.hexdigest()
19
20 def read_until_ends(f, s):
21 while True:
22 l = f.readline()
23 if l.strip().endswith(s):
24 break
25 return l
26
27 def read_until_start(f, s):
28 while True:
29 l = f.readline()
30 if l.startswith(s):
31 break
32 return l
33
34 def read_hex(f):
35 t = []
36 while True:
37 l = f.readline()
38 if l.strip() == '':
39 break
40 t.extend(l.strip().split(' '))
41 return t
42
43 class NamedData(object):
44 def __init__(self, name, data):
45 self.name = name
46 self.data = data
47
48 def __str__(self):
49 return " /* {0} */\n {1},\n {{ {2} }}\n".format(self.name, len(self.data), ', '.join('0x' + x for x in self.data))
50
51 def read_part(f, s):
52 name = read_until_start(f, s).strip().lstrip('# ').rstrip(':')
53 data = read_hex(f)
54 e = NamedData(name, data)
55 return e
56
57 class RsaKey(object):
58 def __init__(self, n, e, d, p, q, dP, dQ, qInv):
59 self.n = n
60 self.e = e
61 self.d = d
62 self.p = p
63 self.q = q
64 self.dP = dP
65 self.dQ = dQ
66 self.qInv = qInv
67
68 def __str__(self):
69 return "{{\n{0},\n{1},\n{2},\n{3},\n{4},\n{5},\n{6},\n{7}\n}}\n".format(self.n, self.e, self.d, self.p, self.q, self.dP, self.dQ, self.qInv)
70
71 def read_key(f):
72 if ftype.version == 1:
73 read_until_start(f, '# Private key')
74 n = read_part(f, ftype.n)
75 e = read_part(f, ftype.e)
76 d = read_part(f, ftype.d)
77 p = read_part(f, ftype.p)
78 q = read_part(f, ftype.q)
79 dP = read_part(f, ftype.dP)
80 dQ = read_part(f, ftype.dQ)
81 qInv = read_part(f, ftype.qInv)
82 k = RsaKey(n, e, d, p, q, dP, dQ, qInv)
83 return k
84
85 class Data(object):
86 def __init__(self, name, obj1, obj2, obj3):
87 self.name = name
88 self.obj1 = obj1
89 self.obj2 = obj2
90 self.obj3 = obj3
91
92 def __str__(self):
93 if self.obj3 == None:
94 return "{{\n \"{0}\",\n{1},\n{2}\n}}\n,".format(self.name, self.obj1, self.obj2)
95 else:
96 return "{{\n \"{0}\",\n{1},\n{2},\n{3}\n}}\n,".format(self.name, self.obj1, self.obj2, self.obj3)
97
98 def read_data(f):
99 name = read_until_start(f, ftype.o).strip().lstrip('# ')
100 obj1 = read_part(f, ftype.o1)
101 obj2 = read_part(f, ftype.o2)
102 if ftype.name == 'emsa':
103 obj3 = None
104 else:
105 obj3 = read_part(f, ftype.o3)
106 s = Data(name, obj1, obj2, obj3)
107 return s
108
109 class Example(object):
110 def __init__(self, name, key, data):
111 self.name = name
112 self.key = key
113 self.data = data
114
115 def __str__(self):
116 res = "{{\n \"{0}\",\n{1},\n{{".format(self.name, str(self.key))
117 for idx, d in enumerate(self.data, 1):
118 if idx == 2:
119 res += '#ifdef LTC_TEST_EXT\n'
120 res += str(d) + '\n'
121 if idx == ftype.numcases:
122 res += '#endif /* LTC_TEST_EXT */\n'
123 res += '}\n},'
124 return res
125
126 def read_example(f):
127 name = read_until_start(f, '# Example').strip().lstrip('# ')
128 key = read_key(f)
129 l = read_until_start(f, ftype.sod)
130 d = []
131 while l.strip().startswith(ftype.sod):
132 if ftype.version == 1:
133 f.seek(-len(l), os.SEEK_CUR)
134 data = read_data(f)
135 d.append(data)
136 l = read_until_start(f, '#')
137
138 e = Example(name, key, d)
139 f.seek(-len(l), os.SEEK_CUR)
140 return e
141
142
143 class PkcsType(object):
144 def __init__(self, name):
145 if name == 'pss':
146 self.o = '# RSASSA-PSS Signature Example'
147 self.o1 = '# Message to be signed'
148 self.o2 = '# Salt'
149 self.o3 = '# Signature'
150 elif name == 'oaep':
151 self.o = '# RSAES-OAEP Encryption Example'
152 self.o1 = '# Message to be encrypted'
153 self.o2 = '# Seed'
154 self.o3 = '# Encryption'
155 elif name == 'emsa':
156 self.o = '# PKCS#1 v1.5 Signature Example'
157 self.o1 = '# Message to be signed'
158 self.o2 = '# Signature'
159 elif name == 'eme':
160 self.o = '# PKCS#1 v1.5 Encryption Example'
161 self.o1 = '# Message'
162 self.o2 = '# Seed'
163 self.o3 = '# Encryption'
164 else:
165 raise ValueError('Type unknown: ' + name)
166
167 if name == 'pss' or name == 'oaep':
168 self.version = 2
169 self.numcases = 6
170 self.n = '# RSA modulus n'
171 self.e = '# RSA public exponent e'
172 self.d = '# RSA private exponent d'
173 self.p = '# Prime p'
174 self.q = '# Prime q'
175 self.dP = '# p\'s CRT exponent dP'
176 self.dQ = '# q\'s CRT exponent dQ'
177 self.qInv = '# CRT coefficient qInv'
178 self.sod = '# --------------------------------'
179 elif name == 'emsa' or name == 'eme':
180 self.version = 1
181 self.numcases = 20
182 self.n = '# Modulus'
183 self.e = '# Public exponent'
184 self.d = '# Exponent'
185 self.p = '# Prime 1'
186 self.q = '# Prime 2'
187 self.dP = '# Prime exponent 1'
188 self.dQ = '# Prime exponent 2'
189 self.qInv = '# Coefficient'
190 self.sod = self.o
191 self.name = name
192
193 ftype = PkcsType(sys.argv[2])
194
195 print('/* Generated from file: %s\n * with md5 hash: %s\n */\n' % (sys.argv[1], md5_for_file(sys.argv[1])))
196 print('''
197 typedef struct rsaKey {
198 int n_l;
199 unsigned char n[256];
200 int e_l;
201 unsigned char e[256];
202 int d_l;
203 unsigned char d[256];
204 int p_l;
205 unsigned char p[256];
206 int q_l;
207 unsigned char q[256];
208 int dP_l;
209 unsigned char dP[256];
210 int dQ_l;
211 unsigned char dQ[256];
212 int qInv_l;
213 unsigned char qInv[256];
214 } rsaKey_t;
215
216 typedef struct rsaData {
217 const char* name;
218 int o1_l;
219 unsigned char o1[256];
220 int o2_l;
221 unsigned char o2[256];''')
222
223 if ftype.name != 'emsa':
224 print(''' int o3_l;
225 unsigned char o3[256];''')
226
227 print('''} rsaData_t;
228
229 typedef struct testcase {
230 const char* name;
231 rsaKey_t rsa;
232 #ifdef LTC_TEST_EXT
233 rsaData_t data[%d];
234 #else
235 rsaData_t data[1];
236 #endif /* LTC_TEST_EXT */
237 } testcase_t;
238
239 testcase_t testcases_%s[] =
240 {''' % (ftype.numcases, sys.argv[2]))
241
242 with open(sys.argv[1], 'rb') as f:
243 ex = []
244 while read_until_ends(f, '============================================='):
245 if f.tell() == os.path.getsize(sys.argv[1]):
246 break
247 e = read_example(f)
248 ex.append(e)
249
250 for i in ex:
251 print(i)
252 f.close()
253 print('};\n')