commit
						78e367895a
					
				@ -24,6 +24,10 @@ int main(void)
 | 
			
		||||
   printf("\nmodes_test...."); fflush(stdout); x = modes_test();       printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\nder_test......"); fflush(stdout); x = der_tests();        printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\npkcs_1_test..."); fflush(stdout); x = pkcs_1_test();      printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\npkcs_1_pss_test...."); fflush(stdout); x = pkcs_1_pss_test();       printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\npkcs_1_oaep_test...."); fflush(stdout); x = pkcs_1_oaep_test();       printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\npkcs_1_emsa_test...."); fflush(stdout); x = pkcs_1_emsa_test();       printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\npkcs_1_eme_test...."); fflush(stdout); x = pkcs_1_eme_test();       printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\nrsa_test......"); fflush(stdout); x = rsa_test();         printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\ndh_test......."); fflush(stdout); x = dh_test();          printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
   printf("\necc_test......"); fflush(stdout); x = ecc_tests();        printf(x ? "failed" : "passed");if (x) exit(EXIT_FAILURE);
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										11
									
								
								notes/rsa-testvectors/makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								notes/rsa-testvectors/makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
default: regen
 | 
			
		||||
 | 
			
		||||
clean:
 | 
			
		||||
	rm -f *.c
 | 
			
		||||
 | 
			
		||||
regen:
 | 
			
		||||
	python rt.py pss-vect.txt pss > pss-vect.c
 | 
			
		||||
	python rt.py oaep-vect.txt oaep > oaep-vect.c
 | 
			
		||||
	python rt.py pkcs1v15sign-vectors.txt emsa > pkcs1v15sign-vectors.c
 | 
			
		||||
	python rt.py pkcs1v15crypt-vectors.txt eme > pkcs1v15crypt-vectors.c
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										369
									
								
								notes/rsa-testvectors/oaep-int.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										369
									
								
								notes/rsa-testvectors/oaep-int.txt
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,369 @@
 | 
			
		||||
# =================================
 | 
			
		||||
# WORKED-OUT EXAMPLE FOR RSAES-OAEP
 | 
			
		||||
# =================================
 | 
			
		||||
# 
 | 
			
		||||
# This file gives an example of the process of
 | 
			
		||||
# encrypting and decrypting a message with
 | 
			
		||||
# RSAES-OAEP as specified in PKCS #1 v2.1.
 | 
			
		||||
#
 | 
			
		||||
# The message is a bit string of length 128,
 | 
			
		||||
# while the size of the modulus in the public
 | 
			
		||||
# key is 1024 bits. The second representation
 | 
			
		||||
# of the private key is used, which means that
 | 
			
		||||
# CRT is applied in the decryption process.
 | 
			
		||||
# 
 | 
			
		||||
# The underlying hash function is SHA-1; the
 | 
			
		||||
# mask generation function is MGF1 with SHA-1
 | 
			
		||||
# as specified in PKCS #1 v2.1.
 | 
			
		||||
#
 | 
			
		||||
# This file also contains a demonstration of
 | 
			
		||||
# the RSADP decryption primitive with CRT.
 | 
			
		||||
# Finally, DER encodings of the RSA keys are
 | 
			
		||||
# given at the end of the file.
 | 
			
		||||
#
 | 
			
		||||
# 
 | 
			
		||||
# Integers are represented by strings of octets
 | 
			
		||||
# with the leftmost octet being the most
 | 
			
		||||
# significant octet. For example, 
 | 
			
		||||
#
 | 
			
		||||
#           9,202,000 = (0x)8c 69 50. 
 | 
			
		||||
#
 | 
			
		||||
# =============================================
 | 
			
		||||
 | 
			
		||||
# ------------------------------
 | 
			
		||||
# Components of the RSA Key Pair
 | 
			
		||||
# ------------------------------
 | 
			
		||||
 
 | 
			
		||||
# RSA modulus n:
 | 
			
		||||
bb f8 2f 09 06 82 ce 9c 23 38 ac 2b 9d a8 71 f7 
 | 
			
		||||
36 8d 07 ee d4 10 43 a4 40 d6 b6 f0 74 54 f5 1f 
 | 
			
		||||
b8 df ba af 03 5c 02 ab	61 ea 48 ce eb 6f cd 48 
 | 
			
		||||
76 ed 52 0d 60 e1 ec 46 19 71 9d 8a 5b 8b 80 7f 
 | 
			
		||||
af b8 e0 a3 df c7 37 72 3e e6 b4 b7 d9 3a 25 84 
 | 
			
		||||
ee 6a 64 9d 06 09 53 74 88 34 b2 45 45 98 39 4e 
 | 
			
		||||
e0 aa b1 2d 7b 61 a5 1f 52 7a 9a 41 f6 c1 68 7f 
 | 
			
		||||
e2 53 72 98 ca 2a 8f 59	46 f8 e5 fd 09 1d bd cb 
 | 
			
		||||
 | 
			
		||||
# RSA public exponent e:
 | 
			
		||||
(0x)11 
 | 
			
		||||
 | 
			
		||||
# Prime p:
 | 
			
		||||
ee cf ae 81 b1 b9 b3 c9 08 81 0b 10 a1 b5 60 01 
 | 
			
		||||
99 eb 9f 44 ae f4 fd a4 93 b8 1a 9e 3d 84 f6 32 
 | 
			
		||||
12 4e f0 23 6e 5d 1e 3b 7e 28 fa e7 aa 04 0a 2d 
 | 
			
		||||
5b 25 21 76 45 9d 1f 39 75 41 ba 2a 58 fb 65 99 
 | 
			
		||||
 | 
			
		||||
# Prime q:
 | 
			
		||||
c9 7f b1 f0 27 f4 53 f6 34 12 33 ea aa d1 d9 35 
 | 
			
		||||
3f 6c 42 d0 88 66 b1 d0 5a 0f 20 35 02 8b 9d 86 
 | 
			
		||||
98 40 b4 16 66 b4 2e 92 ea 0d a3 b4 32 04 b5 cf 
 | 
			
		||||
ce 33 52 52 4d 04 16 a5 a4 41 e7 00 af 46 15 03 
 | 
			
		||||
 | 
			
		||||
# p's CRT exponent dP:
 | 
			
		||||
54 49 4c a6 3e ba 03 37 e4 e2 40 23 fc d6 9a 5a 
 | 
			
		||||
eb 07 dd dc 01 83 a4 d0 ac 9b 54 b0 51 f2 b1 3e 
 | 
			
		||||
d9 49 09 75 ea b7 74 14 ff 59 c1 f7 69 2e 9a 2e 
 | 
			
		||||
20 2b 38 fc 91 0a 47 41 74 ad c9 3c 1f 67 c9 81 
 | 
			
		||||
 | 
			
		||||
# q's CRT exponent dQ:
 | 
			
		||||
47 1e 02 90 ff 0a f0 75 03 51 b7 f8 78 86 4c a9 
 | 
			
		||||
61 ad bd 3a 8a 7e 99 1c 5c 05 56 a9 4c 31 46 a7 
 | 
			
		||||
f9 80 3f 8f 6f 8a e3 42 e9 31 fd 8a e4 7a 22 0d 
 | 
			
		||||
1b 99 a4 95 84 98 07 fe 39 f9 24 5a 98 36 da 3d 
 | 
			
		||||
 | 
			
		||||
# CRT coefficient qInv:
 | 
			
		||||
b0 6c 4f da bb 63 01 19 8d 26 5b db ae 94 23 b3 
 | 
			
		||||
80 f2 71 f7 34 53 88 50 93 07 7f cd 39 e2 11 9f 
 | 
			
		||||
c9 86 32 15 4f 58 83 b1 67 a9 67 bf 40 2b 4e 9e 
 | 
			
		||||
2e 0f 96 56 e6 98 ea 36 66 ed fb 25 79 80 39 f7 
 | 
			
		||||
 | 
			
		||||
# ----------------------------------
 | 
			
		||||
# Step-by-step RSAES-OAEP Encryption
 | 
			
		||||
# ----------------------------------
 | 
			
		||||
 | 
			
		||||
# Message M to be encrypted:
 | 
			
		||||
d4 36 e9 95 69 fd 32 a7 c8 a0 5b bc 90 d3 2c 49 
 | 
			
		||||
 | 
			
		||||
# Label L:
 | 
			
		||||
(the empty string)
 | 
			
		||||
 | 
			
		||||
# lHash      = Hash(L)
 | 
			
		||||
# DB         = lHash || Padding || M
 | 
			
		||||
# seed       = random string of octets
 | 
			
		||||
# dbMask     = MGF(seed, length(DB))
 | 
			
		||||
# maskedDB   = DB xor dbMask
 | 
			
		||||
# seedMask   = MGF(maskedDB, length(seed))
 | 
			
		||||
# maskedSeed = seed xor seedMask 
 | 
			
		||||
# EM         = 0x00 || maskedSeed || maskedDB
 | 
			
		||||
 | 
			
		||||
# lHash:
 | 
			
		||||
da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 
 | 
			
		||||
af d8 07 09 
 | 
			
		||||
 | 
			
		||||
# DB:
 | 
			
		||||
da 39 a3 ee 5e 6b 4b 0d 32 55 bf ef 95 60 18 90 
 | 
			
		||||
af d8 07 09 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00	00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 01 d4 36 e9 95 69 
 | 
			
		||||
fd 32 a7 c8 a0 5b bc 90 d3 2c 49 
 | 
			
		||||
 | 
			
		||||
# seed:
 | 
			
		||||
aa fd 12 f6 59 ca e6 34 89 b4 79 e5 07 6d de c2 
 | 
			
		||||
f0 6c b5 8f 
 | 
			
		||||
		
 | 
			
		||||
# dbMask:
 | 
			
		||||
06 e1 de b2 36 9a a5 a5 c7 07 d8 2c 8e 4e 93 24 
 | 
			
		||||
8a c7 83 de e0 b2 c0 46 26 f5 af f9 3e dc fb 25 
 | 
			
		||||
c9 c2 b3 ff 8a e1 0e 83	9a 2d db 4c dc fe 4f f4 
 | 
			
		||||
77 28 b4 a1 b7 c1 36 2b aa d2 9a b4 8d 28 69 d5 
 | 
			
		||||
02 41 21 43 58 11 59 1b e3 92 f9 82 fb 3e 87 d0 
 | 
			
		||||
95 ae b4 04 48 db 97 2f 3a c1 4e af f4 9c 8c 3b 
 | 
			
		||||
7c fc 95 1a 51 ec d1 dd e6 12 64 
 | 
			
		||||
 | 
			
		||||
# maskedDB:
 | 
			
		||||
dc d8 7d 5c 68 f1 ee a8 f5 52 67 c3 1b 2e 8b b4 
 | 
			
		||||
25 1f 84 d7 e0 b2 c0 46 26 f5 af f9 3e dc fb 25 
 | 
			
		||||
c9 c2 b3 ff 8a e1 0e 83 9a 2d db 4c dc fe 4f f4 
 | 
			
		||||
77 28 b4 a1 b7 c1 36 2b aa d2 9a b4 8d 28 69 d5 
 | 
			
		||||
02 41 21 43 58 11 59 1b e3 92 f9 82 fb 3e 87 d0 
 | 
			
		||||
95 ae b4 04 48 db 97 2f 3a c1 4f 7b c2 75 19 52 
 | 
			
		||||
81 ce 32 d2 f1 b7 6d 4d 35 3e 2d 
 | 
			
		||||
 | 
			
		||||
# seedMask:
 | 
			
		||||
41 87 0b 5a b0 29 e6 57 d9 57 50 b5 4c 28 3c 08 
 | 
			
		||||
72 5d be a9 
 | 
			
		||||
 | 
			
		||||
# maskedSeed:
 | 
			
		||||
eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 ca 
 | 
			
		||||
82 31 0b 26 
 | 
			
		||||
 | 
			
		||||
# EM = 00 || maskedSeed || maskedDB:
 | 
			
		||||
00 eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 
 | 
			
		||||
ca 82 31 0b 26 dc d8 7d 5c 68 f1 ee a8 f5 52 67 
 | 
			
		||||
