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("\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("\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_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("\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("\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); |    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; |    hLen        = hash_descriptor[hash_idx].hashsize; | ||||||
|  |    modulus_bitlen--; | ||||||
|    modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); |    modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); | ||||||
| 
 | 
 | ||||||
|    /* check sizes */ |    /* check sizes */ | ||||||
|    if ((saltlen > modulus_len) || |    if ((saltlen > modulus_len) || | ||||||
|        (modulus_len < hLen + saltlen + 2) || (siglen != modulus_len)) { |        (modulus_len < hLen + saltlen + 2)) { | ||||||
|       return CRYPT_PK_INVALID_SIZE; |       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); |    XMEMCPY(hash, sig + x, hLen); | ||||||
|    x += hLen; |    x += hLen; | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|    /* check the MSB */ |    /* 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; |       err = CRYPT_INVALID_PACKET; | ||||||
|       goto LBL_ERR; |       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] */ |    /* 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 */ |    /* 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; |    hLen        = hash_descriptor[hash_idx].hashsize; | ||||||
|  |    modulus_bitlen--; | ||||||
|    modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); |    modulus_len = (modulus_bitlen>>3) + (modulus_bitlen & 7 ? 1 : 0); | ||||||
| 
 | 
 | ||||||
|    /* check sizes */ |    /* check sizes */ | ||||||
| @ -147,7 +148,7 @@ int pkcs_1_pss_encode(const unsigned char *msghash, unsigned long msghashlen, | |||||||
|    out[y] = 0xBC; |    out[y] = 0xBC; | ||||||
| 
 | 
 | ||||||
|    /* now clear the 8*modulus_len - modulus_bitlen most significant bits */ |    /* 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 */ |    /* store output size */ | ||||||
|    *outlen = modulus_len; |    *outlen = modulus_len; | ||||||
|  | |||||||
| @ -65,9 +65,8 @@ int pkcs_1_v1_5_decode(const unsigned char *msg, | |||||||
|     } |     } | ||||||
|     ps_len = i++ - 2; |     ps_len = i++ - 2; | ||||||
| 
 | 
 | ||||||
|     if ((i >= modulus_len) || (ps_len < 8)) { |     if (i >= modulus_len) { | ||||||
|       /* There was no octet with hexadecimal value 0x00 to separate ps from m,
 |       /* There was no octet with hexadecimal value 0x00 to separate ps from m.
 | ||||||
|        * or the length of ps is less than 8 octets. |  | ||||||
|        */ |        */ | ||||||
|       result = CRYPT_INVALID_PACKET; |       result = CRYPT_INVALID_PACKET; | ||||||
|       goto bail; |       goto bail; | ||||||
| @ -87,6 +86,14 @@ int pkcs_1_v1_5_decode(const unsigned char *msg, | |||||||
|     ps_len = i - 2; |     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))) { |   if (*outlen < (msglen - (2 + ps_len + 1))) { | ||||||
|     *outlen = msglen - (2 + ps_len + 1); |     *outlen = msglen - (2 + ps_len + 1); | ||||||
|     result = CRYPT_BUFFER_OVERFLOW; |     result = CRYPT_BUFFER_OVERFLOW; | ||||||
|  | |||||||
| @ -76,7 +76,7 @@ int rsa_exptmod(const unsigned char *in,   unsigned long inlen, | |||||||
|    if (which == PK_PRIVATE) { |    if (which == PK_PRIVATE) { | ||||||
|       #ifdef LTC_RSA_BLINDING |       #ifdef LTC_RSA_BLINDING | ||||||
|       /* do 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) { |       if (err != CRYPT_OK) { | ||||||
|              goto error; |              goto error; | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -92,11 +92,18 @@ int rsa_verify_hash_ex(const unsigned char *sig,      unsigned long siglen, | |||||||
| 
 | 
 | ||||||
|   if (padding == LTC_PKCS_1_PSS) { |   if (padding == LTC_PKCS_1_PSS) { | ||||||
|     /* PSS decode and verify it */ |     /* PSS decode and verify it */ | ||||||
|  | 
 | ||||||
|  |     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); |       err = pkcs_1_pss_decode(hash, hashlen, tmpbuf, x, saltlen, hash_idx, modulus_bitlen, stat); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|   } else { |   } else { | ||||||
|     /* PKCS #1 v1.5 decode it */ |     /* PKCS #1 v1.5 decode it */ | ||||||
|     unsigned char *out; |     unsigned char *out; | ||||||
|     unsigned long outlen, loid[16]; |     unsigned long outlen, loid[16], reallen; | ||||||
|     int           decoded; |     int           decoded; | ||||||
|     ltc_asn1_list digestinfo[2], siginfo[2]; |     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; |        goto bail_2; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     if ((err = der_length_sequence(siginfo, 2, &reallen)) != CRYPT_OK) { | ||||||
|  |        XFREE(out); | ||||||
|  |        goto bail_2; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /* test OID */ |     /* 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) && |         (XMEMCMP(digestinfo[0].data, hash_descriptor[hash_idx].OID, sizeof(unsigned long) * hash_descriptor[hash_idx].OIDlen) == 0) && | ||||||
|         (siginfo[1].size == hashlen) && |         (siginfo[1].size == hashlen) && | ||||||
|         (XMEMCMP(siginfo[1].data, hash, hashlen) == 0)) { |         (XMEMCMP(siginfo[1].data, hash, hashlen) == 0)) { | ||||||
|  | |||||||
| @ -5,9 +5,10 @@ ifndef RANLIB | |||||||
|    RANLIB=ranlib |    RANLIB=ranlib | ||||||
| endif | 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       \ | 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 | ifndef LIBTEST_S | ||||||
|    LIBTEST_S=libtomcrypt_prof.a |    LIBTEST_S=libtomcrypt_prof.a | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| CFLAGS += -I../src/headers -I./  | CFLAGS += -I../src/headers -I./  | ||||||
| CC?=icc | 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                   \ | 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 | ifndef LIBTEST_S | ||||||
|    LIBTEST_S = libtomcrypt_prof.a |    LIBTEST_S = libtomcrypt_prof.a | ||||||
|  | |||||||
| @ -4,9 +4,10 @@ | |||||||
| 
 | 
 | ||||||
| CFLAGS = $(CFLAGS_OPTS) -W -I../src/headers -I. -Wall -W | 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       \ | 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) | default: $(LIBTEST_S) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,9 +1,10 @@ | |||||||
| CFLAGS = /I../src/headers/ /I./ /Ox /DWIN32 /DLTC_SOURCE /W3 /Fo$@ | 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 \ | 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 \ | 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) | tomcrypt_prof.lib: $(OBJECTS) | ||||||
| 	lib /out: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 | 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                   \ | 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 | ifndef LIBTEST | ||||||
|    LIBTEST=libtomcrypt_prof.la |    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_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) | int pkcs_1_test(void) | ||||||
| { | { | ||||||
|    unsigned char buf[3][128]; |    unsigned char buf[3][128]; | ||||||
| @ -18,7 +24,7 @@ int pkcs_1_test(void) | |||||||
|       return 1; |       return 1; | ||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    srand(time(NULL)); |    srand(LTC_TEST_RAND_SEED); | ||||||
|    /* do many tests */ |    /* do many tests */ | ||||||
|    for (x = 0; x < 100; x++) { |    for (x = 0; x < 100; x++) { | ||||||
|       zeromem(buf, sizeof(buf)); |       zeromem(buf, sizeof(buf)); | ||||||
|  | |||||||
| @ -104,8 +104,8 @@ int rsa_test(void) | |||||||
| { | { | ||||||
|    unsigned char in[1024], out[1024], tmp[1024]; |    unsigned char in[1024], out[1024], tmp[1024]; | ||||||
|    rsa_key       key, privKey, pubKey; |    rsa_key       key, privKey, pubKey; | ||||||
|    int           hash_idx, prng_idx, stat, stat2; |    int           hash_idx, prng_idx, stat, stat2, i; | ||||||
|    unsigned long rsa_msgsize, len, len2, cnt; |    unsigned long rsa_msgsize, len, len2, len3, cnt, cnt2; | ||||||
|    static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 }; |    static unsigned char lparam[] = { 0x01, 0x02, 0x03, 0x04 }; | ||||||
| 
 | 
 | ||||||
|    if (rsa_compat_test() != 0) { |    if (rsa_compat_test() != 0) { | ||||||
| @ -186,24 +186,9 @@ for (cnt = 0; cnt < len; ) { | |||||||
|          return 1; |          return 1; | ||||||
|       } |       } | ||||||
|       if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { |       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, "\nrsa_decrypt_key mismatch, len %lu (second decrypt)\n", len2); | ||||||
|          fprintf(stderr, "Original contents: \n"); |          print_hex("Original", in, rsa_msgsize); | ||||||
|          for (x = 0; x < rsa_msgsize; ) { |          print_hex("Output", tmp, len2); | ||||||
|              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"); |  | ||||||
|          return 1; |          return 1; | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
| @ -232,6 +217,8 @@ for (cnt = 0; cnt < len; ) { | |||||||
|       } |       } | ||||||
|       if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { |       if (len2 != rsa_msgsize || memcmp(tmp, in, rsa_msgsize)) { | ||||||
|          fprintf(stderr, "rsa_decrypt_key mismatch len %lu", len2); |          fprintf(stderr, "rsa_decrypt_key mismatch len %lu", len2); | ||||||
|  |          print_hex("Original", in, rsa_msgsize); | ||||||
|  |          print_hex("Output", tmp, len2); | ||||||
|          return 1; |          return 1; | ||||||
|       } |       } | ||||||
|    } |    } | ||||||
| @ -240,18 +227,26 @@ for (cnt = 0; cnt < len; ) { | |||||||
|    for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) { |    for (rsa_msgsize = 1; rsa_msgsize <= 117; rsa_msgsize++) { | ||||||
|       len  = sizeof(out); |       len  = sizeof(out); | ||||||
|       len2 = rsa_msgsize; |       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)); |       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; |       len2 = rsa_msgsize; | ||||||
|       DO(rsa_decrypt_key_ex(out, len, tmp, &len2, NULL, 0, 0, LTC_PKCS_1_V1_5, &stat, &key)); |       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); |          fprintf(stderr, "rsa_decrypt_key_ex failed, %d, %d", stat, stat2); | ||||||
|          return 1; |          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); |          fprintf(stderr, "rsa_decrypt_key_ex mismatch len %lu", len2); | ||||||
|          return 1; |          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 */ |    /* sign a message (unsalted, lower cholestorol and Atkins approved) now */ | ||||||
| @ -281,7 +276,7 @@ for (cnt = 0; cnt < len; ) { | |||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    /* verify with privKey */ |    /* verify with privKey */ | ||||||
|    /* change a byte */ |    /* change byte back to original */ | ||||||
|    in[0] ^= 1; |    in[0] ^= 1; | ||||||
|    DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &privKey)); |    DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &privKey)); | ||||||
|    /* change a byte */ |    /* change a byte */ | ||||||
| @ -297,7 +292,7 @@ for (cnt = 0; cnt < len; ) { | |||||||
|    } |    } | ||||||
| 
 | 
 | ||||||
|    /* verify with pubKey */ |    /* verify with pubKey */ | ||||||
|    /* change a byte */ |    /* change byte back to original */ | ||||||
|    in[0] ^= 1; |    in[0] ^= 1; | ||||||
|    DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &pubKey)); |    DO(rsa_verify_hash(out, len, in, 20, hash_idx, 0, &stat, &pubKey)); | ||||||
|    /* change a byte */ |    /* change a byte */ | ||||||
| @ -344,6 +339,85 @@ for (cnt = 0; cnt < len; ) { | |||||||
|       return 1; |       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 */ |    /* free the key and return */ | ||||||
|    rsa_free(&key); |    rsa_free(&key); | ||||||
|    rsa_free(&pubKey); |    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); | void run_cmd(int res, int line, char *file, char *cmd, const char *algorithm); | ||||||
| 
 | 
 | ||||||
