test_suite_rsa.function 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/rsa.h"
  3. #include "mbedtls/md2.h"
  4. #include "mbedtls/md4.h"
  5. #include "mbedtls/md5.h"
  6. #include "mbedtls/sha1.h"
  7. #include "mbedtls/sha256.h"
  8. #include "mbedtls/sha512.h"
  9. #include "mbedtls/entropy.h"
  10. #include "mbedtls/ctr_drbg.h"
  11. /* END_HEADER */
  12. /* BEGIN_DEPENDENCIES
  13. * depends_on:MBEDTLS_RSA_C:MBEDTLS_BIGNUM_C:MBEDTLS_GENPRIME
  14. * END_DEPENDENCIES
  15. */
  16. /* BEGIN_CASE */
  17. void mbedtls_rsa_pkcs1_sign( char *message_hex_string, int padding_mode, int digest,
  18. int mod, int radix_P, char *input_P, int radix_Q,
  19. char *input_Q, int radix_N, char *input_N, int radix_E,
  20. char *input_E, char *result_hex_str, int result )
  21. {
  22. unsigned char message_str[1000];
  23. unsigned char hash_result[1000];
  24. unsigned char output[1000];
  25. unsigned char output_str[1000];
  26. mbedtls_rsa_context ctx;
  27. mbedtls_mpi P1, Q1, H, G;
  28. int msg_len;
  29. rnd_pseudo_info rnd_info;
  30. mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );
  31. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  32. memset( message_str, 0x00, 1000 );
  33. memset( hash_result, 0x00, 1000 );
  34. memset( output, 0x00, 1000 );
  35. memset( output_str, 0x00, 1000 );
  36. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  37. ctx.len = mod / 8;
  38. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.P, radix_P, input_P ) == 0 );
  39. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.Q, radix_Q, input_Q ) == 0 );
  40. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  41. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  42. TEST_ASSERT( mbedtls_mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
  43. TEST_ASSERT( mbedtls_mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
  44. TEST_ASSERT( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
  45. TEST_ASSERT( mbedtls_mpi_gcd( &G, &ctx.E, &H ) == 0 );
  46. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
  47. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
  48. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
  49. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
  50. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
  51. msg_len = unhexify( message_str, message_hex_string );
  52. if( mbedtls_md_info_from_type( digest ) != NULL )
  53. TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ), message_str, msg_len, hash_result ) == 0 );
  54. TEST_ASSERT( mbedtls_rsa_pkcs1_sign( &ctx, &rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PRIVATE, digest, 0, hash_result, output ) == result );
  55. if( result == 0 )
  56. {
  57. hexify( output_str, output, ctx.len );
  58. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  59. }
  60. exit:
  61. mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );
  62. mbedtls_rsa_free( &ctx );
  63. }
  64. /* END_CASE */
  65. /* BEGIN_CASE */
  66. void mbedtls_rsa_pkcs1_verify( char *message_hex_string, int padding_mode, int digest,
  67. int mod, int radix_N, char *input_N, int radix_E,
  68. char *input_E, char *result_hex_str, int result )
  69. {
  70. unsigned char message_str[1000];
  71. unsigned char hash_result[1000];
  72. unsigned char result_str[1000];
  73. mbedtls_rsa_context ctx;
  74. int msg_len;
  75. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  76. memset( message_str, 0x00, 1000 );
  77. memset( hash_result, 0x00, 1000 );
  78. memset( result_str, 0x00, 1000 );
  79. ctx.len = mod / 8;
  80. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  81. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  82. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
  83. msg_len = unhexify( message_str, message_hex_string );
  84. unhexify( result_str, result_hex_str );
  85. if( mbedtls_md_info_from_type( digest ) != NULL )
  86. TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ), message_str, msg_len, hash_result ) == 0 );
  87. TEST_ASSERT( mbedtls_rsa_pkcs1_verify( &ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC, digest, 0, hash_result, result_str ) == result );
  88. exit:
  89. mbedtls_rsa_free( &ctx );
  90. }
  91. /* END_CASE */
  92. /* BEGIN_CASE */
  93. void rsa_pkcs1_sign_raw( char *message_hex_string, char *hash_result_string,
  94. int padding_mode, int mod, int radix_P, char *input_P,
  95. int radix_Q, char *input_Q, int radix_N,
  96. char *input_N, int radix_E, char *input_E,
  97. char *result_hex_str )
  98. {
  99. unsigned char message_str[1000];
  100. unsigned char hash_result[1000];
  101. unsigned char output[1000];
  102. unsigned char output_str[1000];
  103. mbedtls_rsa_context ctx;
  104. mbedtls_mpi P1, Q1, H, G;
  105. int hash_len;
  106. rnd_pseudo_info rnd_info;
  107. mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );
  108. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  109. memset( message_str, 0x00, 1000 );
  110. memset( hash_result, 0x00, 1000 );
  111. memset( output, 0x00, 1000 );
  112. memset( output_str, 0x00, 1000 );
  113. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  114. ctx.len = mod / 8;
  115. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.P, radix_P, input_P ) == 0 );
  116. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.Q, radix_Q, input_Q ) == 0 );
  117. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  118. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  119. TEST_ASSERT( mbedtls_mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
  120. TEST_ASSERT( mbedtls_mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
  121. TEST_ASSERT( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
  122. TEST_ASSERT( mbedtls_mpi_gcd( &G, &ctx.E, &H ) == 0 );
  123. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
  124. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
  125. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
  126. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
  127. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
  128. unhexify( message_str, message_hex_string );
  129. hash_len = unhexify( hash_result, hash_result_string );
  130. TEST_ASSERT( mbedtls_rsa_pkcs1_sign( &ctx, &rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_NONE, hash_len, hash_result, output ) == 0 );
  131. hexify( output_str, output, ctx.len );
  132. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  133. /* For PKCS#1 v1.5, there is an alternative way to generate signatures */
  134. if( padding_mode == MBEDTLS_RSA_PKCS_V15 )
  135. {
  136. memset( output, 0x00, 1000 );
  137. memset( output_str, 0x00, 1000 );
  138. TEST_ASSERT( mbedtls_rsa_rsaes_pkcs1_v15_encrypt( &ctx,
  139. &rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PRIVATE,
  140. hash_len, hash_result, output ) == 0 );
  141. hexify( output_str, output, ctx.len );
  142. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  143. }
  144. exit:
  145. mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );
  146. mbedtls_rsa_free( &ctx );
  147. }
  148. /* END_CASE */
  149. /* BEGIN_CASE */
  150. void rsa_pkcs1_verify_raw( char *message_hex_string, char *hash_result_string,
  151. int padding_mode, int mod, int radix_N,
  152. char *input_N, int radix_E, char *input_E,
  153. char *result_hex_str, int correct )
  154. {
  155. unsigned char message_str[1000];
  156. unsigned char hash_result[1000];
  157. unsigned char result_str[1000];
  158. unsigned char output[1000];
  159. mbedtls_rsa_context ctx;
  160. size_t hash_len, olen;
  161. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  162. memset( message_str, 0x00, 1000 );
  163. memset( hash_result, 0x00, 1000 );
  164. memset( result_str, 0x00, 1000 );
  165. memset( output, 0x00, sizeof( output ) );
  166. ctx.len = mod / 8;
  167. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  168. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  169. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
  170. unhexify( message_str, message_hex_string );
  171. hash_len = unhexify( hash_result, hash_result_string );
  172. unhexify( result_str, result_hex_str );
  173. TEST_ASSERT( mbedtls_rsa_pkcs1_verify( &ctx, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_NONE, hash_len, hash_result, result_str ) == correct );
  174. /* For PKCS#1 v1.5, there is an alternative way to verify signatures */
  175. if( padding_mode == MBEDTLS_RSA_PKCS_V15 )
  176. {
  177. int ok;
  178. TEST_ASSERT( mbedtls_rsa_rsaes_pkcs1_v15_decrypt( &ctx,
  179. NULL, NULL, MBEDTLS_RSA_PUBLIC,
  180. &olen, result_str, output, sizeof( output ) ) == 0 );
  181. ok = olen == hash_len && memcmp( output, hash_result, olen ) == 0;
  182. if( correct == 0 )
  183. TEST_ASSERT( ok == 1 );
  184. else
  185. TEST_ASSERT( ok == 0 );
  186. }
  187. exit:
  188. mbedtls_rsa_free( &ctx );
  189. }
  190. /* END_CASE */
  191. /* BEGIN_CASE */
  192. void mbedtls_rsa_pkcs1_encrypt( char *message_hex_string, int padding_mode, int mod,
  193. int radix_N, char *input_N, int radix_E, char *input_E,
  194. char *result_hex_str, int result )
  195. {
  196. unsigned char message_str[1000];
  197. unsigned char output[1000];
  198. unsigned char output_str[1000];
  199. mbedtls_rsa_context ctx;
  200. size_t msg_len;
  201. rnd_pseudo_info rnd_info;
  202. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  203. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  204. memset( message_str, 0x00, 1000 );
  205. memset( output, 0x00, 1000 );
  206. memset( output_str, 0x00, 1000 );
  207. ctx.len = mod / 8;
  208. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  209. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  210. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
  211. msg_len = unhexify( message_str, message_hex_string );
  212. TEST_ASSERT( mbedtls_rsa_pkcs1_encrypt( &ctx, &rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PUBLIC, msg_len, message_str, output ) == result );
  213. if( result == 0 )
  214. {
  215. hexify( output_str, output, ctx.len );
  216. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  217. }
  218. exit:
  219. mbedtls_rsa_free( &ctx );
  220. }
  221. /* END_CASE */
  222. /* BEGIN_CASE */
  223. void rsa_pkcs1_encrypt_bad_rng( char *message_hex_string, int padding_mode,
  224. int mod, int radix_N, char *input_N,
  225. int radix_E, char *input_E,
  226. char *result_hex_str, int result )
  227. {
  228. unsigned char message_str[1000];
  229. unsigned char output[1000];
  230. unsigned char output_str[1000];
  231. mbedtls_rsa_context ctx;
  232. size_t msg_len;
  233. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  234. memset( message_str, 0x00, 1000 );
  235. memset( output, 0x00, 1000 );
  236. memset( output_str, 0x00, 1000 );
  237. ctx.len = mod / 8;
  238. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  239. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  240. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
  241. msg_len = unhexify( message_str, message_hex_string );
  242. TEST_ASSERT( mbedtls_rsa_pkcs1_encrypt( &ctx, &rnd_zero_rand, NULL, MBEDTLS_RSA_PUBLIC, msg_len, message_str, output ) == result );
  243. if( result == 0 )
  244. {
  245. hexify( output_str, output, ctx.len );
  246. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  247. }
  248. exit:
  249. mbedtls_rsa_free( &ctx );
  250. }
  251. /* END_CASE */
  252. /* BEGIN_CASE */
  253. void mbedtls_rsa_pkcs1_decrypt( char *message_hex_string, int padding_mode, int mod,
  254. int radix_P, char *input_P, int radix_Q, char *input_Q,
  255. int radix_N, char *input_N, int radix_E, char *input_E,
  256. int max_output, char *result_hex_str, int result )
  257. {
  258. unsigned char message_str[1000];
  259. unsigned char output[1000];
  260. unsigned char output_str[1000];
  261. mbedtls_rsa_context ctx;
  262. mbedtls_mpi P1, Q1, H, G;
  263. size_t output_len;
  264. rnd_pseudo_info rnd_info;
  265. mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );
  266. mbedtls_rsa_init( &ctx, padding_mode, 0 );
  267. memset( message_str, 0x00, 1000 );
  268. memset( output, 0x00, 1000 );
  269. memset( output_str, 0x00, 1000 );
  270. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  271. ctx.len = mod / 8;
  272. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.P, radix_P, input_P ) == 0 );
  273. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.Q, radix_Q, input_Q ) == 0 );
  274. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  275. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  276. TEST_ASSERT( mbedtls_mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
  277. TEST_ASSERT( mbedtls_mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
  278. TEST_ASSERT( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
  279. TEST_ASSERT( mbedtls_mpi_gcd( &G, &ctx.E, &H ) == 0 );
  280. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
  281. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
  282. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
  283. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
  284. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
  285. unhexify( message_str, message_hex_string );
  286. output_len = 0;
  287. TEST_ASSERT( mbedtls_rsa_pkcs1_decrypt( &ctx, rnd_pseudo_rand, &rnd_info, MBEDTLS_RSA_PRIVATE, &output_len, message_str, output, max_output ) == result );
  288. if( result == 0 )
  289. {
  290. hexify( output_str, output, ctx.len );
  291. TEST_ASSERT( strncasecmp( (char *) output_str, result_hex_str, strlen( result_hex_str ) ) == 0 );
  292. }
  293. exit:
  294. mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );
  295. mbedtls_rsa_free( &ctx );
  296. }
  297. /* END_CASE */
  298. /* BEGIN_CASE */
  299. void mbedtls_rsa_public( char *message_hex_string, int mod, int radix_N, char *input_N,
  300. int radix_E, char *input_E, char *result_hex_str, int result )
  301. {
  302. unsigned char message_str[1000];
  303. unsigned char output[1000];
  304. unsigned char output_str[1000];
  305. mbedtls_rsa_context ctx, ctx2; /* Also test mbedtls_rsa_copy() while at it */
  306. mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, 0 );
  307. mbedtls_rsa_init( &ctx2, MBEDTLS_RSA_PKCS_V15, 0 );
  308. memset( message_str, 0x00, 1000 );
  309. memset( output, 0x00, 1000 );
  310. memset( output_str, 0x00, 1000 );
  311. ctx.len = mod / 8;
  312. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  313. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  314. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == 0 );
  315. unhexify( message_str, message_hex_string );
  316. TEST_ASSERT( mbedtls_rsa_public( &ctx, message_str, output ) == result );
  317. if( result == 0 )
  318. {
  319. hexify( output_str, output, ctx.len );
  320. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  321. }
  322. /* And now with the copy */
  323. TEST_ASSERT( mbedtls_rsa_copy( &ctx2, &ctx ) == 0 );
  324. /* clear the original to be sure */
  325. mbedtls_rsa_free( &ctx );
  326. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx2 ) == 0 );
  327. memset( output, 0x00, 1000 );
  328. memset( output_str, 0x00, 1000 );
  329. TEST_ASSERT( mbedtls_rsa_public( &ctx2, message_str, output ) == result );
  330. if( result == 0 )
  331. {
  332. hexify( output_str, output, ctx2.len );
  333. TEST_ASSERT( strcasecmp( (char *) output_str, result_hex_str ) == 0 );
  334. }
  335. exit:
  336. mbedtls_rsa_free( &ctx );
  337. mbedtls_rsa_free( &ctx2 );
  338. }
  339. /* END_CASE */
  340. /* BEGIN_CASE */
  341. void mbedtls_rsa_private( char *message_hex_string, int mod, int radix_P, char *input_P,
  342. int radix_Q, char *input_Q, int radix_N, char *input_N,
  343. int radix_E, char *input_E, char *result_hex_str, int result )
  344. {
  345. unsigned char message_str[1000];
  346. unsigned char output[1000];
  347. unsigned char output_str[1000];
  348. mbedtls_rsa_context ctx, ctx2; /* Also test mbedtls_rsa_copy() while at it */
  349. mbedtls_mpi P1, Q1, H, G;
  350. rnd_pseudo_info rnd_info;
  351. int i;
  352. mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );
  353. mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, 0 );
  354. mbedtls_rsa_init( &ctx2, MBEDTLS_RSA_PKCS_V15, 0 );
  355. memset( message_str, 0x00, 1000 );
  356. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  357. ctx.len = mod / 8;
  358. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.P, radix_P, input_P ) == 0 );
  359. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.Q, radix_Q, input_Q ) == 0 );
  360. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  361. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  362. TEST_ASSERT( mbedtls_mpi_sub_int( &P1, &ctx.P, 1 ) == 0 );
  363. TEST_ASSERT( mbedtls_mpi_sub_int( &Q1, &ctx.Q, 1 ) == 0 );
  364. TEST_ASSERT( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) == 0 );
  365. TEST_ASSERT( mbedtls_mpi_gcd( &G, &ctx.E, &H ) == 0 );
  366. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.D , &ctx.E, &H ) == 0 );
  367. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DP, &ctx.D, &P1 ) == 0 );
  368. TEST_ASSERT( mbedtls_mpi_mod_mpi( &ctx.DQ, &ctx.D, &Q1 ) == 0 );
  369. TEST_ASSERT( mbedtls_mpi_inv_mod( &ctx.QP, &ctx.Q, &ctx.P ) == 0 );
  370. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
  371. unhexify( message_str, message_hex_string );
  372. /* repeat three times to test updating of blinding values */
  373. for( i = 0; i < 3; i++ )
  374. {
  375. memset( output, 0x00, 1000 );
  376. memset( output_str, 0x00, 1000 );
  377. TEST_ASSERT( mbedtls_rsa_private( &ctx, rnd_pseudo_rand, &rnd_info,
  378. message_str, output ) == result );
  379. if( result == 0 )
  380. {
  381. hexify( output_str, output, ctx.len );
  382. TEST_ASSERT( strcasecmp( (char *) output_str,
  383. result_hex_str ) == 0 );
  384. }
  385. }
  386. /* And now one more time with the copy */
  387. TEST_ASSERT( mbedtls_rsa_copy( &ctx2, &ctx ) == 0 );
  388. /* clear the original to be sure */
  389. mbedtls_rsa_free( &ctx );
  390. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx2 ) == 0 );
  391. memset( output, 0x00, 1000 );
  392. memset( output_str, 0x00, 1000 );
  393. TEST_ASSERT( mbedtls_rsa_private( &ctx2, rnd_pseudo_rand, &rnd_info,
  394. message_str, output ) == result );
  395. if( result == 0 )
  396. {
  397. hexify( output_str, output, ctx2.len );
  398. TEST_ASSERT( strcasecmp( (char *) output_str,
  399. result_hex_str ) == 0 );
  400. }
  401. exit:
  402. mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );
  403. mbedtls_rsa_free( &ctx ); mbedtls_rsa_free( &ctx2 );
  404. }
  405. /* END_CASE */
  406. /* BEGIN_CASE */
  407. void rsa_check_privkey_null()
  408. {
  409. mbedtls_rsa_context ctx;
  410. memset( &ctx, 0x00, sizeof( mbedtls_rsa_context ) );
  411. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  412. }
  413. /* END_CASE */
  414. /* BEGIN_CASE */
  415. void mbedtls_rsa_check_pubkey( int radix_N, char *input_N, int radix_E, char *input_E,
  416. int result )
  417. {
  418. mbedtls_rsa_context ctx;
  419. mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, 0 );
  420. if( strlen( input_N ) )
  421. {
  422. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  423. }
  424. if( strlen( input_E ) )
  425. {
  426. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  427. }
  428. TEST_ASSERT( mbedtls_rsa_check_pubkey( &ctx ) == result );
  429. exit:
  430. mbedtls_rsa_free( &ctx );
  431. }
  432. /* END_CASE */
  433. /* BEGIN_CASE */
  434. void mbedtls_rsa_check_privkey( int mod, int radix_P, char *input_P, int radix_Q,
  435. char *input_Q, int radix_N, char *input_N,
  436. int radix_E, char *input_E, int radix_D, char *input_D,
  437. int radix_DP, char *input_DP, int radix_DQ,
  438. char *input_DQ, int radix_QP, char *input_QP,
  439. int result )
  440. {
  441. mbedtls_rsa_context ctx;
  442. mbedtls_rsa_init( &ctx, MBEDTLS_RSA_PKCS_V15, 0 );
  443. ctx.len = mod / 8;
  444. if( strlen( input_P ) )
  445. {
  446. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.P, radix_P, input_P ) == 0 );
  447. }
  448. if( strlen( input_Q ) )
  449. {
  450. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.Q, radix_Q, input_Q ) == 0 );
  451. }
  452. if( strlen( input_N ) )
  453. {
  454. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.N, radix_N, input_N ) == 0 );
  455. }
  456. if( strlen( input_E ) )
  457. {
  458. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.E, radix_E, input_E ) == 0 );
  459. }
  460. if( strlen( input_D ) )
  461. {
  462. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.D, radix_D, input_D ) == 0 );
  463. }
  464. if( strlen( input_DP ) )
  465. {
  466. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.DP, radix_DP, input_DP ) == 0 );
  467. }
  468. if( strlen( input_DQ ) )
  469. {
  470. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.DQ, radix_DQ, input_DQ ) == 0 );
  471. }
  472. if( strlen( input_QP ) )
  473. {
  474. TEST_ASSERT( mbedtls_mpi_read_string( &ctx.QP, radix_QP, input_QP ) == 0 );
  475. }
  476. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == result );
  477. exit:
  478. mbedtls_rsa_free( &ctx );
  479. }
  480. /* END_CASE */
  481. /* BEGIN_CASE */
  482. void rsa_check_pubpriv( int mod, int radix_Npub, char *input_Npub,
  483. int radix_Epub, char *input_Epub,
  484. int radix_P, char *input_P, int radix_Q,
  485. char *input_Q, int radix_N, char *input_N,
  486. int radix_E, char *input_E, int radix_D, char *input_D,
  487. int radix_DP, char *input_DP, int radix_DQ,
  488. char *input_DQ, int radix_QP, char *input_QP,
  489. int result )
  490. {
  491. mbedtls_rsa_context pub, prv;
  492. mbedtls_rsa_init( &pub, MBEDTLS_RSA_PKCS_V15, 0 );
  493. mbedtls_rsa_init( &prv, MBEDTLS_RSA_PKCS_V15, 0 );
  494. pub.len = mod / 8;
  495. prv.len = mod / 8;
  496. if( strlen( input_Npub ) )
  497. {
  498. TEST_ASSERT( mbedtls_mpi_read_string( &pub.N, radix_Npub, input_Npub ) == 0 );
  499. }
  500. if( strlen( input_Epub ) )
  501. {
  502. TEST_ASSERT( mbedtls_mpi_read_string( &pub.E, radix_Epub, input_Epub ) == 0 );
  503. }
  504. if( strlen( input_P ) )
  505. {
  506. TEST_ASSERT( mbedtls_mpi_read_string( &prv.P, radix_P, input_P ) == 0 );
  507. }
  508. if( strlen( input_Q ) )
  509. {
  510. TEST_ASSERT( mbedtls_mpi_read_string( &prv.Q, radix_Q, input_Q ) == 0 );
  511. }
  512. if( strlen( input_N ) )
  513. {
  514. TEST_ASSERT( mbedtls_mpi_read_string( &prv.N, radix_N, input_N ) == 0 );
  515. }
  516. if( strlen( input_E ) )
  517. {
  518. TEST_ASSERT( mbedtls_mpi_read_string( &prv.E, radix_E, input_E ) == 0 );
  519. }
  520. if( strlen( input_D ) )
  521. {
  522. TEST_ASSERT( mbedtls_mpi_read_string( &prv.D, radix_D, input_D ) == 0 );
  523. }
  524. if( strlen( input_DP ) )
  525. {
  526. TEST_ASSERT( mbedtls_mpi_read_string( &prv.DP, radix_DP, input_DP ) == 0 );
  527. }
  528. if( strlen( input_DQ ) )
  529. {
  530. TEST_ASSERT( mbedtls_mpi_read_string( &prv.DQ, radix_DQ, input_DQ ) == 0 );
  531. }
  532. if( strlen( input_QP ) )
  533. {
  534. TEST_ASSERT( mbedtls_mpi_read_string( &prv.QP, radix_QP, input_QP ) == 0 );
  535. }
  536. TEST_ASSERT( mbedtls_rsa_check_pub_priv( &pub, &prv ) == result );
  537. exit:
  538. mbedtls_rsa_free( &pub );
  539. mbedtls_rsa_free( &prv );
  540. }
  541. /* END_CASE */
  542. /* BEGIN_CASE depends_on:MBEDTLS_CTR_DRBG_C:MBEDTLS_ENTROPY_C */
  543. void mbedtls_rsa_gen_key( int nrbits, int exponent, int result)
  544. {
  545. mbedtls_rsa_context ctx;
  546. mbedtls_entropy_context entropy;
  547. mbedtls_ctr_drbg_context ctr_drbg;
  548. const char *pers = "test_suite_rsa";
  549. mbedtls_ctr_drbg_init( &ctr_drbg );
  550. mbedtls_entropy_init( &entropy );
  551. TEST_ASSERT( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,
  552. (const unsigned char *) pers, strlen( pers ) ) == 0 );
  553. mbedtls_rsa_init( &ctx, 0, 0 );
  554. TEST_ASSERT( mbedtls_rsa_gen_key( &ctx, mbedtls_ctr_drbg_random, &ctr_drbg, nrbits, exponent ) == result );
  555. if( result == 0 )
  556. {
  557. TEST_ASSERT( mbedtls_rsa_check_privkey( &ctx ) == 0 );
  558. TEST_ASSERT( mbedtls_mpi_cmp_mpi( &ctx.P, &ctx.Q ) > 0 );
  559. }
  560. exit:
  561. mbedtls_rsa_free( &ctx );
  562. mbedtls_ctr_drbg_free( &ctr_drbg );
  563. mbedtls_entropy_free( &entropy );
  564. }
  565. /* END_CASE */
  566. /* BEGIN_CASE depends_on:MBEDTLS_SELF_TEST */
  567. void rsa_selftest()
  568. {
  569. TEST_ASSERT( mbedtls_rsa_self_test( 1 ) == 0 );
  570. }
  571. /* END_CASE */