c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46 26 f5 af 
 | 
			
		||||
f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db 
 | 
			
		||||
4c dc fe 4f f4 77 28 b4 a1 b7 c1 36 2b aa d2 9a 
 | 
			
		||||
b4 8d 28 69 d5 02 41 21 43 58 11 59 1b e3 92 f9 
 | 
			
		||||
82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f 
 | 
			
		||||
7b c2 75 19 52 81 ce 32 d2 f1 b7 6d 4d 35 3e 2d 
 | 
			
		||||
 | 
			
		||||
# Ciphertext, the RSA encryption of EM:
 | 
			
		||||
12 53 e0 4d c0 a5 39 7b b4 4a 7a b8 7e 9b f2 a0 
 | 
			
		||||
39 a3 3d 1e 99 6f c8 2a 94 cc d3 00 74 c9 5d f7 
 | 
			
		||||
63 72 20 17 06 9e 52 68 da 5d 1c 0b 4f 87 2c f6 
 | 
			
		||||
53 c1 1d f8 23 14 a6 79 68 df ea e2 8d ef 04 bb 
 | 
			
		||||
6d 84 b1 c3 1d 65 4a 19 70 e5 78 3b d6 eb 96 a0 
 | 
			
		||||
24 c2 ca 2f 4a 90 fe 9f 2e f5 c9 c1 40 e5 bb 48 
 | 
			
		||||
da 95 36 ad 87 00 c8 4f c9 13 0a de a7 4e 55 8d 
 | 
			
		||||
51 a7 4d df 85 d8 b5 0d e9 68 38 d6 06 3e 09 55 
 | 
			
		||||
 | 
			
		||||
# --------------------------------------------
 | 
			
		||||
# Step-by-step RSAES-OAEP Decryption Using CRT 
 | 
			
		||||
# --------------------------------------------
 | 
			
		||||
 | 
			
		||||
# c  = the integer value of C above
 | 
			
		||||
# m1 = c^dP mod p = (c mod p)^dP mod p
 | 
			
		||||
# m2 = c^dQ mod q = (c mod q)^dQ mod q
 | 
			
		||||
# h  = (m1-m2)*qInv mod p
 | 
			
		||||
# m  = m2 + q*h = the integer value of EM above
 | 
			
		||||
 | 
			
		||||
# c mod p:
 | 
			
		||||
de 63 d4 72 35 66 fa a7 59 bf e4 08 82 1d d5 25 
 | 
			
		||||
72 ec 92 85 4d df 87 a2 b6 64 d4 4d aa 37 ca 34 
 | 
			
		||||
6a 05 20 3d 82 ff 2d e8 e3 6c ec 1d 34 f9 8e b6 
 | 
			
		||||
05 e2 a7 d2 6d e7 af 36 9c e4 ec ae 14 e3 56 33 
 | 
			
		||||
 | 
			
		||||
# c mod q:
 | 
			
		||||
a2 d9 24 de d9 c3 6d 62 3e d9 a6 5b 5d 86 2c fb 
 | 
			
		||||
ec 8b 19 9c 64 27 9c 54 14 e6 41 19 6e f1 c9 3c 
 | 
			
		||||
50 7a 9b 52 13 88 1a ad 05 b4 cc fa 02 8a c1 ec 
 | 
			
		||||
61 42 09 74 bf 16 25 83 6b 0b 7d 05 fb b7 53 36 
 | 
			
		||||
 | 
			
		||||
# m1:
 | 
			
		||||
89 6c a2 6c d7 e4 87 1c 7f c9 68 a8 ed ea 11 e2 
 | 
			
		||||
71 82 4f 0e 03 65 52 17 94 f1 e9 e9 43 b4 a4 4b 
 | 
			
		||||
57 c9 e3 95 a1 46 74 78 f5 26 49 6b 4b b9 1f 1c 
 | 
			
		||||
ba ea 90 0f fc 60 2c f0 c6 63 6e ba 84 fc 9f f7 
 | 
			
		||||
 | 
			
		||||
# m2:
 | 
			
		||||
4e bb 22 75 85 f0 c1 31 2d ca 19 e0 b5 41 db 14 
 | 
			
		||||
99 fb f1 4e 27 0e 69 8e 23 9a 8c 27 a9 6c da 9a 
 | 
			
		||||
74 09 74 de 93 7b 5c 9c 93 ea d9 46 2c 65 75 02 
 | 
			
		||||
1a 23 d4 64 99 dc 9f 6b 35 89 75 59 60 8f 19 be 
 | 
			
		||||
 | 
			
		||||
# h:
 | 
			
		||||
01 2b 2b 24 15 0e 76 e1 59 bd 8d db 42 76 e0 7b 
 | 
			
		||||
fa c1 88 e0 8d 60 47 cf 0e fb 8a e2 ae bd f2 51 
 | 
			
		||||
c4 0e bc 23 dc fd 4a 34 42 43 94 ad a9 2c fc be 
 | 
			
		||||
1b 2e ff bb 60 fd fb 03 35 9a 95 36 8d 98 09 25 
 | 
			
		||||
 | 
			
		||||
# m:
 | 
			
		||||
00 eb 7a 19 ac e9 e3 00 63 50 e3 29 50 4b 45 e2 
 | 
			
		||||
ca 82 31 0b 26 dc d8 7d 5c 68 f1 ee a8 f5 52 67 
 | 
			
		||||
c3 1b 2e 8b b4 25 1f 84 d7 e0 b2 c0 46 26 f5 af 
 | 
			
		||||
f9 3e dc fb 25 c9 c2 b3 ff 8a e1 0e 83 9a 2d db 
 | 
			
		||||
4c dc fe 4f f4 77 28 b4 a1 b7 c1 36 2b aa d2 9a 
 | 
			
		||||
b4 8d 28 69 d5 02 41 21 43 58 11 59 1b e3 92 f9 
 | 
			
		||||
82 fb 3e 87 d0 95 ae b4 04 48 db 97 2f 3a c1 4f 
 | 
			
		||||
7b c2 75 19 52 81 ce 32 d2 f1 b7 6d 4d 35 3e 2d 
 | 
			
		||||
 | 
			
		||||
# The intermediate values in the remaining 
 | 
			
		||||
# decryption process are the same as during
 | 
			
		||||
# RSAES-OAEP encryption of M.
 | 
			
		||||
 | 
			
		||||
# =============================================
 | 
			
		||||
 | 
			
		||||
# ========================
 | 
			
		||||
# DER Encoding of RSA Keys
 | 
			
		||||
# ========================
 | 
			
		||||
 | 
			
		||||
# ------------
 | 
			
		||||
# RSAPublicKey
 | 
			
		||||
# ------------
 | 
			
		||||
30 81 87 
 | 
			
		||||
# modulus
 | 
			
		||||
   02 81 81  
 | 
			
		||||
      00 bb f8 2f 09 06 82 ce 
 | 
			
		||||
      9c 23 38 ac 2b 9d a8 71 
 | 
			
		||||
      f7 36 8d 07 ee d4 10 43 
 | 
			
		||||
      a4 40 d6 b6 f0 74 54 f5 
 | 
			
		||||
      1f b8 df ba af 03 5c 02 
 | 
			
		||||
      ab 61 ea 48 ce eb 6f cd 
 | 
			
		||||
      48 76 ed 52 0d 60 e1 ec 
 | 
			
		||||
      46 19 71 9d 8a 5b 8b 80 
 | 
			
		||||
      7f af b8 e0 a3 df c7 37 
 | 
			
		||||
      72 3e e6 b4 b7 d9 3a 25 
 | 
			
		||||
      84 ee 6a 64 9d 06 09 53 
 | 
			
		||||
      74 88 34 b2 45 45 98 39 
 | 
			
		||||
      4e e0 aa b1 2d 7b 61 a5 
 | 
			
		||||
      1f 52 7a 9a 41 f6 c1 68 
 | 
			
		||||
      7f e2 53 72 98 ca 2a 8f 
 | 
			
		||||
      59 46 f8 e5 fd 09 1d bd 
 | 
			
		||||
      cb 
 | 
			
		||||
# publicExponent
 | 
			
		||||
   02 01 
 | 
			
		||||
      11
 | 
			
		||||
 | 
			
		||||
# -------------
 | 
			
		||||
# RSAPrivateKey
 | 
			
		||||
# -------------
 | 
			
		||||
30 82 02 5b 
 | 
			
		||||
# version
 | 
			
		||||
   02 01 
 | 
			
		||||
      00
 | 
			
		||||
# modulus
 | 
			
		||||
   02 81 81  
 | 
			
		||||
      00 bb f8 2f 09 06 82 ce 
 | 
			
		||||
      9c 23 38 ac 2b 9d a8 71 
 | 
			
		||||
      f7 36 8d 07 ee d4 10 43 
 | 
			
		||||
      a4 40 d6 b6 f0 74 54 f5 
 | 
			
		||||
      1f b8 df ba af 03 5c 02 
 | 
			
		||||
      ab 61 ea 48 ce eb 6f cd 
 | 
			
		||||
      48 76 ed 52 0d 60 e1 ec 
 | 
			
		||||
      46 19 71 9d 8a 5b 8b 80 
 | 
			
		||||
      7f af b8 e0 a3 df c7 37 
 | 
			
		||||
      72 3e e6 b4 b7 d9 3a 25 
 | 
			
		||||
      84 ee 6a 64 9d 06 09 53 
 | 
			
		||||
      74 88 34 b2 45 45 98 39 
 | 
			
		||||
      4e e0 aa b1 2d 7b 61 a5 
 | 
			
		||||
      1f 52 7a 9a 41 f6 c1 68 
 | 
			
		||||
      7f e2 53 72 98 ca 2a 8f 
 | 
			
		||||
      59 46 f8 e5 fd 09 1d bd 
 | 
			
		||||
      cb 
 | 
			
		||||
# publicExponent
 | 
			
		||||
   02 01 
 | 
			
		||||
      11 
 | 
			
		||||
# privateExponent
 | 
			
		||||
   02 81 81 
 | 
			
		||||
      00 a5 da fc 53 41 fa f2 
 | 
			
		||||
      89 c4 b9 88 db 30 c1 cd 
 | 
			
		||||
      f8 3f 31 25 1e 06 68 b4 
 | 
			
		||||
      27 84 81 38 01 57 96 41 
 | 
			
		||||
      b2 94 10 b3 c7 99 8d 6b 
 | 
			
		||||
      c4 65 74 5e 5c 39 26 69 
 | 
			
		||||
      d6 87 0d a2 c0 82 a9 39 
 | 
			
		||||
      e3 7f dc b8 2e c9 3e da 
 | 
			
		||||
      c9 7f f3 ad 59 50 ac cf 
 | 
			
		||||
      bc 11 1c 76 f1 a9 52 94 
 | 
			
		||||
      44 e5 6a af 68 c5 6c 09 
 | 
			
		||||
      2c d3 8d c3 be f5 d2 0a 
 | 
			
		||||
      93 99 26 ed 4f 74 a1 3e 
 | 
			
		||||
      dd fb e1 a1 ce cc 48 94 
 | 
			
		||||
      af 94 28 c2 b7 b8 88 3f 
 | 
			
		||||
      e4 46 3a 4b c8 5b 1c b3 
 | 
			
		||||
      c1 
 | 
			
		||||
# prime1
 | 
			
		||||
   02 41 
 | 
			
		||||
      00 ee cf ae 81 b1 b9 b3 
 | 
			
		||||
      c9 08 81 0b 10 a1 b5 60 
 | 
			
		||||
      01 99 eb 9f 44 ae f4 fd 
 | 
			
		||||
      a4 93 b8 1a 9e 3d 84 f6 
 | 
			
		||||
      32 12 4e f0 23 6e 5d 1e 
 | 
			
		||||
      3b 7e 28 fa e7 aa 04 0a 
 | 
			
		||||
      2d 5b 25 21 76 45 9d 1f 
 | 
			
		||||
      39 75 41 ba 2a 58 fb 65 
 | 
			
		||||
      99 
 | 
			
		||||
