rt.py: initial version
This commit is contained in:
		
							parent
							
								
									b2317279b8
								
							
						
					
					
						commit
						6dfe0013e1
					
				
							
								
								
									
										179
									
								
								notes/rsa-testvectors/rt.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										179
									
								
								notes/rsa-testvectors/rt.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,179 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| import sys | ||||
| import os | ||||
| import hashlib | ||||
| 
 | ||||
| def md5_for_file(path, block_size=256*128): | ||||
| 	''' | ||||
| 	Block size directly depends on the block size of your filesystem | ||||
| 	to avoid performances issues | ||||
| 	Here I have blocks of 4096 octets (Default NTFS) | ||||
| 	''' | ||||
| 	md5 = hashlib.md5() | ||||
| 	with open(path,'rb') as f: | ||||
| 		for chunk in iter(lambda: f.read(block_size), b''): | ||||
| 			md5.update(chunk) | ||||
| 	f.close() | ||||
| 	return md5.hexdigest() | ||||
| 
 | ||||
| def read_until_eq(f, s): | ||||
| 	while True: | ||||
| 		l = f.readline() | ||||
| 		if l.strip() == s: | ||||
| 			break | ||||
| 	return l | ||||
| 
 | ||||
| def read_until_start(f, s): | ||||
| 	while True: | ||||
| 		l = f.readline() | ||||
| 		if l.startswith(s): | ||||
| 			break | ||||
| 	return l | ||||
| 
 | ||||
| def read_hex(f): | ||||
| 	t = [] | ||||
| 	while True: | ||||
| 		l = f.readline() | ||||
| 		if l.strip() == '': | ||||
| 			break | ||||
| 		t.extend(l.strip().split(' ')) | ||||
| 	return t | ||||
| 
 | ||||
| class NamedData(object): | ||||
| 	def __init__(self, name, data): | ||||
| 		self.name = name | ||||
| 		self.data = data | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		return "  /* {0} */\n  {1},\n  {{ {2} }}\n".format(self.name, len(self.data), ', '.join('0x' + x for x in self.data)) | ||||
| 
 | ||||
| def read_part(f, s): | ||||
| 	name = read_until_start(f, s).strip().lstrip('# ').rstrip(':') | ||||
| 	data = read_hex(f) | ||||
| 	e = NamedData(name, data) | ||||
| 	return e | ||||
| 
 | ||||
| class RsaKey(object): | ||||
| 	def __init__(self, n, e, d, q, p, dP, dQ, qInv): | ||||
| 		self.n = n | ||||
| 		self.e = e | ||||
| 		self.d = d | ||||
| 		self.q = q | ||||
| 		self.p = p | ||||
| 		self.dP = dP | ||||
| 		self.dQ = dQ | ||||
| 		self.qInv = qInv | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		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.q, self.p, self.dP, self.dQ, self.qInv) | ||||
| 
 | ||||
| def read_key(f): | ||||
| 	n = read_part(f, '# RSA modulus n') | ||||
| 	e = read_part(f, '# RSA public exponent e') | ||||
| 	d = read_part(f, '# RSA private exponent d') | ||||
| 	q = read_part(f, '# Prime p') | ||||
| 	p = read_part(f, '# Prime q') | ||||
| 	dP = read_part(f, '# p\'s CRT exponent dP') | ||||
| 	dQ = read_part(f, '# q\'s CRT exponent dQ') | ||||
| 	qInv = read_part(f, '# CRT coefficient qInv') | ||||
| 	k = RsaKey(n, e, d, q, p, dP, dQ, qInv) | ||||
| 	return k | ||||
| 
 | ||||
| class Signature(object): | ||||
| 	def __init__(self, name, msg, salt, sig): | ||||
| 		self.name = name | ||||
| 		self.msg = msg | ||||
| 		self.salt = salt | ||||
| 		self.sig = sig | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		return "{{\n  \"{0}\",\n{1},\n{2},\n{3}\n}}\n,".format(self.name, self.msg, self.salt, self.sig) | ||||
| 
 | ||||
| def read_sig(f): | ||||
| 	name = read_until_start(f, '# RSASSA-PSS Signature Example').strip().lstrip('# ') | ||||
| 	msg = read_part(f, '# Message to be signed') | ||||
| 	salt = read_part(f, '# Salt') | ||||
| 	sig = read_part(f, '# Signature') | ||||
| 	s = Signature(name, msg, salt, sig) | ||||
| 	return s | ||||
| 
 | ||||
| class Example(object): | ||||
| 	def __init__(self, name, key, s): | ||||
| 		self.name = name | ||||
| 		self.key = key | ||||
| 		self.s = s | ||||
| 
 | ||||
| 	def __str__(self): | ||||
| 		res = "{{/* {0} */\n{1},\n{{".format(self.name, str(self.key)) | ||||
| 		for i in self.s: | ||||
| 			res += str(i) + '\n' | ||||
| 		res += '}\n},' | ||||
| 		return res | ||||
| 
 | ||||
| def read_example(f): | ||||
| 	name = read_until_start(f, '# Example').strip().lstrip('# ') | ||||
| 	key = read_key(f) | ||||
| 	l = read_until_start(f, '#') | ||||
| 	s = [] | ||||
| 	while l.strip().startswith('# --------------------------------'): | ||||
| 		sig = read_sig(f) | ||||
| 		s.append(sig) | ||||
| 		l = read_until_start(f, '#') | ||||
| 
 | ||||
| 	e = Example(name, key, s) | ||||
| 	f.seek(-len(l), os.SEEK_CUR) | ||||
| 	return e | ||||
| 
 | ||||
| print('/* Generated from file: %s\n * with md5 hash: %s\n */\n' % (sys.argv[1], md5_for_file(sys.argv[1]))) | ||||
| print(''' | ||||
| typedef struct rsaKey { | ||||
|   int n_l; | ||||
|   unsigned char n[256]; | ||||
|   int e_l; | ||||
|   unsigned char e[256]; | ||||
|   int d_l; | ||||
|   unsigned char d[256]; | ||||
|   int p_l; | ||||
|   unsigned char p[256]; | ||||
|   int q_l; | ||||
|   unsigned char q[256]; | ||||
|   int dP_l; | ||||
|   unsigned char dP[256]; | ||||
|   int dQ_l; | ||||
|   unsigned char dQ[256]; | ||||
|   int qInv_l; | ||||
|   unsigned char qInv[256]; | ||||
| } rsaKey_t; | ||||
| 
 | ||||
| typedef struct rsaSig { | ||||
|   const char* name; | ||||
|   int msg_l; | ||||
|   unsigned char msg[256]; | ||||
|   int salt_l; | ||||
|   unsigned char salt[256]; | ||||
|   int sig_l; | ||||
|   unsigned char sig[256]; | ||||
| } rsaSig_t; | ||||
| 
 | ||||
| typedef struct testcase { | ||||
|   rsaKey_t rsa; | ||||
|   rsaSig_t sig[6]; | ||||
| } testcase_t; | ||||
| 
 | ||||
| testcase_t testcases[] = | ||||
|     {''') | ||||
| 
 | ||||
| with open(sys.argv[1], 'rb') as f: | ||||
| 	ex = [] | ||||
| 	while read_until_eq(f, '# ============================================='): | ||||
| 		if f.tell() == os.path.getsize(sys.argv[1]): | ||||
| 			break | ||||
| 		e = read_example(f) | ||||
| #		print e | ||||
| 		ex.append(e) | ||||
| 
 | ||||
| 	for i in ex: | ||||
| 		print(i) | ||||
| f.close() | ||||
| print('};\n') | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user