| #ifdef LTC_VERBOSE | #ifdef LTC_VERBOSE | ||||||
| #define DO(x) do { fprintf(stderr, "%s:\n", #x); run_cmd((x), __LINE__, __FILE__, #x, NULL); } 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); | #define DOX(x, str) do { fprintf(stderr, "%s - %s:\n", #x, (str)); run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0) | ||||||
| #else | #else | ||||||
| #define DO(x) do { run_cmd((x), __LINE__, __FILE__, #x, NULL); } 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); | #define DOX(x, str) do { run_cmd((x), __LINE__, __FILE__, #x, (str)); } while (0) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| /* TESTS */ | /* TESTS */ | ||||||
| @ -51,6 +51,10 @@ int cipher_hash_test(void); | |||||||
| int modes_test(void); | int modes_test(void); | ||||||
| int mac_test(void); | int mac_test(void); | ||||||
| int pkcs_1_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 store_test(void); | ||||||
| int rsa_test(void); | int rsa_test(void); | ||||||
| int dh_test(void); | int dh_test(void); | ||||||
| @ -72,6 +76,11 @@ extern struct list { | |||||||
| 
 | 
 | ||||||
| extern int no_results; | 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); | int sorter(const void *a, const void *b); | ||||||
| void tally_results(int type); | void tally_results(int type); | ||||||
| ulong64 rdtsc (void); | ulong64 rdtsc (void); | ||||||
|  | |||||||
| @ -2,6 +2,19 @@ | |||||||
| 
 | 
 | ||||||
| prng_state yarrow_prng; | 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]; | struct list results[100]; | ||||||
| int no_results; | int no_results; | ||||||
| int sorter(const void *a, const void *b) | int sorter(const void *a, const void *b) | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user