# prime2
 | 
			
		||||
   02 41 
 | 
			
		||||
      00 c9 7f b1 f0 27 f4 53 
 | 
			
		||||
      f6 34 12 33 ea aa d1 d9 
 | 
			
		||||
      35 3f 6c 42 d0 88 66 b1 
 | 
			
		||||
      d0 5a 0f 20 35 02 8b 9d 
 | 
			
		||||
      86 98 40 b4 16 66 b4 2e 
 | 
			
		||||
      92 ea 0d a3 b4 32 04 b5 
 | 
			
		||||
      cf ce 33 52 52 4d 04 16 
 | 
			
		||||
      a5 a4 41 e7 00 af 46 15 
 | 
			
		||||
      03 
 | 
			
		||||
# exponent1
 | 
			
		||||
   02 40 
 | 
			
		||||
      54 49 4c a6 3e ba 03 37 
 | 
			
		||||
      e4 e2 40 23 fc d6 9a 5a 
 | 
			
		||||
      eb 07 dd dc 01 83 a4 d0 
 | 
			
		||||
      ac 9b 54 b0 51 f2 b1 3e 
 | 
			
		||||
      d9 49 09 75 ea b7 74 14 
 | 
			
		||||
      ff 59 c1 f7 69 2e 9a 2e 
 | 
			
		||||
      20 2b 38 fc 91 0a 47 41 
 | 
			
		||||
      74 ad c9 3c 1f 67 c9 81 
 | 
			
		||||
# exponent2
 | 
			
		||||
   02 40 
 | 
			
		||||
      47 1e 02 90 ff 0a f0 75 
 | 
			
		||||
      03 51 b7 f8 78 86 4c a9 
 | 
			
		||||
      61 ad bd 3a 8a 7e 99 1c 
 | 
			
		||||
      5c 05 56 a9 4c 31 46 a7 
 | 
			
		||||
      f9 80 3f 8f 6f 8a e3 42 
 | 
			
		||||
      e9 31 fd 8a e4 7a 22 0d 
 | 
			
		||||
      1b 99 a4 95 84 98 07 fe 
 | 
			
		||||
      39 f9 24 5a 98 36 da 3d 
 | 
			
		||||
# coefficient
 | 
			
		||||
   02 41
 | 
			
		||||
      00 b0 6c 4f da bb 63 01 
 | 
			
		||||
      19 8d 26 5b db ae 94 23 
 | 
			
		||||
      b3 80 f2 71 f7 34 53 88 
 | 
			
		||||
      50 93 07 7f cd 39 e2 11 
 | 
			
		||||
      9f c9 86 32 15 4f 58 83 
 | 
			
		||||
      b1 67 a9 67 bf 40 2b 4e 
 | 
			
		||||
      9e 2e 0f 96 56 e6 98 ea 
 | 
			
		||||
      36 66 ed fb 25 79 80 39 
 | 
			
		||||
      f7
 | 
			
		||||
 | 
			
		||||
# ------------------------
 | 
			
		||||
# PrivateKeyInfo (PKCS #8)
 | 
			
		||||
# ------------------------
 | 
			
		||||
30 82 02 75
 | 
			
		||||
# version
 | 
			
		||||
   02 01 
 | 
			
		||||
      00
 | 
			
		||||
# privateKeyAlgorithmIdentifier
 | 
			
		||||
   30 0d
 | 
			
		||||
      06 09 
 | 
			
		||||
         2a 86 48 86 f7 0d 01 01 01
 | 
			
		||||
#    parameters
 | 
			
		||||
      05 00 
 | 
			
		||||
# privateKey = RSAPrivateKey encoding
 | 
			
		||||
   04 82 02 5f
 | 
			
		||||
#    DER encoding of RSAPrivateKey structure
 | 
			
		||||
      30 82 02 5b ... 79 80 39 f7
 | 
			
		||||
 | 
			
		||||
# =============================================
 | 
			
		||||
							
								
								
									
										1418
									
								
								notes/rsa-testvectors/oaep-vect.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1418
									
								
								notes/rsa-testvectors/oaep-vect.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2212
									
								
								notes/rsa-testvectors/oaep-vect.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2212
									
								
								notes/rsa-testvectors/oaep-vect.txt
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5463
									
								
								notes/rsa-testvectors/pkcs1v15crypt-vectors.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5463
									
								
								notes/rsa-testvectors/pkcs1v15crypt-vectors.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9709
									
								
								notes/rsa-testvectors/pkcs1v15crypt-vectors.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9709
									
								
								notes/rsa-testvectors/pkcs1v15crypt-vectors.txt
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4261
									
								
								notes/rsa-testvectors/pkcs1v15sign-vectors.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4261
									
								
								notes/rsa-testvectors/pkcs1v15sign-vectors.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9049
									
								
								notes/rsa-testvectors/pkcs1v15sign-vectors.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										9049
									
								
								notes/rsa-testvectors/pkcs1v15sign-vectors.txt
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										162
									
								
								notes/rsa-testvectors/pss-int.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										162
									
								
								notes/rsa-testvectors/pss-int.txt
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,162 @@
 | 
			
		||||
# =================================
 | 
			
		||||
# WORKED-OUT EXAMPLE FOR RSASSA-PSS
 | 
			
		||||
# =================================
 | 
			
		||||
#
 | 
			
		||||
# This file gives an example of the process of
 | 
			
		||||
# signing a message with RSASSA-PSS as
 | 
			
		||||
# specified in PKCS #1 v2.1.
 | 
			
		||||
#
 | 
			
		||||
# The message is an octet string of length 114,
 | 
			
		||||
# while the size of the modulus in the public
 | 
			
		||||
# key is 1024 bits. The message is signed via a
 | 
			
		||||
# random salt of length 20 octets 
 | 
			
		||||
# 
 | 
			
		||||
# The underlying hash function in the EMSA-PSS
 | 
			
		||||
# encoding method is SHA-1; the mask generation
 | 
			
		||||
# function is MGF1 with SHA-1 as specified in 
 | 
			
		||||
# PKCS #1 v2.1.
 | 
			
		||||
# 
 | 
			
		||||
# Integers are represented by strings of octets
 | 
			
		||||
# with the leftmost octet being the most
 | 
			
		||||
# significant octet. For example, 
 | 
			
		||||
#
 | 
			
		||||
#           9,202,000 = (0x)8c 69 50. 
 | 
			
		||||
#
 | 
			
		||||
# =============================================
 | 
			
		||||
 | 
			
		||||
# ------------------------------
 | 
			
		||||
# Components of the RSA Key Pair
 | 
			
		||||
# ------------------------------
 | 
			
		||||
 | 
			
		||||
# RSA modulus n: 
 | 
			
		||||
a2 ba 40 ee 07 e3 b2 bd 2f 02 ce 22 7f 36 a1 95 
 | 
			
		||||
02 44 86 e4 9c 19 cb 41 bb bd fb ba 98 b2 2b 0e 
 | 
			
		||||
57 7c 2e ea ff a2 0d 88 3a 76 e6 5e 39 4c 69 d4 
 | 
			
		||||
b3 c0 5a 1e 8f ad da 27 ed b2 a4 2b c0 00 fe 88 
 | 
			
		||||
8b 9b 32 c2 2d 15 ad d0 cd 76 b3 e7 93 6e 19 95 
 | 
			
		||||
5b 22 0d d1 7d 4e a9 04 b1 ec 10 2b 2e 4d e7 75 
 | 
			
		||||
12 22 aa 99 15 10 24 c7 cb 41 cc 5e a2 1d 00 ee 
 | 
			
		||||
b4 1f 7c 80 08 34 d2 c6 e0 6b ce 3b ce 7e a9 a5 
 | 
			
		||||
 | 
			
		||||
# RSA public exponent e: 
 | 
			
		||||
01 00 01 
 | 
			
		||||
 | 
			
		||||
# Prime p: 
 | 
			
		||||
d1 7f 65 5b f2 7c 8b 16 d3 54 62 c9 05 cc 04 a2 
 | 
			
		||||
6f 37 e2 a6 7f a9 c0 ce 0d ce d4 72 39 4a 0d f7 
 | 
			
		||||
43 fe 7f 92 9e 37 8e fd b3 68 ed df f4 53 cf 00 
 | 
			
		||||
7a f6 d9 48 e0 ad e7 57 37 1f 8a 71 1e 27 8f 6b 
 | 
			
		||||
 | 
			
		||||
# Prime q: 
 | 
			
		||||
c6 d9 2b 6f ee 74 14 d1 35 8c e1 54 6f b6 29 87 
 | 
			
		||||
53 0b 90 bd 15 e0 f1 49 63 a5 e2 63 5a db 69 34 
 | 
			
		||||
7e c0 c0 1b 2a b1 76 3f d8 ac 1a 59 2f b2 27 57 
 | 
			
		||||
46 3a 98 24 25 bb 97 a3 a4 37 c5 bf 86 d0 3f 2f 
 | 
			
		||||
 | 
			
		||||
# p's CRT exponent dP: 
 | 
			
		||||
9d 0d bf 83 e5 ce 9e 4b 17 54 dc d5 cd 05 bc b7 
 | 
			
		||||
b5 5f 15 08 33 0e a4 9f 14 d4 e8 89 55 0f 82 56 
 | 
			
		||||
cb 5f 80 6d ff 34 b1 7a da 44 20 88 53 57 7d 08 
 | 
			
		||||
e4 26 28 90 ac f7 52 46 1c ea 05 54 76 01 bc 4f 
 | 
			
		||||
 | 
			
		||||
# q's CRT exponent dQ: 
 | 
			
		||||
12 91 a5 24 c6 b7 c0 59 e9 0e 46 dc 83 b2 17 1e 
 | 
			
		||||
b3 fa 98 81 8f d1 79 b6 c8 bf 6c ec aa 47 63 03 
 | 
			
		||||
ab f2 83 fe 05 76 9c fc 49 57 88 fe 5b 1d df de 
 | 
			
		||||
9e 88 4a 3c d5 e9 36 b7 e9 55 eb f9 7e b5 63 b1 
 | 
			
		||||
 | 
			
		||||
# CRT coefficient qInv: 
 | 
			
		||||
a6 3f 1d a3 8b 95 0c 9a d1 c6 7c e0 d6 77 ec 29 
 | 
			
		||||
14 cd 7d 40 06 2d f4 2a 67 eb 19 8a 17 6f 97 42 
 | 
			
		||||
aa c7 c5 fe a1 4f 22 97 66 2b 84 81 2c 4d ef c4 
 | 
			
		||||
9a 80 25 ab 43 82 28 6b e4 c0 37 88 dd 01 d6 9f 
 | 
			
		||||
 | 
			
		||||
# ---------------------------------
 | 
			
		||||
# Step-by-step RSASSA-PSS Signature
 | 
			
		||||
# ---------------------------------
 | 
			
		||||
 | 
			
		||||
# Message M to be signed:
 | 
			
		||||
85 9e ef 2f d7 8a ca 00 30 8b dc 47 11 93 bf 55 
 | 
			
		||||
bf 9d 78 db 8f 8a 67 2b 48 46 34 f3 c9 c2 6e 64 
 | 
			
		||||
78 ae 10 26 0f e0 dd 8c 08 2e 53 a5 29 3a f2 17 
 | 
			
		||||
3c d5 0c 6d 5d 35 4f eb f7 8b 26 02 1c 25 c0 27 
 | 
			
		||||
12 e7 8c d4 69 4c 9f 46 97 77 e4 51 e7 f8 e9 e0 
 | 
			
		||||
4c d3 73 9c 6b bf ed ae 48 7f b5 56 44 e9 ca 74 
 | 
			
		||||
ff 77 a5 3c b7 29 80 2f 6e d4 a5 ff a8 ba 15 98 
 | 
			
		||||
90 fc 
 | 
			
		||||
 | 
			
		||||
# mHash    = Hash(M)
 | 
			
		||||
# salt     = random string of octets
 | 
			
		||||
# M'       = Padding || mHash || salt
 | 
			
		||||
# H        = Hash(M')
 | 
			
		||||
# DB       = Padding || salt 
 | 
			
		||||
# dbMask   = MGF(H, length(DB))
 | 
			
		||||
# maskedDB = DB xor dbMask (leftmost bit set to
 | 
			
		||||
