test_suite_pk.function 43 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085
  1. /* BEGIN_HEADER */
  2. #include "mbedtls/pk.h"
  3. /* For error codes */
  4. #include "mbedtls/asn1.h"
  5. #include "mbedtls/base64.h"
  6. #include "mbedtls/ecp.h"
  7. #include "mbedtls/rsa.h"
  8. #include <limits.h>
  9. #include <stdint.h>
  10. static int rnd_std_rand( void *rng_state, unsigned char *output, size_t len );
  11. #define RSA_KEY_SIZE 512
  12. #define RSA_KEY_LEN 64
  13. static int pk_genkey( mbedtls_pk_context *pk )
  14. {
  15. ((void) pk);
  16. #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)
  17. if( mbedtls_pk_get_type( pk ) == MBEDTLS_PK_RSA )
  18. return mbedtls_rsa_gen_key( mbedtls_pk_rsa( *pk ), rnd_std_rand, NULL, RSA_KEY_SIZE, 3 );
  19. #endif
  20. #if defined(MBEDTLS_ECP_C)
  21. if( mbedtls_pk_get_type( pk ) == MBEDTLS_PK_ECKEY ||
  22. mbedtls_pk_get_type( pk ) == MBEDTLS_PK_ECKEY_DH ||
  23. mbedtls_pk_get_type( pk ) == MBEDTLS_PK_ECDSA )
  24. {
  25. int ret;
  26. if( ( ret = mbedtls_ecp_group_load( &mbedtls_pk_ec( *pk )->grp,
  27. MBEDTLS_ECP_DP_SECP192R1 ) ) != 0 )
  28. return( ret );
  29. return mbedtls_ecp_gen_keypair( &mbedtls_pk_ec( *pk )->grp, &mbedtls_pk_ec( *pk )->d,
  30. &mbedtls_pk_ec( *pk )->Q, rnd_std_rand, NULL );
  31. }
  32. #endif
  33. return( -1 );
  34. }
  35. #if defined(MBEDTLS_RSA_C)
  36. int mbedtls_rsa_decrypt_func( void *ctx, int mode, size_t *olen,
  37. const unsigned char *input, unsigned char *output,
  38. size_t output_max_len )
  39. {
  40. return( mbedtls_rsa_pkcs1_decrypt( (mbedtls_rsa_context *) ctx,
  41. rnd_std_rand, NULL, mode, olen,
  42. input, output, output_max_len ) );
  43. }
  44. int mbedtls_rsa_sign_func( void *ctx,
  45. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  46. int mode, mbedtls_md_type_t md_alg, unsigned int hashlen,
  47. const unsigned char *hash, unsigned char *sig )
  48. {
  49. ((void) f_rng);
  50. ((void) p_rng);
  51. return( mbedtls_rsa_pkcs1_sign( (mbedtls_rsa_context *) ctx, rnd_std_rand, NULL, mode,
  52. md_alg, hashlen, hash, sig ) );
  53. }
  54. size_t mbedtls_rsa_key_len_func( void *ctx )
  55. {
  56. return( ((const mbedtls_rsa_context *) ctx)->len );
  57. }
  58. #endif /* MBEDTLS_RSA_C */
  59. /* END_HEADER */
  60. /* BEGIN_DEPENDENCIES
  61. * depends_on:MBEDTLS_PK_C
  62. * END_DEPENDENCIES
  63. */
  64. /* BEGIN_CASE */
  65. void valid_parameters( )
  66. {
  67. mbedtls_pk_context pk;
  68. unsigned char buf[1];
  69. size_t len;
  70. void *options = NULL;
  71. mbedtls_pk_init( &pk );
  72. TEST_VALID_PARAM( mbedtls_pk_free( NULL ) );
  73. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  74. TEST_VALID_PARAM( mbedtls_pk_restart_free( NULL ) );
  75. #endif
  76. TEST_ASSERT( mbedtls_pk_setup( &pk, NULL ) ==
  77. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  78. /* In informational functions, we accept NULL where a context pointer
  79. * is expected because that's what the library has done forever.
  80. * We do not document that NULL is accepted, so we may wish to change
  81. * the behavior in a future version. */
  82. TEST_ASSERT( mbedtls_pk_get_bitlen( NULL ) == 0 );
  83. TEST_ASSERT( mbedtls_pk_get_len( NULL ) == 0 );
  84. TEST_ASSERT( mbedtls_pk_can_do( NULL, MBEDTLS_PK_NONE ) == 0 );
  85. TEST_ASSERT( mbedtls_pk_sign_restartable( &pk,
  86. MBEDTLS_MD_NONE,
  87. NULL, 0,
  88. buf, &len,
  89. rnd_std_rand, NULL,
  90. NULL ) ==
  91. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  92. TEST_ASSERT( mbedtls_pk_sign_restartable( &pk,
  93. MBEDTLS_MD_NONE,
  94. NULL, 0,
  95. buf, &len,
  96. rnd_std_rand, NULL,
  97. NULL ) ==
  98. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  99. TEST_ASSERT( mbedtls_pk_sign( &pk,
  100. MBEDTLS_MD_NONE,
  101. NULL, 0,
  102. buf, &len,
  103. rnd_std_rand, NULL ) ==
  104. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  105. TEST_ASSERT( mbedtls_pk_verify_restartable( &pk,
  106. MBEDTLS_MD_NONE,
  107. NULL, 0,
  108. buf, sizeof( buf ),
  109. NULL ) ==
  110. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  111. TEST_ASSERT( mbedtls_pk_verify( &pk,
  112. MBEDTLS_MD_NONE,
  113. NULL, 0,
  114. buf, sizeof( buf ) ) ==
  115. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  116. TEST_ASSERT( mbedtls_pk_verify_ext( MBEDTLS_PK_NONE, options,
  117. &pk,
  118. MBEDTLS_MD_NONE,
  119. NULL, 0,
  120. buf, sizeof( buf ) ) ==
  121. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  122. TEST_ASSERT( mbedtls_pk_encrypt( &pk,
  123. NULL, 0,
  124. NULL, &len, 0,
  125. rnd_std_rand, NULL ) ==
  126. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  127. TEST_ASSERT( mbedtls_pk_decrypt( &pk,
  128. NULL, 0,
  129. NULL, &len, 0,
  130. rnd_std_rand, NULL ) ==
  131. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  132. #if defined(MBEDTLS_PK_PARSE_C)
  133. TEST_ASSERT( mbedtls_pk_parse_key( &pk, NULL, 0, NULL, 1 ) ==
  134. MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  135. TEST_ASSERT( mbedtls_pk_parse_public_key( &pk, NULL, 0 ) ==
  136. MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );
  137. #endif /* MBEDTLS_PK_PARSE_C */
  138. }
  139. /* END_CASE */
  140. /* BEGIN_CASE depends_on:MBEDTLS_PK_WRITE_C */
  141. void valid_parameters_pkwrite( data_t *key_data )
  142. {
  143. mbedtls_pk_context pk;
  144. /* For the write tests to be effective, we need a valid key pair. */
  145. mbedtls_pk_init( &pk );
  146. TEST_ASSERT( mbedtls_pk_parse_key( &pk,
  147. key_data->x, key_data->len,
  148. NULL, 0 ) == 0 );
  149. TEST_ASSERT( mbedtls_pk_write_key_der( &pk, NULL, 0 ) ==
  150. MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  151. TEST_ASSERT( mbedtls_pk_write_pubkey_der( &pk, NULL, 0 ) ==
  152. MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  153. #if defined(MBEDTLS_PEM_WRITE_C)
  154. TEST_ASSERT( mbedtls_pk_write_key_pem( &pk, NULL, 0 ) ==
  155. MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  156. TEST_ASSERT( mbedtls_pk_write_pubkey_pem( &pk, NULL, 0 ) ==
  157. MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );
  158. #endif /* MBEDTLS_PEM_WRITE_C */
  159. exit:
  160. mbedtls_pk_free( &pk );
  161. }
  162. /* END_CASE */
  163. /* BEGIN_CASE depends_on:MBEDTLS_CHECK_PARAMS:!MBEDTLS_PARAM_FAILED_ALT */
  164. void invalid_parameters( )
  165. {
  166. size_t len;
  167. unsigned char *null_buf = NULL;
  168. unsigned char buf[1];
  169. unsigned char *p = buf;
  170. char str[1] = {0};
  171. mbedtls_pk_context pk;
  172. mbedtls_md_type_t valid_md = MBEDTLS_MD_SHA256;
  173. void *options = buf;
  174. (void) null_buf;
  175. (void) p;
  176. (void) str;
  177. mbedtls_pk_init( &pk );
  178. TEST_INVALID_PARAM( mbedtls_pk_init( NULL ) );
  179. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  180. TEST_INVALID_PARAM( mbedtls_pk_restart_init( NULL ) );
  181. #endif
  182. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  183. mbedtls_pk_setup( NULL, NULL ) );
  184. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  185. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  186. mbedtls_pk_setup_rsa_alt( NULL, buf,
  187. NULL, NULL, NULL ) );
  188. #endif
  189. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  190. mbedtls_pk_verify_restartable( NULL,
  191. MBEDTLS_MD_NONE,
  192. buf, sizeof( buf ),
  193. buf, sizeof( buf ),
  194. NULL ) );
  195. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  196. mbedtls_pk_verify_restartable( &pk,
  197. MBEDTLS_MD_NONE,
  198. NULL, sizeof( buf ),
  199. buf, sizeof( buf ),
  200. NULL ) );
  201. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  202. mbedtls_pk_verify_restartable( &pk,
  203. valid_md,
  204. NULL, 0,
  205. buf, sizeof( buf ),
  206. NULL ) );
  207. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  208. mbedtls_pk_verify_restartable( &pk,
  209. MBEDTLS_MD_NONE,
  210. buf, sizeof( buf ),
  211. NULL, sizeof( buf ),
  212. NULL ) );
  213. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  214. mbedtls_pk_verify( NULL,
  215. MBEDTLS_MD_NONE,
  216. buf, sizeof( buf ),
  217. buf, sizeof( buf ) ) );
  218. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  219. mbedtls_pk_verify( &pk,
  220. MBEDTLS_MD_NONE,
  221. NULL, sizeof( buf ),
  222. buf, sizeof( buf ) ) );
  223. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  224. mbedtls_pk_verify( &pk,
  225. valid_md,
  226. NULL, 0,
  227. buf, sizeof( buf ) ) );
  228. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  229. mbedtls_pk_verify( &pk,
  230. MBEDTLS_MD_NONE,
  231. buf, sizeof( buf ),
  232. NULL, sizeof( buf ) ) );
  233. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  234. mbedtls_pk_verify_ext( MBEDTLS_PK_NONE, options,
  235. NULL,
  236. MBEDTLS_MD_NONE,
  237. buf, sizeof( buf ),
  238. buf, sizeof( buf ) ) );
  239. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  240. mbedtls_pk_verify_ext( MBEDTLS_PK_NONE, options,
  241. &pk,
  242. MBEDTLS_MD_NONE,
  243. NULL, sizeof( buf ),
  244. buf, sizeof( buf ) ) );
  245. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  246. mbedtls_pk_verify_ext( MBEDTLS_PK_NONE, options,
  247. &pk,
  248. valid_md,
  249. NULL, 0,
  250. buf, sizeof( buf ) ) );
  251. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  252. mbedtls_pk_verify_ext( MBEDTLS_PK_NONE, options,
  253. &pk,
  254. MBEDTLS_MD_NONE,
  255. buf, sizeof( buf ),
  256. NULL, sizeof( buf ) ) );
  257. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  258. mbedtls_pk_sign_restartable( NULL,
  259. MBEDTLS_MD_NONE,
  260. buf, sizeof( buf ),
  261. buf, &len,
  262. rnd_std_rand, NULL,
  263. NULL ) );
  264. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  265. mbedtls_pk_sign_restartable( &pk,
  266. MBEDTLS_MD_NONE,
  267. NULL, sizeof( buf ),
  268. buf, &len,
  269. rnd_std_rand, NULL,
  270. NULL ) );
  271. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  272. mbedtls_pk_sign_restartable( &pk,
  273. valid_md,
  274. NULL, 0,
  275. buf, &len,
  276. rnd_std_rand, NULL,
  277. NULL ) );
  278. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  279. mbedtls_pk_sign_restartable( &pk,
  280. MBEDTLS_MD_NONE,
  281. buf, sizeof( buf ),
  282. NULL, &len,
  283. rnd_std_rand, NULL,
  284. NULL ) );
  285. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  286. mbedtls_pk_sign( NULL,
  287. MBEDTLS_MD_NONE,
  288. buf, sizeof( buf ),
  289. buf, &len,
  290. rnd_std_rand, NULL ) );
  291. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  292. mbedtls_pk_sign( &pk,
  293. MBEDTLS_MD_NONE,
  294. NULL, sizeof( buf ),
  295. buf, &len,
  296. rnd_std_rand, NULL ) );
  297. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  298. mbedtls_pk_sign( &pk,
  299. valid_md,
  300. NULL, 0,
  301. buf, &len,
  302. rnd_std_rand, NULL ) );
  303. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  304. mbedtls_pk_sign( &pk,
  305. MBEDTLS_MD_NONE,
  306. buf, sizeof( buf ),
  307. NULL, &len,
  308. rnd_std_rand, NULL ) );
  309. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  310. mbedtls_pk_decrypt( NULL,
  311. buf, sizeof( buf ),
  312. buf, &len, sizeof( buf ),
  313. rnd_std_rand, NULL ) );
  314. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  315. mbedtls_pk_decrypt( &pk,
  316. NULL, sizeof( buf ),
  317. buf, &len, sizeof( buf ),
  318. rnd_std_rand, NULL ) );
  319. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  320. mbedtls_pk_decrypt( &pk,
  321. buf, sizeof( buf ),
  322. NULL, &len, sizeof( buf ),
  323. rnd_std_rand, NULL ) );
  324. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  325. mbedtls_pk_decrypt( &pk,
  326. buf, sizeof( buf ),
  327. buf, NULL, sizeof( buf ),
  328. rnd_std_rand, NULL ) );
  329. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  330. mbedtls_pk_encrypt( NULL,
  331. buf, sizeof( buf ),
  332. buf, &len, sizeof( buf ),
  333. rnd_std_rand, NULL ) );
  334. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  335. mbedtls_pk_encrypt( &pk,
  336. NULL, sizeof( buf ),
  337. buf, &len, sizeof( buf ),
  338. rnd_std_rand, NULL ) );
  339. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  340. mbedtls_pk_encrypt( &pk,
  341. buf, sizeof( buf ),
  342. NULL, &len, sizeof( buf ),
  343. rnd_std_rand, NULL ) );
  344. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  345. mbedtls_pk_encrypt( &pk,
  346. buf, sizeof( buf ),
  347. buf, NULL, sizeof( buf ),
  348. rnd_std_rand, NULL ) );
  349. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  350. mbedtls_pk_check_pair( NULL, &pk ) );
  351. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  352. mbedtls_pk_check_pair( &pk, NULL ) );
  353. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  354. mbedtls_pk_debug( NULL, NULL ) );
  355. #if defined(MBEDTLS_PK_PARSE_C)
  356. #if defined(MBEDTLS_FS_IO)
  357. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  358. mbedtls_pk_load_file( NULL, &p, &len ) );
  359. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  360. mbedtls_pk_load_file( str, NULL, &len ) );
  361. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  362. mbedtls_pk_load_file( str, &p, NULL ) );
  363. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  364. mbedtls_pk_parse_keyfile( NULL, str, NULL ) );
  365. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  366. mbedtls_pk_parse_keyfile( &pk, NULL, NULL ) );
  367. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  368. mbedtls_pk_parse_public_keyfile( NULL, str ) );
  369. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  370. mbedtls_pk_parse_public_keyfile( &pk, NULL ) );
  371. #endif
  372. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  373. mbedtls_pk_parse_subpubkey( NULL, buf, &pk ) );
  374. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  375. mbedtls_pk_parse_subpubkey( &null_buf, buf, &pk ) );
  376. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  377. mbedtls_pk_parse_subpubkey( &p, NULL, &pk ) );
  378. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  379. mbedtls_pk_parse_subpubkey( &p, buf, NULL ) );
  380. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  381. mbedtls_pk_parse_key( NULL,
  382. buf, sizeof( buf ),
  383. buf, sizeof( buf ) ) );
  384. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  385. mbedtls_pk_parse_key( &pk,
  386. NULL, sizeof( buf ),
  387. buf, sizeof( buf ) ) );
  388. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  389. mbedtls_pk_parse_public_key( NULL,
  390. buf, sizeof( buf ) ) );
  391. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  392. mbedtls_pk_parse_public_key( &pk,
  393. NULL, sizeof( buf ) ) );
  394. #endif /* MBEDTLS_PK_PARSE_C */
  395. #if defined(MBEDTLS_PK_WRITE_C)
  396. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  397. mbedtls_pk_write_pubkey( NULL, p, &pk ) );
  398. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  399. mbedtls_pk_write_pubkey( &null_buf, p, &pk ) );
  400. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  401. mbedtls_pk_write_pubkey( &p, NULL, &pk ) );
  402. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  403. mbedtls_pk_write_pubkey( &p, p, NULL ) );
  404. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  405. mbedtls_pk_write_pubkey_der( NULL,
  406. buf, sizeof( buf ) ) );
  407. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  408. mbedtls_pk_write_pubkey_der( &pk,
  409. NULL, sizeof( buf ) ) );
  410. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  411. mbedtls_pk_write_key_der( NULL,
  412. buf, sizeof( buf ) ) );
  413. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  414. mbedtls_pk_write_key_der( &pk,
  415. NULL, sizeof( buf ) ) );
  416. #if defined(MBEDTLS_PEM_WRITE_C)
  417. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  418. mbedtls_pk_write_pubkey_pem( NULL,
  419. buf, sizeof( buf ) ) );
  420. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  421. mbedtls_pk_write_pubkey_pem( &pk,
  422. NULL, sizeof( buf ) ) );
  423. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  424. mbedtls_pk_write_key_pem( NULL,
  425. buf, sizeof( buf ) ) );
  426. TEST_INVALID_PARAM_RET( MBEDTLS_ERR_PK_BAD_INPUT_DATA,
  427. mbedtls_pk_write_key_pem( &pk,
  428. NULL, sizeof( buf ) ) );
  429. #endif /* MBEDTLS_PEM_WRITE_C */
  430. #endif /* MBEDTLS_PK_WRITE_C */
  431. }
  432. /* END_CASE */
  433. /* BEGIN_CASE */
  434. void pk_utils( int type, int size, int len, char * name )
  435. {
  436. mbedtls_pk_context pk;
  437. mbedtls_pk_init( &pk );
  438. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
  439. TEST_ASSERT( pk_genkey( &pk ) == 0 );
  440. TEST_ASSERT( (int) mbedtls_pk_get_type( &pk ) == type );
  441. TEST_ASSERT( mbedtls_pk_can_do( &pk, type ) );
  442. TEST_ASSERT( mbedtls_pk_get_bitlen( &pk ) == (unsigned) size );
  443. TEST_ASSERT( mbedtls_pk_get_len( &pk ) == (unsigned) len );
  444. TEST_ASSERT( strcmp( mbedtls_pk_get_name( &pk), name ) == 0 );
  445. exit:
  446. mbedtls_pk_free( &pk );
  447. }
  448. /* END_CASE */
  449. /* BEGIN_CASE depends_on:MBEDTLS_PK_PARSE_C:MBEDTLS_FS_IO */
  450. void mbedtls_pk_check_pair( char * pub_file, char * prv_file, int ret )
  451. {
  452. mbedtls_pk_context pub, prv, alt;
  453. mbedtls_pk_init( &pub );
  454. mbedtls_pk_init( &prv );
  455. mbedtls_pk_init( &alt );
  456. TEST_ASSERT( mbedtls_pk_parse_public_keyfile( &pub, pub_file ) == 0 );
  457. TEST_ASSERT( mbedtls_pk_parse_keyfile( &prv, prv_file, NULL ) == 0 );
  458. TEST_ASSERT( mbedtls_pk_check_pair( &pub, &prv ) == ret );
  459. #if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  460. if( mbedtls_pk_get_type( &prv ) == MBEDTLS_PK_RSA )
  461. {
  462. TEST_ASSERT( mbedtls_pk_setup_rsa_alt( &alt, mbedtls_pk_rsa( prv ),
  463. mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func,
  464. mbedtls_rsa_key_len_func ) == 0 );
  465. TEST_ASSERT( mbedtls_pk_check_pair( &pub, &alt ) == ret );
  466. }
  467. #endif
  468. mbedtls_pk_free( &pub );
  469. mbedtls_pk_free( &prv );
  470. mbedtls_pk_free( &alt );
  471. }
  472. /* END_CASE */
  473. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
  474. void pk_rsa_verify_test_vec( data_t * message_str, int digest, int mod,
  475. int radix_N, char * input_N, int radix_E,
  476. char * input_E, data_t * result_str,
  477. int result )
  478. {
  479. unsigned char hash_result[MBEDTLS_MD_MAX_SIZE];
  480. mbedtls_rsa_context *rsa;
  481. mbedtls_pk_context pk;
  482. mbedtls_pk_restart_ctx *rs_ctx = NULL;
  483. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  484. mbedtls_pk_restart_ctx ctx;
  485. rs_ctx = &ctx;
  486. mbedtls_pk_restart_init( rs_ctx );
  487. // this setting would ensure restart would happen if ECC was used
  488. mbedtls_ecp_set_max_ops( 1 );
  489. #endif
  490. mbedtls_pk_init( &pk );
  491. memset( hash_result, 0x00, MBEDTLS_MD_MAX_SIZE );
  492. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  493. rsa = mbedtls_pk_rsa( pk );
  494. rsa->len = mod / 8;
  495. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
  496. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
  497. if( mbedtls_md_info_from_type( digest ) != NULL )
  498. TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ), message_str->x, message_str->len, hash_result ) == 0 );
  499. TEST_ASSERT( mbedtls_pk_verify( &pk, digest, hash_result, 0,
  500. result_str->x, mbedtls_pk_get_len( &pk ) ) == result );
  501. TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, digest, hash_result, 0,
  502. result_str->x, mbedtls_pk_get_len( &pk ), rs_ctx ) == result );
  503. exit:
  504. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  505. mbedtls_pk_restart_free( rs_ctx );
  506. #endif
  507. mbedtls_pk_free( &pk );
  508. }
  509. /* END_CASE */
  510. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
  511. void pk_rsa_verify_ext_test_vec( data_t * message_str, int digest,
  512. int mod, int radix_N, char * input_N,
  513. int radix_E, char * input_E,
  514. data_t * result_str, int pk_type,
  515. int mgf1_hash_id, int salt_len, int result )
  516. {
  517. unsigned char hash_result[MBEDTLS_MD_MAX_SIZE];
  518. mbedtls_rsa_context *rsa;
  519. mbedtls_pk_context pk;
  520. mbedtls_pk_rsassa_pss_options pss_opts;
  521. void *options;
  522. size_t hash_len;
  523. mbedtls_pk_init( &pk );
  524. memset( hash_result, 0x00, sizeof( hash_result ) );
  525. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  526. rsa = mbedtls_pk_rsa( pk );
  527. rsa->len = mod / 8;
  528. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
  529. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
  530. if( digest != MBEDTLS_MD_NONE )
  531. {
  532. TEST_ASSERT( mbedtls_md( mbedtls_md_info_from_type( digest ),
  533. message_str->x, message_str->len, hash_result ) == 0 );
  534. hash_len = 0;
  535. }
  536. else
  537. {
  538. memcpy( hash_result, message_str->x, message_str->len );
  539. hash_len = message_str->len;
  540. }
  541. if( mgf1_hash_id < 0 )
  542. {
  543. options = NULL;
  544. }
  545. else
  546. {
  547. options = &pss_opts;
  548. pss_opts.mgf1_hash_id = mgf1_hash_id;
  549. pss_opts.expected_salt_len = salt_len;
  550. }
  551. TEST_ASSERT( mbedtls_pk_verify_ext( pk_type, options, &pk,
  552. digest, hash_result, hash_len,
  553. result_str->x, mbedtls_pk_get_len( &pk ) ) == result );
  554. exit:
  555. mbedtls_pk_free( &pk );
  556. }
  557. /* END_CASE */
  558. /* BEGIN_CASE depends_on:MBEDTLS_ECDSA_C */
  559. void pk_ec_test_vec( int type, int id, data_t * key, data_t * hash,
  560. data_t * sig, int ret )
  561. {
  562. mbedtls_pk_context pk;
  563. mbedtls_ecp_keypair *eckey;
  564. mbedtls_pk_init( &pk );
  565. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
  566. TEST_ASSERT( mbedtls_pk_can_do( &pk, MBEDTLS_PK_ECDSA ) );
  567. eckey = mbedtls_pk_ec( pk );
  568. TEST_ASSERT( mbedtls_ecp_group_load( &eckey->grp, id ) == 0 );
  569. TEST_ASSERT( mbedtls_ecp_point_read_binary( &eckey->grp, &eckey->Q,
  570. key->x, key->len ) == 0 );
  571. TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_NONE,
  572. hash->x, hash->len, sig->x, sig->len ) == ret );
  573. exit:
  574. mbedtls_pk_free( &pk );
  575. }
  576. /* END_CASE */
  577. /* BEGIN_CASE depends_on:MBEDTLS_ECP_RESTARTABLE:MBEDTLS_ECDSA_C:MBEDTLS_ECDSA_DETERMINISTIC */
  578. void pk_sign_verify_restart( int pk_type, int grp_id, char *d_str,
  579. char *QX_str, char *QY_str,
  580. int md_alg, char *msg, data_t *sig_check,
  581. int max_ops, int min_restart, int max_restart )
  582. {
  583. int ret, cnt_restart;
  584. mbedtls_pk_restart_ctx rs_ctx;
  585. mbedtls_pk_context prv, pub;
  586. unsigned char hash[MBEDTLS_MD_MAX_SIZE];
  587. unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];
  588. size_t hlen, slen;
  589. const mbedtls_md_info_t *md_info;
  590. mbedtls_pk_restart_init( &rs_ctx );
  591. mbedtls_pk_init( &prv );
  592. mbedtls_pk_init( &pub );
  593. memset( hash, 0, sizeof( hash ) );
  594. memset( sig, 0, sizeof( sig ) );
  595. TEST_ASSERT( mbedtls_pk_setup( &prv, mbedtls_pk_info_from_type( pk_type ) ) == 0 );
  596. TEST_ASSERT( mbedtls_ecp_group_load( &mbedtls_pk_ec( prv )->grp, grp_id ) == 0 );
  597. TEST_ASSERT( mbedtls_mpi_read_string( &mbedtls_pk_ec( prv )->d, 16, d_str ) == 0 );
  598. TEST_ASSERT( mbedtls_pk_setup( &pub, mbedtls_pk_info_from_type( pk_type ) ) == 0 );
  599. TEST_ASSERT( mbedtls_ecp_group_load( &mbedtls_pk_ec( pub )->grp, grp_id ) == 0 );
  600. TEST_ASSERT( mbedtls_ecp_point_read_string( &mbedtls_pk_ec( pub )->Q, 16, QX_str, QY_str ) == 0 );
  601. md_info = mbedtls_md_info_from_type( md_alg );
  602. TEST_ASSERT( md_info != NULL );
  603. hlen = mbedtls_md_get_size( md_info );
  604. TEST_ASSERT( mbedtls_md( md_info,
  605. (const unsigned char *) msg, strlen( msg ),
  606. hash ) == 0 );
  607. mbedtls_ecp_set_max_ops( max_ops );
  608. slen = sizeof( sig );
  609. cnt_restart = 0;
  610. do {
  611. ret = mbedtls_pk_sign_restartable( &prv, md_alg, hash, hlen,
  612. sig, &slen, NULL, NULL, &rs_ctx );
  613. } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
  614. TEST_ASSERT( ret == 0 );
  615. TEST_ASSERT( slen == sig_check->len );
  616. TEST_ASSERT( memcmp( sig, sig_check->x, slen ) == 0 );
  617. TEST_ASSERT( cnt_restart >= min_restart );
  618. TEST_ASSERT( cnt_restart <= max_restart );
  619. cnt_restart = 0;
  620. do {
  621. ret = mbedtls_pk_verify_restartable( &pub, md_alg,
  622. hash, hlen, sig, slen, &rs_ctx );
  623. } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS && ++cnt_restart );
  624. TEST_ASSERT( ret == 0 );
  625. TEST_ASSERT( cnt_restart >= min_restart );
  626. TEST_ASSERT( cnt_restart <= max_restart );
  627. hash[0]++;
  628. do {
  629. ret = mbedtls_pk_verify_restartable( &pub, md_alg,
  630. hash, hlen, sig, slen, &rs_ctx );
  631. } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
  632. TEST_ASSERT( ret != 0 );
  633. hash[0]--;
  634. sig[0]++;
  635. do {
  636. ret = mbedtls_pk_verify_restartable( &pub, md_alg,
  637. hash, hlen, sig, slen, &rs_ctx );
  638. } while( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
  639. TEST_ASSERT( ret != 0 );
  640. sig[0]--;
  641. /* Do we leak memory when aborting? try verify then sign
  642. * This test only makes sense when we actually restart */
  643. if( min_restart > 0 )
  644. {
  645. ret = mbedtls_pk_verify_restartable( &pub, md_alg,
  646. hash, hlen, sig, slen, &rs_ctx );
  647. TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
  648. mbedtls_pk_restart_free( &rs_ctx );
  649. slen = sizeof( sig );
  650. ret = mbedtls_pk_sign_restartable( &prv, md_alg, hash, hlen,
  651. sig, &slen, NULL, NULL, &rs_ctx );
  652. TEST_ASSERT( ret == MBEDTLS_ERR_ECP_IN_PROGRESS );
  653. }
  654. exit:
  655. mbedtls_pk_restart_free( &rs_ctx );
  656. mbedtls_pk_free( &prv );
  657. mbedtls_pk_free( &pub );
  658. }
  659. /* END_CASE */
  660. /* BEGIN_CASE depends_on:MBEDTLS_SHA256_C */
  661. void pk_sign_verify( int type, int sign_ret, int verify_ret )
  662. {
  663. mbedtls_pk_context pk;
  664. unsigned char hash[50], sig[5000];
  665. size_t sig_len;
  666. void *rs_ctx = NULL;
  667. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  668. mbedtls_pk_restart_ctx ctx;
  669. rs_ctx = &ctx;
  670. mbedtls_pk_restart_init( rs_ctx );
  671. /* This value is large enough that the operation will complete in one run.
  672. * See comments at the top of ecp_test_vect_restart in
  673. * test_suite_ecp.function for estimates of operation counts. */
  674. mbedtls_ecp_set_max_ops( 42000 );
  675. #endif
  676. mbedtls_pk_init( &pk );
  677. memset( hash, 0x2a, sizeof hash );
  678. memset( sig, 0, sizeof sig );
  679. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
  680. TEST_ASSERT( pk_genkey( &pk ) == 0 );
  681. TEST_ASSERT( mbedtls_pk_sign_restartable( &pk, MBEDTLS_MD_SHA256,
  682. hash, sizeof hash, sig, &sig_len,
  683. rnd_std_rand, NULL, rs_ctx ) == sign_ret );
  684. TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256,
  685. hash, sizeof hash, sig, sig_len ) == verify_ret );
  686. if( verify_ret == 0 )
  687. {
  688. hash[0]++;
  689. TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256,
  690. hash, sizeof hash, sig, sig_len ) != 0 );
  691. hash[0]--;
  692. sig[0]++;
  693. TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256,
  694. hash, sizeof hash, sig, sig_len ) != 0 );
  695. sig[0]--;
  696. }
  697. TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, sizeof hash,
  698. sig, &sig_len, rnd_std_rand, NULL ) == sign_ret );
  699. TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, MBEDTLS_MD_SHA256,
  700. hash, sizeof hash, sig, sig_len, rs_ctx ) == verify_ret );
  701. if( verify_ret == 0 )
  702. {
  703. hash[0]++;
  704. TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, MBEDTLS_MD_SHA256,
  705. hash, sizeof hash, sig, sig_len, rs_ctx ) != 0 );
  706. hash[0]--;
  707. sig[0]++;
  708. TEST_ASSERT( mbedtls_pk_verify_restartable( &pk, MBEDTLS_MD_SHA256,
  709. hash, sizeof hash, sig, sig_len, rs_ctx ) != 0 );
  710. sig[0]--;
  711. }
  712. exit:
  713. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  714. mbedtls_pk_restart_free( rs_ctx );
  715. #endif
  716. mbedtls_pk_free( &pk );
  717. }
  718. /* END_CASE */
  719. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
  720. void pk_rsa_encrypt_test_vec( data_t * message, int mod, int radix_N,
  721. char * input_N, int radix_E, char * input_E,
  722. data_t * result, int ret )
  723. {
  724. unsigned char output[300];
  725. rnd_pseudo_info rnd_info;
  726. mbedtls_rsa_context *rsa;
  727. mbedtls_pk_context pk;
  728. size_t olen;
  729. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  730. memset( output, 0, sizeof( output ) );
  731. mbedtls_pk_init( &pk );
  732. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  733. rsa = mbedtls_pk_rsa( pk );
  734. rsa->len = mod / 8;
  735. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->N, radix_N, input_N ) == 0 );
  736. TEST_ASSERT( mbedtls_mpi_read_string( &rsa->E, radix_E, input_E ) == 0 );
  737. TEST_ASSERT( mbedtls_pk_encrypt( &pk, message->x, message->len,
  738. output, &olen, sizeof( output ),
  739. rnd_pseudo_rand, &rnd_info ) == ret );
  740. TEST_ASSERT( olen == result->len );
  741. TEST_ASSERT( memcmp( output, result->x, olen ) == 0 );
  742. exit:
  743. mbedtls_pk_free( &pk );
  744. }
  745. /* END_CASE */
  746. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
  747. void pk_rsa_decrypt_test_vec( data_t * cipher, int mod, int radix_P,
  748. char * input_P, int radix_Q, char * input_Q,
  749. int radix_N, char * input_N, int radix_E,
  750. char * input_E, data_t * clear, int ret )
  751. {
  752. unsigned char output[256];
  753. rnd_pseudo_info rnd_info;
  754. mbedtls_mpi N, P, Q, E;
  755. mbedtls_rsa_context *rsa;
  756. mbedtls_pk_context pk;
  757. size_t olen;
  758. mbedtls_pk_init( &pk );
  759. mbedtls_mpi_init( &N ); mbedtls_mpi_init( &P );
  760. mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &E );
  761. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  762. /* init pk-rsa context */
  763. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  764. rsa = mbedtls_pk_rsa( pk );
  765. /* load public key */
  766. TEST_ASSERT( mbedtls_mpi_read_string( &N, radix_N, input_N ) == 0 );
  767. TEST_ASSERT( mbedtls_mpi_read_string( &E, radix_E, input_E ) == 0 );
  768. /* load private key */
  769. TEST_ASSERT( mbedtls_mpi_read_string( &P, radix_P, input_P ) == 0 );
  770. TEST_ASSERT( mbedtls_mpi_read_string( &Q, radix_Q, input_Q ) == 0 );
  771. TEST_ASSERT( mbedtls_rsa_import( rsa, &N, &P, &Q, NULL, &E ) == 0 );
  772. TEST_ASSERT( mbedtls_rsa_get_len( rsa ) == (size_t) ( mod / 8 ) );
  773. TEST_ASSERT( mbedtls_rsa_complete( rsa ) == 0 );
  774. /* decryption test */
  775. memset( output, 0, sizeof( output ) );
  776. olen = 0;
  777. TEST_ASSERT( mbedtls_pk_decrypt( &pk, cipher->x, cipher->len,
  778. output, &olen, sizeof( output ),
  779. rnd_pseudo_rand, &rnd_info ) == ret );
  780. if( ret == 0 )
  781. {
  782. TEST_ASSERT( olen == clear->len );
  783. TEST_ASSERT( memcmp( output, clear->x, olen ) == 0 );
  784. }
  785. exit:
  786. mbedtls_mpi_free( &N ); mbedtls_mpi_free( &P );
  787. mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &E );
  788. mbedtls_pk_free( &pk );
  789. }
  790. /* END_CASE */
  791. /* BEGIN_CASE */
  792. void pk_ec_nocrypt( int type )
  793. {
  794. mbedtls_pk_context pk;
  795. unsigned char output[100];
  796. unsigned char input[100];
  797. rnd_pseudo_info rnd_info;
  798. size_t olen = 0;
  799. int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
  800. mbedtls_pk_init( &pk );
  801. memset( &rnd_info, 0, sizeof( rnd_pseudo_info ) );
  802. memset( output, 0, sizeof( output ) );
  803. memset( input, 0, sizeof( input ) );
  804. TEST_ASSERT( mbedtls_pk_setup( &pk, mbedtls_pk_info_from_type( type ) ) == 0 );
  805. TEST_ASSERT( mbedtls_pk_encrypt( &pk, input, sizeof( input ),
  806. output, &olen, sizeof( output ),
  807. rnd_pseudo_rand, &rnd_info ) == ret );
  808. TEST_ASSERT( mbedtls_pk_decrypt( &pk, input, sizeof( input ),
  809. output, &olen, sizeof( output ),
  810. rnd_pseudo_rand, &rnd_info ) == ret );
  811. exit:
  812. mbedtls_pk_free( &pk );
  813. }
  814. /* END_CASE */
  815. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C */
  816. void pk_rsa_overflow( )
  817. {
  818. mbedtls_pk_context pk;
  819. size_t hash_len = SIZE_MAX, sig_len = SIZE_MAX;
  820. unsigned char hash[50], sig[100];
  821. if( SIZE_MAX <= UINT_MAX )
  822. return;
  823. memset( hash, 0x2a, sizeof hash );
  824. memset( sig, 0, sizeof sig );
  825. mbedtls_pk_init( &pk );
  826. TEST_ASSERT( mbedtls_pk_setup( &pk,
  827. mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  828. #if defined(MBEDTLS_PKCS1_V21)
  829. TEST_ASSERT( mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, NULL, &pk,
  830. MBEDTLS_MD_NONE, hash, hash_len, sig, sig_len ) ==
  831. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  832. #endif /* MBEDTLS_PKCS1_V21 */
  833. TEST_ASSERT( mbedtls_pk_verify( &pk, MBEDTLS_MD_NONE, hash, hash_len,
  834. sig, sig_len ) == MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  835. TEST_ASSERT( mbedtls_pk_sign( &pk, MBEDTLS_MD_NONE, hash, hash_len, sig, &sig_len,
  836. rnd_std_rand, NULL ) == MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  837. exit:
  838. mbedtls_pk_free( &pk );
  839. }
  840. /* END_CASE */
  841. /* BEGIN_CASE depends_on:MBEDTLS_RSA_C:MBEDTLS_PK_RSA_ALT_SUPPORT */
  842. void pk_rsa_alt( )
  843. {
  844. /*
  845. * An rsa_alt context can only do private operations (decrypt, sign).
  846. * Test it against the public operations (encrypt, verify) of a
  847. * corresponding rsa context.
  848. */
  849. mbedtls_rsa_context raw;
  850. mbedtls_pk_context rsa, alt;
  851. mbedtls_pk_debug_item dbg_items[10];
  852. unsigned char hash[50], sig[64];
  853. unsigned char msg[50], ciph[64], test[50];
  854. size_t sig_len, ciph_len, test_len;
  855. int ret = MBEDTLS_ERR_PK_TYPE_MISMATCH;
  856. mbedtls_rsa_init( &raw, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_NONE );
  857. mbedtls_pk_init( &rsa ); mbedtls_pk_init( &alt );
  858. memset( hash, 0x2a, sizeof hash );
  859. memset( sig, 0, sizeof sig );
  860. memset( msg, 0x2a, sizeof msg );
  861. memset( ciph, 0, sizeof ciph );
  862. memset( test, 0, sizeof test );
  863. /* Initiliaze PK RSA context with random key */
  864. TEST_ASSERT( mbedtls_pk_setup( &rsa,
  865. mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == 0 );
  866. TEST_ASSERT( pk_genkey( &rsa ) == 0 );
  867. /* Extract key to the raw rsa context */
  868. TEST_ASSERT( mbedtls_rsa_copy( &raw, mbedtls_pk_rsa( rsa ) ) == 0 );
  869. /* Initialize PK RSA_ALT context */
  870. TEST_ASSERT( mbedtls_pk_setup_rsa_alt( &alt, (void *) &raw,
  871. mbedtls_rsa_decrypt_func, mbedtls_rsa_sign_func, mbedtls_rsa_key_len_func ) == 0 );
  872. /* Test administrative functions */
  873. TEST_ASSERT( mbedtls_pk_can_do( &alt, MBEDTLS_PK_RSA ) );
  874. TEST_ASSERT( mbedtls_pk_get_bitlen( &alt ) == RSA_KEY_SIZE );
  875. TEST_ASSERT( mbedtls_pk_get_len( &alt ) == RSA_KEY_LEN );
  876. TEST_ASSERT( mbedtls_pk_get_type( &alt ) == MBEDTLS_PK_RSA_ALT );
  877. TEST_ASSERT( strcmp( mbedtls_pk_get_name( &alt ), "RSA-alt" ) == 0 );
  878. /* Test signature */
  879. #if SIZE_MAX > UINT_MAX
  880. TEST_ASSERT( mbedtls_pk_sign( &alt, MBEDTLS_MD_NONE, hash, SIZE_MAX,
  881. sig, &sig_len, rnd_std_rand, NULL ) ==
  882. MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  883. #endif /* SIZE_MAX > UINT_MAX */
  884. TEST_ASSERT( mbedtls_pk_sign( &alt, MBEDTLS_MD_NONE, hash, sizeof hash,
  885. sig, &sig_len, rnd_std_rand, NULL ) == 0 );
  886. TEST_ASSERT( sig_len == RSA_KEY_LEN );
  887. TEST_ASSERT( mbedtls_pk_verify( &rsa, MBEDTLS_MD_NONE,
  888. hash, sizeof hash, sig, sig_len ) == 0 );
  889. /* Test decrypt */
  890. TEST_ASSERT( mbedtls_pk_encrypt( &rsa, msg, sizeof msg,
  891. ciph, &ciph_len, sizeof ciph,
  892. rnd_std_rand, NULL ) == 0 );
  893. TEST_ASSERT( mbedtls_pk_decrypt( &alt, ciph, ciph_len,
  894. test, &test_len, sizeof test,
  895. rnd_std_rand, NULL ) == 0 );
  896. TEST_ASSERT( test_len == sizeof msg );
  897. TEST_ASSERT( memcmp( test, msg, test_len ) == 0 );
  898. /* Test forbidden operations */
  899. TEST_ASSERT( mbedtls_pk_encrypt( &alt, msg, sizeof msg,
  900. ciph, &ciph_len, sizeof ciph,
  901. rnd_std_rand, NULL ) == ret );
  902. TEST_ASSERT( mbedtls_pk_verify( &alt, MBEDTLS_MD_NONE,
  903. hash, sizeof hash, sig, sig_len ) == ret );
  904. TEST_ASSERT( mbedtls_pk_debug( &alt, dbg_items ) == ret );
  905. exit:
  906. mbedtls_rsa_free( &raw );
  907. mbedtls_pk_free( &rsa ); mbedtls_pk_free( &alt );
  908. }
  909. /* END_CASE */