#            zero)
 | 
			
		||||
# EM       = maskedDB || H || 0xbc
 | 
			
		||||
 | 
			
		||||
# mHash:
 | 
			
		||||
37 b6 6a e0 44 58 43 35 3d 47 ec b0 b4 fd 14 c1 
 | 
			
		||||
10 e6 2d 6a 
 | 
			
		||||
 | 
			
		||||
# salt:
 | 
			
		||||
e3 b5 d5 d0 02 c1 bc e5 0c 2b 65 ef 88 a1 88 d8 
 | 
			
		||||
3b ce 7e 61 
 | 
			
		||||
 | 
			
		||||
# M':
 | 
			
		||||
00 00 00 00 00 00 00 00 37 b6 6a e0 44 58 43 35 
 | 
			
		||||
3d 47 ec b0 b4 fd 14 c1 10 e6 2d 6a e3 b5 d5 d0 
 | 
			
		||||
02 c1 bc e5 0c 2b 65 ef 88 a1 88 d8 3b ce 7e 61 
 | 
			
		||||
 | 
			
		||||
# H:
 | 
			
		||||
df 1a 89 6f 9d 8b c8 16 d9 7c d7 a2 c4 3b ad 54 
 | 
			
		||||
6f be 8c fe 
 | 
			
		||||
 | 
			
		||||
# DB:
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 | 
			
		||||
00 00 00 00 00 00 01 e3 b5 d5 d0 02 c1 bc e5 0c 
 | 
			
		||||
2b 65 ef 88 a1 88 d8 3b ce 7e 61 
 | 
			
		||||
 | 
			
		||||
# dbMask:
 | 
			
		||||
66 e4 67 2e 83 6a d1 21 ba 24 4b ed 65 76 b8 67 
 | 
			
		||||
d9 a4 47 c2 8a 6e 66 a5 b8 7d ee 7f bc 7e 65 af 
 | 
			
		||||
50 57 f8 6f ae 89 84 d9 ba 7f 96 9a d6 fe 02 a4 
 | 
			
		||||
d7 5f 74 45 fe fd d8 5b 6d 3a 47 7c 28 d2 4b a1 
 | 
			
		||||
e3 75 6f 79 2d d1 dc e8 ca 94 44 0e cb 52 79 ec 
 | 
			
		||||
d3 18 3a 31 1f c8 97 39 a9 66 43 13 6e 8b 0f 46 
 | 
			
		||||
5e 87 a4 53 5c d4 c5 9b 10 02 8d 
 | 
			
		||||
 | 
			
		||||
# maskedDB:
 | 
			
		||||
66 e4 67 2e 83 6a d1 21 ba 24 4b ed 65 76 b8 67 
 | 
			
		||||
d9 a4 47 c2 8a 6e 66 a5 b8 7d ee 7f bc 7e 65 af 
 | 
			
		||||
50 57 f8 6f ae 89 84 d9 ba 7f 96 9a d6 fe 02 a4 
 | 
			
		||||
d7 5f 74 45 fe fd d8 5b 6d 3a 47 7c 28 d2 4b a1 
 | 
			
		||||
e3 75 6f 79 2d d1 dc e8 ca 94 44 0e cb 52 79 ec 
 | 
			
		||||
d3 18 3a 31 1f c8 96 da 1c b3 93 11 af 37 ea 4a 
 | 
			
		||||
75 e2 4b db fd 5c 1d a0 de 7c ec 
 | 
			
		||||
 | 
			
		||||
# Encoded message EM:
 | 
			
		||||
66 e4 67 2e 83 6a d1 21 ba 24 4b ed 65 76 b8 67 
 | 
			
		||||
d9 a4 47 c2 8a 6e 66 a5 b8 7d ee 7f bc 7e 65 af 
 | 
			
		||||
50 57 f8 6f ae 89 84 d9 ba 7f 96 9a d6 fe 02 a4 
 | 
			
		||||
d7 5f 74 45 fe fd d8 5b 6d 3a 47 7c 28 d2 4b a1 
 | 
			
		||||
e3 75 6f 79 2d d1 dc e8 ca 94 44 0e cb 52 79 ec 
 | 
			
		||||
d3 18 3a 31 1f c8 96 da 1c b3 93 11 af 37 ea 4a 
 | 
			
		||||
75 e2 4b db fd 5c 1d a0 de 7c ec df 1a 89 6f 9d 
 | 
			
		||||
8b c8 16 d9 7c d7 a2 c4 3b ad 54 6f be 8c fe bc 
 | 
			
		||||
 | 
			
		||||
# Signature S, the RSA decryption of EM:
 | 
			
		||||
8d aa 62 7d 3d e7 59 5d 63 05 6c 7e c6 59 e5 44 
 | 
			
		||||
06 f1 06 10 12 8b aa e8 21 c8 b2 a0 f3 93 6d 54 
 | 
			
		||||
dc 3b dc e4 66 89 f6 b7 95 1b b1 8e 84 05 42 76 
 | 
			
		||||
97 18 d5 71 5d 21 0d 85 ef bb 59 61 92 03 2c 42 
 | 
			
		||||
be 4c 29 97 2c 85 62 75 eb 6d 5a 45 f0 5f 51 87 
 | 
			
		||||
6f c6 74 3d ed dd 28 ca ec 9b b3 0e a9 9e 02 c3 
 | 
			
		||||
48 82 69 60 4f e4 97 f7 4c cd 7c 7f ca 16 71 89 
 | 
			
		||||
71 23 cb d3 0d ef 5d 54 a2 b5 53 6a d9 0a 74 7e 
 | 
			
		||||
 | 
			
		||||
# =============================================
 | 
			
		||||
							
								
								
									
										1418
									
								
								notes/rsa-testvectors/pss-vect.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1418
									
								
								notes/rsa-testvectors/pss-vect.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2581
									
								
								notes/rsa-testvectors/pss-vect.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2581
									
								
								notes/rsa-testvectors/pss-vect.txt
									
									
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										22
									
								
								notes/rsa-testvectors/readme.txt
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								notes/rsa-testvectors/readme.txt
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,22 @@
 | 
			
		||||
====================
 | 
			
		||||
pkcs-1v2-1-vec.zip
 | 
			
		||||
====================
 | 
			
		||||
 | 
			
		||||
This directory contains test vectors for RSAES-OAEP and
 | 
			
		||||
RSASSA-PSS as defined in PKCS #1 v2.1.
 | 
			
		||||
 | 
			
		||||
The files:
 | 
			
		||||
 | 
			
		||||
readme.txt              This file.
 | 
			
		||||
 | 
			
		||||
oaep-vect.txt           Test vectors for RSAES-OAEP encryption.
 | 
			
		||||
 | 
			
		||||
oaep-int.txt            Intermediate values for RSAES-OAEP 
 | 
			
		||||
                        encryption and RSA decryption with CRT. 
 | 
			
		||||
                        Also, DER-encoded RSAPrivateKey and 
 | 
			
		||||
                        RSAPublicKey types.
 | 
			
		||||
 | 
			
		||||
pss-vect.txt            Test vectors for RSASSA-PSS signing.
 | 
			
		||||
 | 
			
		||||
pss-int.txt             Intermediate values for RSASSA-PSS
 | 
			
		||||
                        signing.
 | 
			
		||||
							
								
								
									
										253
									
								
								notes/rsa-testvectors/rt.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										253
									
								
								notes/rsa-testvectors/rt.py
									
									
									
									
									
										Executable file
									
								
							@ -0,0 +1,253 @@
 | 
			
		||||
#!/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_ends(f, s):
 | 
			
		||||
	while True:
 | 
			
		||||
		l = f.readline()
 | 
			
		||||
		if l.strip().endswith(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, p, q, dP, dQ, qInv):
 | 
			
		||||
		self.n = n
 | 
			
		||||
		self.e = e
 | 
			
		||||
		self.d = d
 | 
			
		||||
		self.p = p
 | 
			
		||||
		self.q = q
 | 
			
		||||
		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.p, self.q, self.dP, self.dQ, self.qInv)
 | 
			
		||||
 | 
			
		||||
def read_key(f):
 | 
			
		||||
	if ftype.version == 1:
 | 
			
		||||
		read_until_start(f, '# Private key')
 | 
			
		||||
	n = read_part(f, ftype.n)
 | 
			
		||||
	e = read_part(f, ftype.e)
 | 
			
		||||
	d = read_part(f, ftype.d)
 | 
			
		||||
	p = read_part(f, ftype.p)
 | 
			
		||||
	q = read_part(f, ftype.q)
 | 
			
		||||
	dP = read_part(f, ftype.dP)
 | 
			
		||||
	dQ = read_part(f, ftype.dQ)
 | 
			
		||||
	qInv = read_part(f, ftype.qInv)
 | 
			
		||||
	k = RsaKey(n, e, d, p, q, dP, dQ, qInv)
 | 
			
		||||
	return k
 | 
			
		||||
 | 
			
		||||
class Data(object):
 | 
			
		||||
	def __init__(self, name, obj1, obj2, obj3):
 | 
			
		||||
		self.name = name
 | 
			
		||||
		self.obj1 = obj1
 | 
			
		||||
		self.obj2 = obj2
 | 
			
		||||
		self.obj3 = obj3
 | 
			
		||||
 | 
			
		||||
	def __str__(self):
 | 
			
		||||
		if self.obj3 == None:
 | 
			
		||||
			return "{{\n  \"{0}\",\n{1},\n{2}\n}}\n,".format(self.name, self.obj1, self.obj2)
 | 
			
		||||
		else:
 | 
			
		||||
			return "{{\n  \"{0}\",\n{1},\n{2},\n{3}\n}}\n,".format(self.name, self.obj1, self.obj2, self.obj3)
 | 
			
		||||
 | 
			
		||||
def read_data(f):
 | 
			
		||||
	name = read_until_start(f, ftype.o).strip().lstrip('# ')
 | 
			
		||||
	obj1 = read_part(f, ftype.o1)
 | 
			
		||||
	obj2 = read_part(f, ftype.o2)
 | 
			
		||||
	if ftype.name == 'emsa':
 | 
			
		||||
		obj3 = None
 | 
			
		||||
	else:
 | 
			
		||||
		obj3 = read_part(f, ftype.o3)
 | 
			
		||||
	s = Data(name, obj1, obj2, obj3)
 | 
			
		||||
	return s
 | 
			
		||||
 | 
			
		||||
class Example(object):
 | 
			
		||||
	def __init__(self, name, key, data):
 | 
			
		||||
		self.name = name
 | 
			
		||||
		self.key = key
 | 
			
		||||
		self.data = data
 | 
			
		||||
 | 
			
		||||
	def __str__(self):
 | 
			
		||||
		res = "{{\n  \"{0}\",\n{1},\n{{".format(self.name, str(self.key))
 | 
			
		||||
		for idx, d in enumerate(self.data, 1):
 | 
			
		||||
			if idx == 2:
 | 
			
		||||
				res += '#ifdef LTC_TEST_EXT\n'
 | 
			
		||||
			res += str(d) + '\n'
 | 
			
		||||
			if idx == ftype.numcases:
 | 
			
		||||
				res += '#endif /* LTC_TEST_EXT */\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, ftype.sod)
 | 
			
		||||
	d = []
 | 
			
		||||
	while l.strip().startswith(ftype.sod):
 | 
			
		||||
		if ftype.version == 1:
 | 
			
		||||
			f.seek(-len(l), os.SEEK_CUR)
 | 
			
		||||
		data = read_data(f)
 | 
			
		||||
		d.append(data)
 | 
			
		||||
		l = read_until_start(f, '#')
 | 
			
		||||
 | 
			
		||||
	e = Example(name, key, d)
 | 
			
		||||
	f.seek(-len(l), os.SEEK_CUR)
 | 
			
		||||
	return e
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PkcsType(object):
 | 
			
		||||
	def __init__(self, name):
 | 
			
		||||
		if name == 'pss':
 | 
			
		||||
			self.o = '# RSASSA-PSS Signature Example'
 | 
			
		||||
			self.o1 = '# Message to be signed'
 | 
			
		||||
			self.o2 = '# Salt'
 | 
			
		||||
			self.o3 = '# Signature'
 | 
			
		||||
		elif name == 'oaep':
 | 
			
		||||
			self.o = '# RSAES-OAEP Encryption Example'
 | 
			
		||||
			self.o1 = '# Message to be encrypted'
 | 
			
		||||
			self.o2 = '# Seed'
 | 
			
		||||
			self.o3 = '# Encryption'
 | 
			
		||||
		elif name == 'emsa':
 | 
			
		||||
			self.o = '# PKCS#1 v1.5 Signature Example'
 | 
			
		||||
			self.o1 = '# Message to be signed'
 | 
			
		||||
			self.o2 = '# Signature'
 | 
			
		||||
		elif name == 'eme':
 | 
			
		||||
			self.o = '# PKCS#1 v1.5 Encryption Example'
 | 
			
		||||
			self.o1 = '# Message'
 | 
			
		||||
			self.o2 = '# Seed'
 | 
			
		||||
			self.o3 = '# Encryption'
 | 
			
		||||
		else:
 | 
			
		||||
			raise ValueError('Type unknown: ' + name)
 | 
			
		||||
 | 
			
		||||
		if name == 'pss' or name == 'oaep':
 | 
			
		||||
			self.version = 2
 | 
			
		||||
			self.numcases = 6
 | 
			
		||||
			self.n = '# RSA modulus n'
 | 
			
		||||
			self.e = '# RSA public exponent e'
 | 
			
		||||
			self.d = '# RSA private exponent d'
 | 
			
		||||
			self.p = '# Prime p'
 | 
			
		||||
			self.q = '# Prime q'
 | 
			
		||||
			self.dP = '# p\'s CRT exponent dP'
 | 
			
		||||
			self.dQ = '# q\'s CRT exponent dQ'
 | 
			
		||||
			self.qInv = '# CRT coefficient qInv'
 | 
			
		||||
			self.sod = '# --------------------------------'
 | 
			
		||||
		elif name == 'emsa' or name == 'eme':
 | 
			
		||||
			self.version = 1
 | 
			
		||||
			self.numcases = 20
 | 
			
		||||
			self.n = '# Modulus'
 | 
			
		||||
			self.e = '# Public exponent'
 | 
			
		||||
			self.d = '# Exponent'
 | 
			
		||||
			self.p = '# Prime 1'
 | 
			
		||||
			self.q = '# Prime 2'
 | 
			
		||||
			self.dP = '# Prime exponent 1'
 | 
			
		||||
			self.dQ = '# Prime exponent 2'
 | 
			
		||||
			self.qInv = '# Coefficient'
 | 
			
		||||
			self.sod = self.o
 | 
			
		||||
		self.name = name
 | 
			
		||||
 | 
			
		||||
ftype = PkcsType(sys.argv[2])
 | 
			
		||||
 | 
			
		||||
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 rsaData {
 | 
			
		||||
  const char* name;
 | 
			
		||||
  int o1_l;
 | 
			
		||||
  unsigned char o1[256];
 | 
			
		||||
  int o2_l;
 | 
			
		||||
  unsigned char o2[256];''')
 | 
			
		||||
 | 
			
		||||
if ftype.name != 'emsa':
 | 
			
		||||
	print('''  int o3_l;
 | 
			
		||||
  unsigned char o3[256];''')
 | 
			
		||||
 | 
			
		||||
print('''} rsaData_t;
 | 
			
		||||
 | 
			
		||||
typedef struct testcase {
 | 
			
		||||
  const char* name;
 | 
			
		||||
  rsaKey_t rsa;
 | 
			
		||||
#ifdef LTC_TEST_EXT
 | 
			
		||||
  rsaData_t data[%d];
 | 
			
		||||
#else
 | 
			
		||||
  rsaData_t data[1];
 | 
			
		||||
#endif /* LTC_TEST_EXT */
 | 
			
		||||
} testcase_t;
 | 
			
		||||
 | 
			
		||||
testcase_t testcases_%s[] =
 | 
			
		||||
    {''' % (ftype.numcases, sys.argv[2]))
 | 
			
		||||
 | 
			
		||||
with open(sys.argv[1], 'rb') as f:
 | 
			
		||||
	ex = []
 | 
			
		||||
	while read_until_ends(f, '============================================='):
 | 
			
		||||
		if f.tell() == os.path.getsize(sys.argv[1]):
 | 
			
		||||
			break
 | 
			
		||||
		e = read_example(f)
 | 
			
		||||
		ex.append(e)
 | 
			
		||||
 | 
			
		||||
	for i in ex:
 | 
			
		||||
		print(i)
 | 
			
		||||
f.close()
 | 
			
		||||
print('};\n')
 | 
			
		||||
@ -51,11 +51,12 @@ int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen,
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   hLen        = hash_descriptor[hash_idx].hashsize;
 | 
			
		||||
   modulus_bitlen--;
 | 
			
		||||
   modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0);
 | 
			
		||||
 | 
			
		||||
   /* check sizes */
 | 
			
		||||
   if ((saltlen > modulus_len) ||
 | 
			
		||||
       (modulus_len < hLen + saltlen + 2) || (siglen != modulus_len)) {
 | 
			
		||||
       (modulus_len < hLen + saltlen + 2)) {
 | 
			
		||||
      return CRYPT_PK_INVALID_SIZE;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
@ -95,8 +96,9 @@ int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen,
 | 
			
		||||
   XMEMCPY(hash, sig + x, hLen);
 | 
			
		||||
   x += hLen;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
   /* check the MSB */
 | 
			
		||||
   if ((sig[0] & ~(0xFF >> ((modulus_len<<3) - (modulus_bitlen-1)))) != 0) {
 | 
			
		||||
   if ((sig[0] & ~(0xFF >> ((modulus_len<<3) - (modulus_bitlen)))) != 0) {
 | 
			
		||||
      err = CRYPT_INVALID_PACKET;
 | 
			
		||||
      goto LBL_ERR;
 | 
			
		||||
   }
 | 
			
		||||
@ -112,7 +114,7 @@ int pkcs_1_pss_decode(const unsigned char *msghash, unsigned long msghashlen,
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* now clear the first byte [make sure smaller than modulus] */
 | 
			
		||||
   DB[0] &= 0xFF >> ((modulus_len<<3) - (modulus_bitlen-1));
 | 
			
		||||
   DB[0] &= 0xFF >> ((modulus_len<<3) - (modulus_bitlen));
 | 
			
		||||
 | 
			
		||||
   /* DB = PS || 0x01 || salt, PS == modulus_len - saltlen - hLen - 2 zero bytes */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -54,6 +54,7 @@ int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen,
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   hLen        = hash_descriptor[hash_idx].hashsize;
 | 
			
		||||
   modulus_bitlen--;
 | 
			
		||||
   modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0);
 | 
			
		||||
 | 
			
		||||
   /* check sizes */
 | 
			
		||||
@ -147,7 +148,7 @@ int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen,
 | 
			
		||||
   out[y] = 0xBC;
 | 
			
		||||
 | 
			
		||||
   /* now clear the 8*modulus_len - modulus_bitlen most significant bits */
 | 
			
		||||
   out[0] &= 0xFF >> ((modulus_len<<3) - (modulus_bitlen-1));
 | 
			
		||||
   out[0] &= 0xFF >> ((modulus_len<<3) - modulus_bitlen);
 | 
			
		||||
 | 
			
		||||
   /* store output size */
 | 
			
		||||
   *outlen = modulus_len;
 | 
			
		||||
 | 
			
		||||
@ -65,9 +65,8 @@ int pkcs_1_v1_5_decode(const unsigned char *msg,
 | 
			
		||||
    }
 | 
			
		||||
    ps_len = i++ - 2;
 | 
			
		||||
 | 
			
		||||
    if ((i >= modulus_len) || (ps_len < 8)) {
 | 
			
		||||
      /* There was no octet with hexadecimal value 0x00 to separate ps from m,
 | 
			
		||||
       * or the length of ps is less than 8 octets.
 | 
			
		||||
    if (i >= modulus_len) {
 | 
			
		||||
      /* There was no octet with hexadecimal value 0x00 to separate ps from m.
 | 
			
		||||
       */
 | 
			
		||||
      result = CRYPT_INVALID_PACKET;
 | 
			
		||||
      goto bail;
 | 
			
		||||
@ -87,6 +86,14 @@ int pkcs_1_v1_5_decode(const unsigned char *msg,
 | 
			
		||||
    ps_len = i - 2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (ps_len < 8)
 | 
			
		||||
  {
 | 
			
		||||
    /* The length of ps is less than 8 octets.
 | 
			
		||||
     */
 | 
			
		||||
    result = CRYPT_INVALID_PACKET;
 | 
			
		||||
    goto bail;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (*outlen < (msglen - (2 + ps_len + 1))) {
 | 
			
		||||
    *outlen = msglen - (2 + ps_len + 1);
 | 
			
		||||
    result = CRYPT_BUFFER_OVERFLOW;
 | 
			
		||||
 | 
			
		||||
@ -76,7 +76,7 @@ int rsa_exptmod(const unsigned char *in,   unsigned long inlen,
 | 
			
		||||
   if (which == PK_PRIVATE) {
 | 
			
		||||
      #ifdef LTC_RSA_BLINDING
 | 
			
		||||
      /* do blinding */
 | 
			
		||||
      err = mp_rand(rnd, mp_count_bits(key->N));
 | 
			
		||||
      err = mp_rand(rnd, mp_get_digit_count(key->N));
 | 
			
		||||
      if (err != CRYPT_OK) {
 | 
			
		||||
             goto error;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -92,11 +92,18 @@ int rsa_verify_hash_ex(const unsigned char *sig,      unsigned long siglen,
 | 
			
		||||
 | 
			
		||||
  if (padding == LTC_PKCS_1_PSS) {
 | 
			
		||||
    /* PSS decode and verify it */
 | 
			
		||||
    err = pkcs_1_pss_decode(hash, hashlen, tmpbuf, x, saltlen, hash_idx, modulus_bitlen, stat);
 | 
			
		||||
 | 
			
		||||
    if(modulus_bitlen%8 == 1){
 | 
			
		||||
      err = pkcs_1_pss_decode(hash, hashlen, tmpbuf+1, x-1, saltlen, hash_idx, modulus_bitlen, stat);
 | 
			
		||||
    }
 | 
			
		||||
    else{
 | 
			
		||||
      err = pkcs_1_pss_decode(hash, hashlen, tmpbuf, x, saltlen, hash_idx, modulus_bitlen, stat);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  } else {
 | 
			
		||||
    /* PKCS #1 v1.5 decode it */
 | 
			
		||||
    unsigned char *out;
 | 
			
		||||
    unsigned long outlen, loid[16];
 | 
			
		||||
    unsigned long outlen, loid[16], reallen;
 | 
			
		||||
    int           decoded;
 | 
			
		||||
    ltc_asn1_list digestinfo[2], siginfo[2];
 | 
			
		||||
 | 
			
		||||
@ -138,8 +145,14 @@ int rsa_verify_hash_ex(const unsigned char *sig,      unsigned long siglen,
 | 
			
		||||
       goto bail_2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ((err = der_length_sequence(siginfo, 2, &reallen)) != CRYPT_OK) {
 | 
			
		||||
       XFREE(out);
 | 
			
		||||
       goto bail_2;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* test OID */
 | 
			
		||||
    if ((digestinfo[0].size == hash_descriptor[hash_idx].OIDlen) &&
 | 
			
		||||
    if ((reallen == outlen) &&
 | 
			
		||||
        (digestinfo[0].size == hash_descriptor[hash_idx].OIDlen) &&
 | 
			
		||||
        (XMEMCMP(digestinfo[0].data, hash_descriptor[hash_idx].OID, sizeof(unsigned long) * hash_descriptor[hash_idx].OIDlen) == 0) &&
 | 
			
		||||
        (siginfo[1].size == hashlen) &&
 | 
			
		||||
        (XMEMCMP(siginfo[1].data, hash, hashlen) == 0)) {
 | 
			
		||||
 | 
			
		||||
@ -5,9 +5,10 @@ ifndef RANLIB
 | 
			
		||||
   RANLIB=ranlib
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o                                   \
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o no_prng.o                         \
 | 
			
		||||
dsa_test.o ecc_test.o mac_test.o misc_test.o modes_test.o pkcs_1_test.o rsa_test.o       \
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o                             \
 | 
			
		||||
pkcs_1_pss_test.o pkcs_1_oaep_test.o pkcs_1_emsa_test.o pkcs_1_eme_test.o
 | 
			
		||||
 | 
			
		||||
ifndef LIBTEST_S
 | 
			
		||||
   LIBTEST_S=libtomcrypt_prof.a
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,10 @@
 | 
			
		||||
CFLAGS += -I../src/headers -I./ 
 | 
			
		||||
CC?=icc
 | 
			
		||||
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o                                   \
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o no_prng.o                         \
 | 
			
		||||
dsa_test.o ecc_test.o mac_test.o modes_test.o pkcs_1_test.o rsa_test.o                   \
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o misc_test.o
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o misc_test.o                 \
 | 
			
		||||
pkcs_1_pss_test.o pkcs_1_oaep_test.o pkcs_1_emsa_test.o pkcs_1_eme_test.o
 | 
			
		||||
 | 
			
		||||
ifndef LIBTEST_S
 | 
			
		||||
   LIBTEST_S = libtomcrypt_prof.a
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,10 @@
 | 
			
		||||
 | 
			
		||||
CFLAGS = $(CFLAGS_OPTS) -W -I../src/headers -I. -Wall -W
 | 
			
		||||
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o                                   \
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o no_prng.o                         \
 | 
			
		||||
dsa_test.o ecc_test.o mac_test.o misc_test.o modes_test.o pkcs_1_test.o rsa_test.o       \
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o pkcs_1_pss_test.o           \
 | 
			
		||||
pkcs_1_oaep_test.o pkcs_1_emsa_test.o pkcs_1_eme_test.o
 | 
			
		||||
 | 
			
		||||
default: $(LIBTEST_S)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,10 @@
 | 
			
		||||
CFLAGS = /I../src/headers/ /I./ /Ox /DWIN32 /DLTC_SOURCE /W3 /Fo$@
 | 
			
		||||
 | 
			
		||||
OBJECTS=base64_test.obj cipher_hash_test.obj der_tests.obj            \
 | 
			
		||||
OBJECTS=base64_test.obj cipher_hash_test.obj der_tests.obj no_prng.obj \
 | 
			
		||||
dsa_test.obj ecc_test.obj mac_test.obj modes_test.obj pkcs_1_test.obj \
 | 
			
		||||
rsa_test.obj store_test.obj test_driver.obj x86_prof.obj katja_test.obj \
 | 
			
		||||
dh_test.obj misc_test.obj
 | 
			
		||||
dh_test.obj misc_test.obj pkcs_1_pss_test.obj pkcs_1_oaep_test.obj \
 | 
			
		||||
pkcs_1_emsa_test.obj pkcs_1_eme_test.obj
 | 
			
		||||
 | 
			
		||||
tomcrypt_prof.lib: $(OBJECTS)
 | 
			
		||||
	lib /out:tomcrypt_prof.lib $(OBJECTS)
 | 
			
		||||
 | 
			
		||||
@ -6,9 +6,10 @@ LTCOMPILE = $(LT) --mode=compile --tag=CC $(CC)
 | 
			
		||||
 | 
			
		||||
CFLAGS += -I../src/headers -I./ -Wall -Wsign-compare -W -Wshadow -Wno-unused-parameter
 | 
			
		||||
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o                                   \
 | 
			
		||||
OBJECTS = base64_test.o cipher_hash_test.o der_tests.o no_prng.o                         \
 | 
			
		||||
dsa_test.o ecc_test.o mac_test.o modes_test.o pkcs_1_test.o rsa_test.o                   \
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o misc_test.o
 | 
			
		||||
store_test.o test_driver.o x86_prof.o katja_test.o dh_test.o misc_test.o                 \
 | 
			
		||||
pkcs_1_pss_test.o pkcs_1_oaep_test.o pkcs_1_emsa_test.o pkcs_1_eme_test.o
 | 
			
		||||
 | 
			
		||||
ifndef LIBTEST
 | 
			
		||||
   LIBTEST=libtomcrypt_prof.la
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										148
									
								
								testprof/no_prng.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								testprof/no_prng.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,148 @@
 | 
			
		||||
/* LibTomCrypt, modular cryptographic library
 | 
			
		||||
 *
 | 
			
		||||
 * LibTomCrypt is a library that provides various cryptographic
 | 
			
		||||
 * algorithms in a highly modular and flexible manner.
 | 
			
		||||
 *
 | 
			
		||||
 * The library is free for all purposes without any express
 | 
			
		||||
 * guarantee it works.
 | 
			
		||||
 *
 | 
			
		||||
 * http://libtom.org
 | 
			
		||||
 */
 | 
			
		||||
#include "tomcrypt.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  @file no_prng.c
 | 
			
		||||
  NO PRNG, Steffen Jaeckel
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
static unsigned char no_prng_entropy[1024];
 | 
			
		||||
static unsigned long no_prng_len = 0;
 | 
			
		||||
static unsigned long no_prng_offset = 0;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Start the PRNG
 | 
			
		||||
  @param prng     [out] The PRNG state to initialize
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_start(prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
    no_prng_len = 0;
 | 
			
		||||
    no_prng_offset = 0;
 | 
			
		||||
 | 
			
		||||
    return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Add entropy to the PRNG state
 | 
			
		||||
  @param in       The data to add
 | 
			
		||||
  @param inlen    Length of the data to add
 | 
			
		||||
  @param prng     PRNG state to update
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_add_entropy(const unsigned char *in, unsigned long inlen, prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
    LTC_ARGCHK(in  != NULL);
 | 
			
		||||
    LTC_ARGCHK(inlen <= sizeof(no_prng_entropy));
 | 
			
		||||
 | 
			
		||||
    no_prng_len = MIN(inlen, sizeof(no_prng_entropy));
 | 
			
		||||
    memcpy(no_prng_entropy, in, no_prng_len);
 | 
			
		||||
    no_prng_offset = 0;
 | 
			
		||||
 | 
			
		||||
    return CRYPT_OK;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Make the PRNG ready to read from
 | 
			
		||||
  @param prng   The PRNG to make active
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_ready(prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
    LTC_ARGCHK(prng != NULL);
 | 
			
		||||
 | 
			
		||||
    return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Read from the PRNG
 | 
			
		||||
  @param out      Destination
 | 
			
		||||
  @param outlen   Length of output
 | 
			
		||||
  @param prng     The active PRNG to read from
 | 
			
		||||
  @return Number of octets read
 | 
			
		||||
*/
 | 
			
		||||
unsigned long no_prng_read(unsigned char *out, unsigned long outlen, prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
   LTC_ARGCHK(out != NULL);
 | 
			
		||||
 | 
			
		||||
   outlen = MIN(outlen, no_prng_len - no_prng_offset);
 | 
			
		||||
   memcpy(out, &no_prng_entropy[no_prng_offset], outlen);
 | 
			
		||||
   no_prng_offset += outlen;
 | 
			
		||||
 | 
			
		||||
   return outlen;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Terminate the PRNG
 | 
			
		||||
  @param prng   The PRNG to terminate
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_done(prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
   return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Export the PRNG state
 | 
			
		||||
  @param out       [out] Destination
 | 
			
		||||
  @param outlen    [in/out] Max size and resulting size of the state
 | 
			
		||||
  @param prng      The PRNG to export
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_export(unsigned char *out, unsigned long *outlen, prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
   return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  Import a PRNG state
 | 
			
		||||
  @param in       The PRNG state
 | 
			
		||||
  @param inlen    Size of the state
 | 
			
		||||
  @param prng     The PRNG to import
 | 
			
		||||
  @return CRYPT_OK if successful
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_import(const unsigned char *in, unsigned long inlen, prng_state *prng)
 | 
			
		||||
{
 | 
			
		||||
   return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  PRNG self-test
 | 
			
		||||
  @return CRYPT_OK if successful, CRYPT_NOP if self-testing has been disabled
 | 
			
		||||
*/
 | 
			
		||||
int no_prng_test(void)
 | 
			
		||||
{
 | 
			
		||||
   return CRYPT_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct ltc_prng_descriptor no_prng_desc =
 | 
			
		||||
{
 | 
			
		||||
   "no_prng", 0,
 | 
			
		||||
    &no_prng_start,
 | 
			
		||||
    &no_prng_add_entropy,
 | 
			
		||||
    &no_prng_ready,
 | 
			
		||||
    &no_prng_read,
 | 
			
		||||
    &no_prng_done,
 | 
			
		||||
    &no_prng_export,
 | 
			
		||||
    &no_prng_import,
 | 
			
		||||
    &no_prng_test
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* $Source$ */
 | 
			
		||||
/* $Revision$ */
 | 
			
		||||
/* $Date$ */
 | 
			
		||||
							
								
								
									
										69
									
								
								testprof/pkcs_1_eme_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								testprof/pkcs_1_eme_test.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
			
		||||
#include <tomcrypt_test.h>
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
#include "../notes/rsa-testvectors/pkcs1v15crypt-vectors.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int pkcs_1_eme_test(void)
 | 
			
		||||
{
 | 
			
		||||
  int prng_idx = register_prng(&no_prng_desc);
 | 
			
		||||
  int hash_idx = find_hash("sha1");
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
  DO(prng_is_valid(prng_idx));
 | 
			
		||||
  DO(hash_is_valid(hash_idx));
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < sizeof(testcases_eme)/sizeof(testcases_eme[0]); ++i) {
 | 
			
		||||
    testcase_t* t = &testcases_eme[i];
 | 
			
		||||
    rsa_key k, *key = &k;
 | 
			
		||||
    DOX(mp_init_multi(&key->e, &key->d, &key->N, &key->dQ,
 | 
			
		||||
                       &key->dP, &key->qP, &key->p, &key->q, NULL), t->name);
 | 
			
		||||
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->e, t->rsa.e, t->rsa.e_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->d, t->rsa.d, t->rsa.d_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->N, t->rsa.n, t->rsa.n_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dQ, t->rsa.dQ, t->rsa.dQ_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dP, t->rsa.dP, t->rsa.dP_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->qP, t->rsa.qInv, t->rsa.qInv_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->q, t->rsa.q, t->rsa.q_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->p, t->rsa.p, t->rsa.p_l), t->name);
 | 
			
		||||
    key->type = PK_PRIVATE;
 | 
			
		||||
 | 
			
		||||
    unsigned int j;
 | 
			
		||||
    for (j = 0; j < sizeof(t->data)/sizeof(t->data[0]); ++j) {
 | 
			
		||||
        rsaData_t* s = &t->data[j];
 | 
			
		||||
        unsigned char buf[256], obuf[256];
 | 
			
		||||
        unsigned long buflen = sizeof(buf), obuflen = sizeof(obuf);
 | 
			
		||||
        int stat;
 | 
			
		||||
        prng_descriptor[prng_idx].add_entropy(s->o2, s->o2_l, NULL);
 | 
			
		||||
        DOX(rsa_encrypt_key_ex(s->o1, s->o1_l, obuf, &obuflen, NULL, 0, NULL, prng_idx, -1, LTC_PKCS_1_V1_5, key), s->name);
 | 
			
		||||
        DOX(obuflen == (unsigned long)s->o3_l?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(memcmp(s->o3, obuf, s->o3_l)==0?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(rsa_decrypt_key_ex(obuf, obuflen, buf, &buflen, NULL, 0, -1, LTC_PKCS_1_V1_5, &stat, key), s->name);
 | 
			
		||||
        DOX(stat == 1?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
    } /* for */
 | 
			
		||||
 | 
			
		||||
    mp_clear_multi(key->d,  key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, NULL);
 | 
			
		||||
  } /* for */
 | 
			
		||||
 | 
			
		||||
  unregister_prng(&no_prng_desc);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
int pkcs_1_eme_test(void)
 | 
			
		||||
{
 | 
			
		||||
   fprintf(stderr, "NOP");
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* $Source$ */
 | 
			
		||||
/* $Revision$ */
 | 
			
		||||
/* $Date$ */
 | 
			
		||||
							
								
								
									
										65
									
								
								testprof/pkcs_1_emsa_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								testprof/pkcs_1_emsa_test.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
			
		||||
#include <tomcrypt_test.h>
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
#include "../notes/rsa-testvectors/pkcs1v15sign-vectors.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int pkcs_1_emsa_test(void)
 | 
			
		||||
{
 | 
			
		||||
  int hash_idx = find_hash("sha1");
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
  DO(hash_is_valid(hash_idx));
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < sizeof(testcases_emsa)/sizeof(testcases_emsa[0]); ++i) {
 | 
			
		||||
    testcase_t* t = &testcases_emsa[i];
 | 
			
		||||
    rsa_key k, *key = &k;
 | 
			
		||||
    DOX(mp_init_multi(&key->e, &key->d, &key->N, &key->dQ,
 | 
			
		||||
                       &key->dP, &key->qP, &key->p, &key->q, NULL), t->name);
 | 
			
		||||
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->e, t->rsa.e, t->rsa.e_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->d, t->rsa.d, t->rsa.d_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->N, t->rsa.n, t->rsa.n_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dQ, t->rsa.dQ, t->rsa.dQ_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dP, t->rsa.dP, t->rsa.dP_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->qP, t->rsa.qInv, t->rsa.qInv_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->q, t->rsa.q, t->rsa.q_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->p, t->rsa.p, t->rsa.p_l), t->name);
 | 
			
		||||
    key->type = PK_PRIVATE;
 | 
			
		||||
 | 
			
		||||
    unsigned int j;
 | 
			
		||||
    for (j = 0; j < sizeof(t->data)/sizeof(t->data[0]); ++j) {
 | 
			
		||||
        rsaData_t* s = &t->data[j];
 | 
			
		||||
        unsigned char buf[20], obuf[256];
 | 
			
		||||
        unsigned long buflen = sizeof(buf), obuflen = sizeof(obuf);
 | 
			
		||||
        int stat;
 | 
			
		||||
        DOX(hash_memory(hash_idx, s->o1, s->o1_l, buf, &buflen), s->name);
 | 
			
		||||
        DOX(rsa_sign_hash_ex(buf, buflen, obuf, &obuflen, LTC_PKCS_1_V1_5, NULL, -1, hash_idx, 0, key), s->name);
 | 
			
		||||
        DOX(obuflen == (unsigned long)s->o2_l?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(memcmp(s->o2, obuf, s->o2_l)==0?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(rsa_verify_hash_ex(obuf, obuflen, buf, buflen, LTC_PKCS_1_V1_5, hash_idx, 0, &stat, key), s->name);
 | 
			
		||||
        DOX(stat == 1?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
    } /* for */
 | 
			
		||||
 | 
			
		||||
    mp_clear_multi(key->d,  key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, NULL);
 | 
			
		||||
  } /* for */
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
int pkcs_1_emsa_test(void)
 | 
			
		||||
{
 | 
			
		||||
   fprintf(stderr, "NOP");
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* $Source$ */
 | 
			
		||||
/* $Revision$ */
 | 
			
		||||
/* $Date$ */
 | 
			
		||||
							
								
								
									
										69
									
								
								testprof/pkcs_1_oaep_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								testprof/pkcs_1_oaep_test.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,69 @@
 | 
			
		||||
#include <tomcrypt_test.h>
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
#include "../notes/rsa-testvectors/oaep-vect.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int pkcs_1_oaep_test(void)
 | 
			
		||||
{
 | 
			
		||||
  int prng_idx = register_prng(&no_prng_desc);
 | 
			
		||||
  int hash_idx = find_hash("sha1");
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
  DO(prng_is_valid(prng_idx));
 | 
			
		||||
  DO(hash_is_valid(hash_idx));
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < sizeof(testcases_oaep)/sizeof(testcases_oaep[0]); ++i) {
 | 
			
		||||
    testcase_t* t = &testcases_oaep[i];
 | 
			
		||||
    rsa_key k, *key = &k;
 | 
			
		||||
    DOX(mp_init_multi(&key->e, &key->d, &key->N, &key->dQ,
 | 
			
		||||
                       &key->dP, &key->qP, &key->p, &key->q, NULL), t->name);
 | 
			
		||||
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->e, t->rsa.e, t->rsa.e_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->d, t->rsa.d, t->rsa.d_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->N, t->rsa.n, t->rsa.n_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dQ, t->rsa.dQ, t->rsa.dQ_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dP, t->rsa.dP, t->rsa.dP_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->qP, t->rsa.qInv, t->rsa.qInv_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->q, t->rsa.q, t->rsa.q_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->p, t->rsa.p, t->rsa.p_l), t->name);
 | 
			
		||||
    key->type = PK_PRIVATE;
 | 
			
		||||
 | 
			
		||||
    unsigned int j;
 | 
			
		||||
    for (j = 0; j < sizeof(t->data)/sizeof(t->data[0]); ++j) {
 | 
			
		||||
        rsaData_t* s = &t->data[j];
 | 
			
		||||
        unsigned char buf[256], obuf[256];
 | 
			
		||||
        unsigned long buflen = sizeof(buf), obuflen = sizeof(obuf);
 | 
			
		||||
        int stat;
 | 
			
		||||
        prng_descriptor[prng_idx].add_entropy(s->o2, s->o2_l, NULL);
 | 
			
		||||
        DOX(rsa_encrypt_key(s->o1, s->o1_l, obuf, &obuflen, NULL, 0, NULL, prng_idx, hash_idx, key), s->name);
 | 
			
		||||
        DOX(obuflen == (unsigned long)s->o3_l?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(memcmp(s->o3, obuf, s->o3_l)==0?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(rsa_decrypt_key(obuf, obuflen, buf, &buflen, NULL, 0, hash_idx, &stat, key), s->name);
 | 
			
		||||
        DOX(stat == 1?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
    } /* for */
 | 
			
		||||
 | 
			
		||||
    mp_clear_multi(key->d,  key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, NULL);
 | 
			
		||||
  } /* for */
 | 
			
		||||
 | 
			
		||||
  unregister_prng(&no_prng_desc);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
int pkcs_1_oaep_test(void)
 | 
			
		||||
{
 | 
			
		||||
   fprintf(stderr, "NOP");
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* $Source$ */
 | 
			
		||||
/* $Revision$ */
 | 
			
		||||
/* $Date$ */
 | 
			
		||||
							
								
								
									
										70
									
								
								testprof/pkcs_1_pss_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								testprof/pkcs_1_pss_test.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,70 @@
 | 
			
		||||
#include <tomcrypt_test.h>
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
#include "../notes/rsa-testvectors/pss-vect.c"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int pkcs_1_pss_test(void)
 | 
			
		||||
{
 | 
			
		||||
  int prng_idx = register_prng(&no_prng_desc);
 | 
			
		||||
  int hash_idx = find_hash("sha1");
 | 
			
		||||
  unsigned int i;
 | 
			
		||||
 | 
			
		||||
  DO(prng_is_valid(prng_idx));
 | 
			
		||||
  DO(hash_is_valid(hash_idx));
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < sizeof(testcases_pss)/sizeof(testcases_pss[0]); ++i) {
 | 
			
		||||
    testcase_t* t = &testcases_pss[i];
 | 
			
		||||
    rsa_key k, *key = &k;
 | 
			
		||||
    DOX(mp_init_multi(&key->e, &key->d, &key->N, &key->dQ,
 | 
			
		||||
                       &key->dP, &key->qP, &key->p, &key->q, NULL), t->name);
 | 
			
		||||
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->e, t->rsa.e, t->rsa.e_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->d, t->rsa.d, t->rsa.d_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->N, t->rsa.n, t->rsa.n_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dQ, t->rsa.dQ, t->rsa.dQ_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->dP, t->rsa.dP, t->rsa.dP_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->qP, t->rsa.qInv, t->rsa.qInv_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->q, t->rsa.q, t->rsa.q_l), t->name);
 | 
			
		||||
    DOX(mp_read_unsigned_bin(key->p, t->rsa.p, t->rsa.p_l), t->name);
 | 
			
		||||
    key->type = PK_PRIVATE;
 | 
			
		||||
 | 
			
		||||
    unsigned int j;
 | 
			
		||||
    for (j = 0; j < sizeof(t->data)/sizeof(t->data[0]); ++j) {
 | 
			
		||||
        rsaData_t* s = &t->data[j];
 | 
			
		||||
        unsigned char buf[20], obuf[256];
 | 
			
		||||
        unsigned long buflen = sizeof(buf), obuflen = sizeof(obuf);
 | 
			
		||||
        int stat;
 | 
			
		||||
        prng_descriptor[prng_idx].add_entropy(s->o2, s->o2_l, NULL);
 | 
			
		||||
        DOX(hash_memory(hash_idx, s->o1, s->o1_l, buf, &buflen), s->name);
 | 
			
		||||
        DOX(rsa_sign_hash(buf, buflen, obuf, &obuflen, NULL, prng_idx, hash_idx, s->o2_l, key), s->name);
 | 
			
		||||
        DOX(obuflen == (unsigned long)s->o3_l?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(memcmp(s->o3, obuf, s->o3_l)==0?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
        DOX(rsa_verify_hash(obuf, obuflen, buf, buflen, hash_idx, s->o2_l, &stat, key), s->name);
 | 
			
		||||
        DOX(stat == 1?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, s->name);
 | 
			
		||||
    } /* for */
 | 
			
		||||
 | 
			
		||||
    mp_clear_multi(key->d,  key->e, key->N, key->dQ, key->dP, key->qP, key->p, key->q, NULL);
 | 
			
		||||
  } /* for */
 | 
			
		||||
 | 
			
		||||
  unregister_prng(&no_prng_desc);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
int pkcs_1_pss_test(void)
 | 
			
		||||
{
 | 
			
		||||
   fprintf(stderr, "NOP");
 | 
			
		||||
   return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* $Source$ */
 | 
			
		||||
/* $Revision$ */
 | 
			
		||||
/* $Date$ */
 | 
			
		||||
@ -2,6 +2,12 @@
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_TEST_REAL_RAND
 | 
			
		||||
#define LTC_TEST_RAND_SEED  time(NULL)
 | 
			
		||||
#else
 | 
			
		||||
#define LTC_TEST_RAND_SEED  23
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int pkcs_1_test(void)
 | 
			
		||||
{
 | 
			
		||||
   unsigned char buf[3][128];
 | 
			
		||||
@ -18,7 +24,7 @@ int pkcs_1_test(void)
 | 
			
		||||
      return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   srand(time(NULL));
 | 
			
		||||
   srand(LTC_TEST_RAND_SEED);
 | 
			
		||||
   /* do many tests */
 | 
			
		||||
   for (x = 0; x < 100; x++) {
 | 
			
		||||
      zeromem(buf, sizeof(buf));
 | 
			
		||||
 | 
			
		||||
@ -104,8 +104,8 @@ int rsa_test(void)
 | 
			
		||||
{
 | 
			
		||||
   unsigned char in[1024], out[1024], tmp[1024];
 | 
			
		||||
   rsa_key       key, privKey, pubKey;
 | 
			
		||||
   int           hash_idx, prng_idx, stat, stat2;
 | 
			
		||||
   unsigned long rsa_msgsize, len, len2, cnt;
 | 
			
		||||
   int           hash_idx, prng_idx, stat, stat2, i;
 | 
			
		||||
   unsigned long rsa_msgsize, len, len2, len3, cnt, cnt2;
 | 
			
		||||
   static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 };
 | 
			
		||||
 | 
			
		||||
   if (rsa_compat_test() != 0) {
 | 
			
		||||
@ -186,24 +186,9 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
      if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
 | 
			
		||||
         unsigned long x;
 | 
			
		||||
         fprintf(stderr, "\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2);
 | 
			
		||||
         fprintf(stderr, "Original contents: \n");
 | 
			
		||||
         for (x = 0; x < rsa_msgsize; ) {
 | 
			
		||||
             fprintf(stderr, "%02x ", in[x]);
 | 
			
		||||
             if (!(++x % 16)) {
 | 
			
		||||
                fprintf(stderr, "\n");
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
         fprintf(stderr, "\n");
 | 
			
		||||
         fprintf(stderr, "Output contents: \n");
 | 
			
		||||
         for (x = 0; x < rsa_msgsize; ) {
 | 
			
		||||
             fprintf(stderr, "%02x ", out[x]);
 | 
			
		||||
             if (!(++x % 16)) {
 | 
			
		||||
                fprintf(stderr, "\n");
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
         fprintf(stderr, "\n");
 | 
			
		||||
         print_hex("Original", in, rsa_msgsize);
 | 
			
		||||
         print_hex("Output", tmp, len2);
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@ -232,6 +217,8 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
      }
 | 
			
		||||
      if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
 | 
			
		||||
         fprintf(stderr, "rsa_decrypt_key mismatch len %lu", len2);
 | 
			
		||||
         print_hex("Original", in, rsa_msgsize);
 | 
			
		||||
         print_hex("Output", tmp, len2);
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
@ -240,18 +227,26 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
   for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) {
 | 
			
		||||
      len  = sizeof(out);
 | 
			
		||||
      len2 = rsa_msgsize;
 | 
			
		||||
      /* make a random key/msg */
 | 
			
		||||
      yarrow_read(in, rsa_msgsize, &yarrow_prng);
 | 
			
		||||
      DO(rsa_encrypt_key_ex(in, rsa_msgsize, out, &len, NULL, 0, &yarrow_prng, prng_idx, 0, LTC_PKCS_1_V1_5, &key));
 | 
			
		||||
 | 
			
		||||
      len2 = rsa_msgsize;
 | 
			
		||||
      DO(rsa_decrypt_key_ex(out, len, tmp, &len2, NULL, 0, 0, LTC_PKCS_1_V1_5, &stat, &key));
 | 
			
		||||
      if (!(stat == 1 && stat2 == 0)) {
 | 
			
		||||
      if (stat != 1) {
 | 
			
		||||
         fprintf(stderr, "rsa_decrypt_key_ex failed, %d, %d", stat, stat2);
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
      if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) {
 | 
			
		||||
      if (len2 != rsa_msgsize) {
 | 
			
		||||
         fprintf(stderr, "rsa_decrypt_key_ex mismatch len %lu", len2);
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
      if (memcmp(tmp, in, rsa_msgsize)) {
 | 
			
		||||
         fprintf(stderr, "rsa_decrypt_key_ex mismatch data");
 | 
			
		||||
         print_hex("Original", in, rsa_msgsize);
 | 
			
		||||
         print_hex("Output", tmp, rsa_msgsize);
 | 
			
		||||
         return 1;
 | 
			
		||||
      }
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* sign a message (unsalted, lower cholestorol and Atkins approved) now */
 | 
			
		||||
@ -281,7 +276,7 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* verify with privKey */
 | 
			
		||||
   /* change a byte */
 | 
			
		||||
   /* change byte back to original */
 | 
			
		||||
   in[0] ^= 1;
 | 
			
		||||
   DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &privKey));
 | 
			
		||||
   /* change a byte */
 | 
			
		||||
@ -297,7 +292,7 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* verify with pubKey */
 | 
			
		||||
   /* change a byte */
 | 
			
		||||
   /* change byte back to original */
 | 
			
		||||
   in[0] ^= 1;
 | 
			
		||||
   DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &pubKey));
 | 
			
		||||
   /* change a byte */
 | 
			
		||||
@ -344,6 +339,85 @@ for (cnt = 0; cnt < len; ) {
 | 
			
		||||
      return 1;
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* Testcase for Bleichenbacher attack
 | 
			
		||||
    *
 | 
			
		||||
    * (1) Create a valid signature
 | 
			
		||||
    * (2) Check that it can be verified
 | 
			
		||||
    * (3) Decrypt the package to fetch plain text
 | 
			
		||||
    * (4) Forge the structure of PKCS#1-EMSA encoded data
 | 
			
		||||
    * (4.1) Search for start and end of the padding string
 | 
			
		||||
    * (4.2) Move the signature to the front of the padding string
 | 
			
		||||
    * (4.3) Zero the message until the end
 | 
			
		||||
    * (5) Encrypt the package again
 | 
			
		||||
    * (6) Profit :)
 | 
			
		||||
    *     For PS lengths < 8:  the verification process should fail
 | 
			
		||||
    *     For PS lengths >= 8: the verification process should succeed
 | 
			
		||||
    *     For all PS lengths:  the result should not be valid
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
   unsigned char* p = in;
 | 
			
		||||
   unsigned char* p2 = out;
 | 
			
		||||
   unsigned char* p3 = tmp;
 | 
			
		||||
   for (i = 0; i < 9; ++i) {
 | 
			
		||||
     len = sizeof(in);
 | 
			
		||||
     len2 = sizeof(out);
 | 
			
		||||
     cnt = rsa_get_size(&key);
 | 
			
		||||
     /* (1) */
 | 
			
		||||
     DO(rsa_sign_hash_ex(p, 20, p2, &len2, LTC_PKCS_1_V1_5, &yarrow_prng, prng_idx, hash_idx, 8, &privKey));
 | 
			
		||||
     /* (2) */
 | 
			
		||||
     DOX(rsa_verify_hash_ex(p2, len2, p, 20, LTC_PKCS_1_V1_5, hash_idx, -1, &stat, &pubKey), "should succeed");
 | 
			
		||||
     DOX(stat == 1?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, "should succeed");
 | 
			
		||||
     len3 = sizeof(tmp);
 | 
			
		||||
     /* (3) */
 | 
			
		||||
     DO(ltc_mp.rsa_me(p2, len2, p3, &len3, PK_PUBLIC, &key));
 | 
			
		||||
     /* (4) */
 | 
			
		||||
#if 0
 | 
			
		||||
     printf("\nBefore:");
 | 
			
		||||
     for (cnt = 0; cnt < len3; ++cnt) {
 | 
			
		||||
       if (cnt%32 == 0)
 | 
			
		||||
         printf("\n%3lu:", cnt);
 | 
			
		||||
       printf(" %02x", p3[cnt]);
 | 
			
		||||
     }
 | 
			
		||||
#endif
 | 
			
		||||
     /* (4.1) */
 | 
			
		||||
     for (cnt = 0; cnt < len3; ++cnt) {
 | 
			
		||||
        if (p3[cnt] == 0xff)
 | 
			
		||||
          break;
 | 
			
		||||
     }
 | 
			
		||||
     for (cnt2 = cnt+1; cnt2 < len3; ++cnt2) {
 | 
			
		||||
        if (p3[cnt2] != 0xff)
 | 
			
		||||
          break;
 | 
			
		||||
     }
 | 
			
		||||
     /* (4.2) */
 | 
			
		||||
     memmove(&p3[cnt+i], &p3[cnt2], len3-cnt2);
 | 
			
		||||
     /* (4.3) */
 | 
			
		||||
     for (cnt = cnt + len3-cnt2+i; cnt < len; ++cnt) {
 | 
			
		||||
        p3[cnt] = 0;
 | 
			
		||||
     }
 | 
			
		||||
#if 0
 | 
			
		||||
     printf("\nAfter:");
 | 
			
		||||
     for (cnt = 0; cnt < len3; ++cnt) {
 | 
			
		||||
       if (cnt%32 == 0)
 | 
			
		||||
         printf("\n%3lu:", cnt);
 | 
			
		||||
       printf(" %02x", p3[cnt]);
 | 
			
		||||
     }
 | 
			
		||||
     printf("\n");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
     len2 = sizeof(out);
 | 
			
		||||
     /* (5) */
 | 
			
		||||
     DO(ltc_mp.rsa_me(p3, len3, p2, &len2, PK_PRIVATE, &key));
 | 
			
		||||
 | 
			
		||||
     len3 = sizeof(tmp);
 | 
			
		||||
     /* (6) */
 | 
			
		||||
     if (i < 8)
 | 
			
		||||
       DOX(rsa_verify_hash_ex(p2, len2, p, 20, LTC_PKCS_1_V1_5, hash_idx, -1, &stat, &pubKey)
 | 
			
		||||
           == CRYPT_INVALID_PACKET ? CRYPT_OK:CRYPT_INVALID_PACKET, "should fail");
 | 
			
		||||
     else
 | 
			
		||||
       DOX(rsa_verify_hash_ex(p2, len2, p, 20, LTC_PKCS_1_V1_5, hash_idx, -1, &stat, &pubKey), "should succeed");
 | 
			
		||||
     DOX(stat == 0?CRYPT_OK:CRYPT_FAIL_TESTVECTOR, "should fail");
 | 
			
		||||
   }
 | 
			
		||||
 | 
			
		||||
   /* free the key and return */
 | 
			
		||||
   rsa_free(&key);
 | 
			
		||||
   rsa_free(&pubKey);
 | 
			
		||||
 | 
			
		||||
@ -39,11 +39,11 @@ extern prng_state yarrow_prng;
 | 
			
		||||
void run_cmd(int res, int line, char *file, char *cmd, const char *algorithm);
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_VERBOSE
 | 
			
		||||
#define DO(x) do { fprintf(stderr, "%s:\n", #x); run_cmd((x), __LINE__, __FILE__, #x, NULL); } while (0);
 | 
			
		||||
#define DOX(x, str) do { fprintf(stderr, "%s - %s:\n", #x, (str)); run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0);
 | 
			
		||||
#define DO(x) do { fprintf(stderr, "%s:\n", #x); run_cmd((x), __LINE__, __FILE__, #x, NULL); } while (0)
 | 
			
		||||
#define DOX(x, str) do { fprintf(stderr, "%s - %s:\n", #x, (str)); run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0)
 | 
			
		||||
#else
 | 
			
		||||
#define DO(x) do { run_cmd((x), __LINE__, __FILE__, #x, NULL); } while (0);
 | 
			
		||||
#define DOX(x, str) do { run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0);
 | 
			
		||||
#define DO(x) do { run_cmd((x), __LINE__, __FILE__, #x, NULL); } while (0)
 | 
			
		||||
#define DOX(x, str) do { run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* TESTS */
 | 
			
		||||
@ -51,6 +51,10 @@ int cipher_hash_test(void);
 | 
			
		||||
int modes_test(void);
 | 
			
		||||
int mac_test(void);
 | 
			
		||||
int pkcs_1_test(void);
 | 
			
		||||
int pkcs_1_pss_test(void);
 | 
			
		||||
int pkcs_1_oaep_test(void);
 | 
			
		||||
int pkcs_1_emsa_test(void);
 | 
			
		||||
int pkcs_1_eme_test(void);
 | 
			
		||||
int store_test(void);
 | 
			
		||||
int rsa_test(void);
 | 
			
		||||
int dh_test(void);
 | 
			
		||||
@ -72,6 +76,11 @@ extern struct list {
 | 
			
		||||
 | 
			
		||||
extern int no_results;
 | 
			
		||||
 | 
			
		||||
#ifdef LTC_PKCS_1
 | 
			
		||||
extern const struct ltc_prng_descriptor no_prng_desc;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void print_hex(const char* what, const unsigned char* p, const unsigned long l);
 | 
			
		||||
int sorter(const void *a, const void *b);
 | 
			
		||||
void tally_results(int type);
 | 
			
		||||
ulong64 rdtsc (void);
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,19 @@
 | 
			
		||||
 | 
			
		||||
prng_state yarrow_prng;
 | 
			
		||||
 | 
			
		||||
void print_hex(const char* what, const unsigned char* p, const unsigned long l)
 | 
			
		||||
{
 | 
			
		||||
  unsigned long x;
 | 
			
		||||
  fprintf(stderr, "%s contents: \n", what);
 | 
			
		||||
  for (x = 0; x < l; ) {
 | 
			
		||||
      fprintf(stderr, "%02x ", p[x]);
 | 
			
		||||
      if (!(++x % 16)) {
 | 
			
		||||
         fprintf(stderr, "\n");
 | 
			
		||||
      }
 | 
			
		||||
  }
 | 
			
		||||
  fprintf(stderr, "\n");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct list results[100];
 | 
			
		||||
int no_results;
 | 
			
		||||
int sorter(const void *a, const void *b)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user