pk_wrap.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. /*
  2. * Public Key abstraction layer: wrapper functions
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  8. * not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. #include "common.h"
  20. #if defined(MBEDTLS_PK_C)
  21. #include "pk_wrap.h"
  22. #include "mbedtls/error.h"
  23. /* Even if RSA not activated, for the sake of RSA-alt */
  24. #include "mbedtls/rsa.h"
  25. #include <string.h>
  26. #if defined(MBEDTLS_ECP_C)
  27. #include "mbedtls/ecp.h"
  28. #endif
  29. #if defined(MBEDTLS_ECDSA_C)
  30. #include "mbedtls/ecdsa.h"
  31. #endif
  32. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  33. #include "mbedtls/asn1write.h"
  34. #endif
  35. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  36. #include "mbedtls/platform_util.h"
  37. #endif
  38. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  39. #include "psa/crypto.h"
  40. #include "mbedtls/psa_util.h"
  41. #include "mbedtls/asn1.h"
  42. #endif
  43. #if defined(MBEDTLS_PLATFORM_C)
  44. #include "mbedtls/platform.h"
  45. #else
  46. #include <stdlib.h>
  47. #define mbedtls_calloc calloc
  48. #define mbedtls_free free
  49. #endif
  50. #include <limits.h>
  51. #include <stdint.h>
  52. #if defined(MBEDTLS_RSA_C)
  53. static int rsa_can_do( mbedtls_pk_type_t type )
  54. {
  55. return( type == MBEDTLS_PK_RSA ||
  56. type == MBEDTLS_PK_RSASSA_PSS );
  57. }
  58. static size_t rsa_get_bitlen( const void *ctx )
  59. {
  60. const mbedtls_rsa_context * rsa = (const mbedtls_rsa_context *) ctx;
  61. return( 8 * mbedtls_rsa_get_len( rsa ) );
  62. }
  63. static int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  64. const unsigned char *hash, size_t hash_len,
  65. const unsigned char *sig, size_t sig_len )
  66. {
  67. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  68. mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
  69. size_t rsa_len = mbedtls_rsa_get_len( rsa );
  70. #if SIZE_MAX > UINT_MAX
  71. if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
  72. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  73. #endif /* SIZE_MAX > UINT_MAX */
  74. if( sig_len < rsa_len )
  75. return( MBEDTLS_ERR_RSA_VERIFY_FAILED );
  76. if( ( ret = mbedtls_rsa_pkcs1_verify( rsa, md_alg,
  77. (unsigned int) hash_len,
  78. hash, sig ) ) != 0 )
  79. return( ret );
  80. /* The buffer contains a valid signature followed by extra data.
  81. * We have a special error code for that so that so that callers can
  82. * use mbedtls_pk_verify() to check "Does the buffer start with a
  83. * valid signature?" and not just "Does the buffer contain a valid
  84. * signature?". */
  85. if( sig_len > rsa_len )
  86. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  87. return( 0 );
  88. }
  89. static int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  90. const unsigned char *hash, size_t hash_len,
  91. unsigned char *sig, size_t sig_size, size_t *sig_len,
  92. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  93. {
  94. mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
  95. #if SIZE_MAX > UINT_MAX
  96. if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )
  97. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  98. #endif /* SIZE_MAX > UINT_MAX */
  99. *sig_len = mbedtls_rsa_get_len( rsa );
  100. if( sig_size < *sig_len )
  101. return( MBEDTLS_ERR_PK_BUFFER_TOO_SMALL );
  102. return( mbedtls_rsa_pkcs1_sign( rsa, f_rng, p_rng,
  103. md_alg, (unsigned int) hash_len,
  104. hash, sig ) );
  105. }
  106. static int rsa_decrypt_wrap( void *ctx,
  107. const unsigned char *input, size_t ilen,
  108. unsigned char *output, size_t *olen, size_t osize,
  109. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  110. {
  111. mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
  112. if( ilen != mbedtls_rsa_get_len( rsa ) )
  113. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  114. return( mbedtls_rsa_pkcs1_decrypt( rsa, f_rng, p_rng,
  115. olen, input, output, osize ) );
  116. }
  117. static int rsa_encrypt_wrap( void *ctx,
  118. const unsigned char *input, size_t ilen,
  119. unsigned char *output, size_t *olen, size_t osize,
  120. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  121. {
  122. mbedtls_rsa_context * rsa = (mbedtls_rsa_context *) ctx;
  123. *olen = mbedtls_rsa_get_len( rsa );
  124. if( *olen > osize )
  125. return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );
  126. return( mbedtls_rsa_pkcs1_encrypt( rsa, f_rng, p_rng,
  127. ilen, input, output ) );
  128. }
  129. static int rsa_check_pair_wrap( const void *pub, const void *prv,
  130. int (*f_rng)(void *, unsigned char *, size_t),
  131. void *p_rng )
  132. {
  133. (void) f_rng;
  134. (void) p_rng;
  135. return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub,
  136. (const mbedtls_rsa_context *) prv ) );
  137. }
  138. static void *rsa_alloc_wrap( void )
  139. {
  140. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) );
  141. if( ctx != NULL )
  142. mbedtls_rsa_init( (mbedtls_rsa_context *) ctx );
  143. return( ctx );
  144. }
  145. static void rsa_free_wrap( void *ctx )
  146. {
  147. mbedtls_rsa_free( (mbedtls_rsa_context *) ctx );
  148. mbedtls_free( ctx );
  149. }
  150. static void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items )
  151. {
  152. #if defined(MBEDTLS_RSA_ALT)
  153. /* Not supported */
  154. (void) ctx;
  155. (void) items;
  156. #else
  157. items->type = MBEDTLS_PK_DEBUG_MPI;
  158. items->name = "rsa.N";
  159. items->value = &( ((mbedtls_rsa_context *) ctx)->N );
  160. items++;
  161. items->type = MBEDTLS_PK_DEBUG_MPI;
  162. items->name = "rsa.E";
  163. items->value = &( ((mbedtls_rsa_context *) ctx)->E );
  164. #endif
  165. }
  166. const mbedtls_pk_info_t mbedtls_rsa_info = {
  167. MBEDTLS_PK_RSA,
  168. "RSA",
  169. rsa_get_bitlen,
  170. rsa_can_do,
  171. rsa_verify_wrap,
  172. rsa_sign_wrap,
  173. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  174. NULL,
  175. NULL,
  176. #endif
  177. rsa_decrypt_wrap,
  178. rsa_encrypt_wrap,
  179. rsa_check_pair_wrap,
  180. rsa_alloc_wrap,
  181. rsa_free_wrap,
  182. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  183. NULL,
  184. NULL,
  185. #endif
  186. rsa_debug,
  187. };
  188. #endif /* MBEDTLS_RSA_C */
  189. #if defined(MBEDTLS_ECP_C)
  190. /*
  191. * Generic EC key
  192. */
  193. static int eckey_can_do( mbedtls_pk_type_t type )
  194. {
  195. return( type == MBEDTLS_PK_ECKEY ||
  196. type == MBEDTLS_PK_ECKEY_DH ||
  197. type == MBEDTLS_PK_ECDSA );
  198. }
  199. static size_t eckey_get_bitlen( const void *ctx )
  200. {
  201. return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits );
  202. }
  203. #if defined(MBEDTLS_ECDSA_C)
  204. /* Forward declarations */
  205. static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  206. const unsigned char *hash, size_t hash_len,
  207. const unsigned char *sig, size_t sig_len );
  208. static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  209. const unsigned char *hash, size_t hash_len,
  210. unsigned char *sig, size_t sig_size, size_t *sig_len,
  211. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
  212. static int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  213. const unsigned char *hash, size_t hash_len,
  214. const unsigned char *sig, size_t sig_len )
  215. {
  216. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  217. mbedtls_ecdsa_context ecdsa;
  218. mbedtls_ecdsa_init( &ecdsa );
  219. if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
  220. ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len );
  221. mbedtls_ecdsa_free( &ecdsa );
  222. return( ret );
  223. }
  224. static int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  225. const unsigned char *hash, size_t hash_len,
  226. unsigned char *sig, size_t sig_size, size_t *sig_len,
  227. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  228. {
  229. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  230. mbedtls_ecdsa_context ecdsa;
  231. mbedtls_ecdsa_init( &ecdsa );
  232. if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )
  233. ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len,
  234. sig, sig_size, sig_len,
  235. f_rng, p_rng );
  236. mbedtls_ecdsa_free( &ecdsa );
  237. return( ret );
  238. }
  239. #if defined(MBEDTLS_ECP_RESTARTABLE)
  240. /* Forward declarations */
  241. static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  242. const unsigned char *hash, size_t hash_len,
  243. const unsigned char *sig, size_t sig_len,
  244. void *rs_ctx );
  245. static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  246. const unsigned char *hash, size_t hash_len,
  247. unsigned char *sig, size_t sig_size, size_t *sig_len,
  248. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  249. void *rs_ctx );
  250. /*
  251. * Restart context for ECDSA operations with ECKEY context
  252. *
  253. * We need to store an actual ECDSA context, as we need to pass the same to
  254. * the underlying ecdsa function, so we can't create it on the fly every time.
  255. */
  256. typedef struct
  257. {
  258. mbedtls_ecdsa_restart_ctx ecdsa_rs;
  259. mbedtls_ecdsa_context ecdsa_ctx;
  260. } eckey_restart_ctx;
  261. static void *eckey_rs_alloc( void )
  262. {
  263. eckey_restart_ctx *rs_ctx;
  264. void *ctx = mbedtls_calloc( 1, sizeof( eckey_restart_ctx ) );
  265. if( ctx != NULL )
  266. {
  267. rs_ctx = ctx;
  268. mbedtls_ecdsa_restart_init( &rs_ctx->ecdsa_rs );
  269. mbedtls_ecdsa_init( &rs_ctx->ecdsa_ctx );
  270. }
  271. return( ctx );
  272. }
  273. static void eckey_rs_free( void *ctx )
  274. {
  275. eckey_restart_ctx *rs_ctx;
  276. if( ctx == NULL)
  277. return;
  278. rs_ctx = ctx;
  279. mbedtls_ecdsa_restart_free( &rs_ctx->ecdsa_rs );
  280. mbedtls_ecdsa_free( &rs_ctx->ecdsa_ctx );
  281. mbedtls_free( ctx );
  282. }
  283. static int eckey_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  284. const unsigned char *hash, size_t hash_len,
  285. const unsigned char *sig, size_t sig_len,
  286. void *rs_ctx )
  287. {
  288. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  289. eckey_restart_ctx *rs = rs_ctx;
  290. /* Should never happen */
  291. if( rs == NULL )
  292. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  293. /* set up our own sub-context if needed (that is, on first run) */
  294. if( rs->ecdsa_ctx.grp.pbits == 0 )
  295. MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) );
  296. MBEDTLS_MPI_CHK( ecdsa_verify_rs_wrap( &rs->ecdsa_ctx,
  297. md_alg, hash, hash_len,
  298. sig, sig_len, &rs->ecdsa_rs ) );
  299. cleanup:
  300. return( ret );
  301. }
  302. static int eckey_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  303. const unsigned char *hash, size_t hash_len,
  304. unsigned char *sig, size_t sig_size, size_t *sig_len,
  305. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  306. void *rs_ctx )
  307. {
  308. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  309. eckey_restart_ctx *rs = rs_ctx;
  310. /* Should never happen */
  311. if( rs == NULL )
  312. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  313. /* set up our own sub-context if needed (that is, on first run) */
  314. if( rs->ecdsa_ctx.grp.pbits == 0 )
  315. MBEDTLS_MPI_CHK( mbedtls_ecdsa_from_keypair( &rs->ecdsa_ctx, ctx ) );
  316. MBEDTLS_MPI_CHK( ecdsa_sign_rs_wrap( &rs->ecdsa_ctx, md_alg,
  317. hash, hash_len, sig, sig_size, sig_len,
  318. f_rng, p_rng, &rs->ecdsa_rs ) );
  319. cleanup:
  320. return( ret );
  321. }
  322. #endif /* MBEDTLS_ECP_RESTARTABLE */
  323. #endif /* MBEDTLS_ECDSA_C */
  324. static int eckey_check_pair( const void *pub, const void *prv,
  325. int (*f_rng)(void *, unsigned char *, size_t),
  326. void *p_rng )
  327. {
  328. return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub,
  329. (const mbedtls_ecp_keypair *) prv,
  330. f_rng, p_rng ) );
  331. }
  332. static void *eckey_alloc_wrap( void )
  333. {
  334. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );
  335. if( ctx != NULL )
  336. mbedtls_ecp_keypair_init( ctx );
  337. return( ctx );
  338. }
  339. static void eckey_free_wrap( void *ctx )
  340. {
  341. mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx );
  342. mbedtls_free( ctx );
  343. }
  344. static void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items )
  345. {
  346. items->type = MBEDTLS_PK_DEBUG_ECP;
  347. items->name = "eckey.Q";
  348. items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q );
  349. }
  350. const mbedtls_pk_info_t mbedtls_eckey_info = {
  351. MBEDTLS_PK_ECKEY,
  352. "EC",
  353. eckey_get_bitlen,
  354. eckey_can_do,
  355. #if defined(MBEDTLS_ECDSA_C)
  356. eckey_verify_wrap,
  357. eckey_sign_wrap,
  358. #if defined(MBEDTLS_ECP_RESTARTABLE)
  359. eckey_verify_rs_wrap,
  360. eckey_sign_rs_wrap,
  361. #endif
  362. #else /* MBEDTLS_ECDSA_C */
  363. NULL,
  364. NULL,
  365. #endif /* MBEDTLS_ECDSA_C */
  366. NULL,
  367. NULL,
  368. eckey_check_pair,
  369. eckey_alloc_wrap,
  370. eckey_free_wrap,
  371. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  372. eckey_rs_alloc,
  373. eckey_rs_free,
  374. #endif
  375. eckey_debug,
  376. };
  377. /*
  378. * EC key restricted to ECDH
  379. */
  380. static int eckeydh_can_do( mbedtls_pk_type_t type )
  381. {
  382. return( type == MBEDTLS_PK_ECKEY ||
  383. type == MBEDTLS_PK_ECKEY_DH );
  384. }
  385. const mbedtls_pk_info_t mbedtls_eckeydh_info = {
  386. MBEDTLS_PK_ECKEY_DH,
  387. "EC_DH",
  388. eckey_get_bitlen, /* Same underlying key structure */
  389. eckeydh_can_do,
  390. NULL,
  391. NULL,
  392. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  393. NULL,
  394. NULL,
  395. #endif
  396. NULL,
  397. NULL,
  398. eckey_check_pair,
  399. eckey_alloc_wrap, /* Same underlying key structure */
  400. eckey_free_wrap, /* Same underlying key structure */
  401. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  402. NULL,
  403. NULL,
  404. #endif
  405. eckey_debug, /* Same underlying key structure */
  406. };
  407. #endif /* MBEDTLS_ECP_C */
  408. #if defined(MBEDTLS_ECDSA_C)
  409. static int ecdsa_can_do( mbedtls_pk_type_t type )
  410. {
  411. return( type == MBEDTLS_PK_ECDSA );
  412. }
  413. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  414. /*
  415. * An ASN.1 encoded signature is a sequence of two ASN.1 integers. Parse one of
  416. * those integers and convert it to the fixed-length encoding expected by PSA.
  417. */
  418. static int extract_ecdsa_sig_int( unsigned char **from, const unsigned char *end,
  419. unsigned char *to, size_t to_len )
  420. {
  421. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  422. size_t unpadded_len, padding_len;
  423. if( ( ret = mbedtls_asn1_get_tag( from, end, &unpadded_len,
  424. MBEDTLS_ASN1_INTEGER ) ) != 0 )
  425. {
  426. return( ret );
  427. }
  428. while( unpadded_len > 0 && **from == 0x00 )
  429. {
  430. ( *from )++;
  431. unpadded_len--;
  432. }
  433. if( unpadded_len > to_len || unpadded_len == 0 )
  434. return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );
  435. padding_len = to_len - unpadded_len;
  436. memset( to, 0x00, padding_len );
  437. memcpy( to + padding_len, *from, unpadded_len );
  438. ( *from ) += unpadded_len;
  439. return( 0 );
  440. }
  441. /*
  442. * Convert a signature from an ASN.1 sequence of two integers
  443. * to a raw {r,s} buffer. Note: the provided sig buffer must be at least
  444. * twice as big as int_size.
  445. */
  446. static int extract_ecdsa_sig( unsigned char **p, const unsigned char *end,
  447. unsigned char *sig, size_t int_size )
  448. {
  449. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  450. size_t tmp_size;
  451. if( ( ret = mbedtls_asn1_get_tag( p, end, &tmp_size,
  452. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )
  453. return( ret );
  454. /* Extract r */
  455. if( ( ret = extract_ecdsa_sig_int( p, end, sig, int_size ) ) != 0 )
  456. return( ret );
  457. /* Extract s */
  458. if( ( ret = extract_ecdsa_sig_int( p, end, sig + int_size, int_size ) ) != 0 )
  459. return( ret );
  460. return( 0 );
  461. }
  462. static int ecdsa_verify_wrap( void *ctx_arg, mbedtls_md_type_t md_alg,
  463. const unsigned char *hash, size_t hash_len,
  464. const unsigned char *sig, size_t sig_len )
  465. {
  466. mbedtls_ecdsa_context *ctx = ctx_arg;
  467. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  468. psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
  469. psa_key_id_t key_id = 0;
  470. psa_status_t status;
  471. mbedtls_pk_context key;
  472. int key_len;
  473. /* see ECP_PUB_DER_MAX_BYTES in pkwrite.c */
  474. unsigned char buf[30 + 2 * MBEDTLS_ECP_MAX_BYTES];
  475. unsigned char *p;
  476. mbedtls_pk_info_t pk_info = mbedtls_eckey_info;
  477. psa_algorithm_t psa_sig_md = PSA_ALG_ECDSA_ANY;
  478. size_t curve_bits;
  479. psa_ecc_family_t curve =
  480. mbedtls_ecc_group_to_psa( ctx->grp.id, &curve_bits );
  481. const size_t signature_part_size = ( ctx->grp.nbits + 7 ) / 8;
  482. ((void) md_alg);
  483. if( curve == 0 )
  484. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  485. /* mbedtls_pk_write_pubkey() expects a full PK context;
  486. * re-construct one to make it happy */
  487. key.pk_info = &pk_info;
  488. key.pk_ctx = ctx;
  489. p = buf + sizeof( buf );
  490. key_len = mbedtls_pk_write_pubkey( &p, buf, &key );
  491. if( key_len <= 0 )
  492. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  493. psa_set_key_type( &attributes, PSA_KEY_TYPE_ECC_PUBLIC_KEY( curve ) );
  494. psa_set_key_usage_flags( &attributes, PSA_KEY_USAGE_VERIFY_HASH );
  495. psa_set_key_algorithm( &attributes, psa_sig_md );
  496. status = psa_import_key( &attributes,
  497. buf + sizeof( buf ) - key_len, key_len,
  498. &key_id );
  499. if( status != PSA_SUCCESS )
  500. {
  501. ret = mbedtls_psa_err_translate_pk( status );
  502. goto cleanup;
  503. }
  504. /* We don't need the exported key anymore and can
  505. * reuse its buffer for signature extraction. */
  506. if( 2 * signature_part_size > sizeof( buf ) )
  507. {
  508. ret = MBEDTLS_ERR_PK_BAD_INPUT_DATA;
  509. goto cleanup;
  510. }
  511. p = (unsigned char*) sig;
  512. if( ( ret = extract_ecdsa_sig( &p, sig + sig_len, buf,
  513. signature_part_size ) ) != 0 )
  514. {
  515. goto cleanup;
  516. }
  517. if( psa_verify_hash( key_id, psa_sig_md,
  518. hash, hash_len,
  519. buf, 2 * signature_part_size )
  520. != PSA_SUCCESS )
  521. {
  522. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  523. goto cleanup;
  524. }
  525. if( p != sig + sig_len )
  526. {
  527. ret = MBEDTLS_ERR_PK_SIG_LEN_MISMATCH;
  528. goto cleanup;
  529. }
  530. ret = 0;
  531. cleanup:
  532. psa_destroy_key( key_id );
  533. return( ret );
  534. }
  535. #else /* MBEDTLS_USE_PSA_CRYPTO */
  536. static int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,
  537. const unsigned char *hash, size_t hash_len,
  538. const unsigned char *sig, size_t sig_len )
  539. {
  540. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  541. ((void) md_alg);
  542. ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx,
  543. hash, hash_len, sig, sig_len );
  544. if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
  545. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  546. return( ret );
  547. }
  548. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  549. static int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  550. const unsigned char *hash, size_t hash_len,
  551. unsigned char *sig, size_t sig_size, size_t *sig_len,
  552. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  553. {
  554. return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx,
  555. md_alg, hash, hash_len,
  556. sig, sig_size, sig_len,
  557. f_rng, p_rng ) );
  558. }
  559. #if defined(MBEDTLS_ECP_RESTARTABLE)
  560. static int ecdsa_verify_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  561. const unsigned char *hash, size_t hash_len,
  562. const unsigned char *sig, size_t sig_len,
  563. void *rs_ctx )
  564. {
  565. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  566. ((void) md_alg);
  567. ret = mbedtls_ecdsa_read_signature_restartable(
  568. (mbedtls_ecdsa_context *) ctx,
  569. hash, hash_len, sig, sig_len,
  570. (mbedtls_ecdsa_restart_ctx *) rs_ctx );
  571. if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )
  572. return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );
  573. return( ret );
  574. }
  575. static int ecdsa_sign_rs_wrap( void *ctx, mbedtls_md_type_t md_alg,
  576. const unsigned char *hash, size_t hash_len,
  577. unsigned char *sig, size_t sig_size, size_t *sig_len,
  578. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  579. void *rs_ctx )
  580. {
  581. return( mbedtls_ecdsa_write_signature_restartable(
  582. (mbedtls_ecdsa_context *) ctx,
  583. md_alg, hash, hash_len, sig, sig_size, sig_len, f_rng, p_rng,
  584. (mbedtls_ecdsa_restart_ctx *) rs_ctx ) );
  585. }
  586. #endif /* MBEDTLS_ECP_RESTARTABLE */
  587. static void *ecdsa_alloc_wrap( void )
  588. {
  589. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) );
  590. if( ctx != NULL )
  591. mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx );
  592. return( ctx );
  593. }
  594. static void ecdsa_free_wrap( void *ctx )
  595. {
  596. mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx );
  597. mbedtls_free( ctx );
  598. }
  599. #if defined(MBEDTLS_ECP_RESTARTABLE)
  600. static void *ecdsa_rs_alloc( void )
  601. {
  602. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_restart_ctx ) );
  603. if( ctx != NULL )
  604. mbedtls_ecdsa_restart_init( ctx );
  605. return( ctx );
  606. }
  607. static void ecdsa_rs_free( void *ctx )
  608. {
  609. mbedtls_ecdsa_restart_free( ctx );
  610. mbedtls_free( ctx );
  611. }
  612. #endif /* MBEDTLS_ECP_RESTARTABLE */
  613. const mbedtls_pk_info_t mbedtls_ecdsa_info = {
  614. MBEDTLS_PK_ECDSA,
  615. "ECDSA",
  616. eckey_get_bitlen, /* Compatible key structures */
  617. ecdsa_can_do,
  618. ecdsa_verify_wrap,
  619. ecdsa_sign_wrap,
  620. #if defined(MBEDTLS_ECP_RESTARTABLE)
  621. ecdsa_verify_rs_wrap,
  622. ecdsa_sign_rs_wrap,
  623. #endif
  624. NULL,
  625. NULL,
  626. eckey_check_pair, /* Compatible key structures */
  627. ecdsa_alloc_wrap,
  628. ecdsa_free_wrap,
  629. #if defined(MBEDTLS_ECP_RESTARTABLE)
  630. ecdsa_rs_alloc,
  631. ecdsa_rs_free,
  632. #endif
  633. eckey_debug, /* Compatible key structures */
  634. };
  635. #endif /* MBEDTLS_ECDSA_C */
  636. #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
  637. /*
  638. * Support for alternative RSA-private implementations
  639. */
  640. static int rsa_alt_can_do( mbedtls_pk_type_t type )
  641. {
  642. return( type == MBEDTLS_PK_RSA );
  643. }
  644. static size_t rsa_alt_get_bitlen( const void *ctx )
  645. {
  646. const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx;
  647. return( 8 * rsa_alt->key_len_func( rsa_alt->key ) );
  648. }
  649. static int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  650. const unsigned char *hash, size_t hash_len,
  651. unsigned char *sig, size_t sig_size, size_t *sig_len,
  652. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  653. {
  654. mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
  655. #if SIZE_MAX > UINT_MAX
  656. if( UINT_MAX < hash_len )
  657. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  658. #endif /* SIZE_MAX > UINT_MAX */
  659. *sig_len = rsa_alt->key_len_func( rsa_alt->key );
  660. if( *sig_len > MBEDTLS_PK_SIGNATURE_MAX_SIZE )
  661. return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );
  662. if( *sig_len > sig_size )
  663. return( MBEDTLS_ERR_PK_BUFFER_TOO_SMALL );
  664. return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng,
  665. md_alg, (unsigned int) hash_len, hash, sig ) );
  666. }
  667. static int rsa_alt_decrypt_wrap( void *ctx,
  668. const unsigned char *input, size_t ilen,
  669. unsigned char *output, size_t *olen, size_t osize,
  670. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  671. {
  672. mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;
  673. ((void) f_rng);
  674. ((void) p_rng);
  675. if( ilen != rsa_alt->key_len_func( rsa_alt->key ) )
  676. return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );
  677. return( rsa_alt->decrypt_func( rsa_alt->key,
  678. olen, input, output, osize ) );
  679. }
  680. #if defined(MBEDTLS_RSA_C)
  681. static int rsa_alt_check_pair( const void *pub, const void *prv,
  682. int (*f_rng)(void *, unsigned char *, size_t),
  683. void *p_rng )
  684. {
  685. unsigned char sig[MBEDTLS_MPI_MAX_SIZE];
  686. unsigned char hash[32];
  687. size_t sig_len = 0;
  688. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  689. if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) )
  690. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  691. memset( hash, 0x2a, sizeof( hash ) );
  692. if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE,
  693. hash, sizeof( hash ),
  694. sig, sizeof( sig ), &sig_len,
  695. f_rng, p_rng ) ) != 0 )
  696. {
  697. return( ret );
  698. }
  699. if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE,
  700. hash, sizeof( hash ), sig, sig_len ) != 0 )
  701. {
  702. return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );
  703. }
  704. return( 0 );
  705. }
  706. #endif /* MBEDTLS_RSA_C */
  707. static void *rsa_alt_alloc_wrap( void )
  708. {
  709. void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) );
  710. if( ctx != NULL )
  711. memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) );
  712. return( ctx );
  713. }
  714. static void rsa_alt_free_wrap( void *ctx )
  715. {
  716. mbedtls_platform_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) );
  717. mbedtls_free( ctx );
  718. }
  719. const mbedtls_pk_info_t mbedtls_rsa_alt_info = {
  720. MBEDTLS_PK_RSA_ALT,
  721. "RSA-alt",
  722. rsa_alt_get_bitlen,
  723. rsa_alt_can_do,
  724. NULL,
  725. rsa_alt_sign_wrap,
  726. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  727. NULL,
  728. NULL,
  729. #endif
  730. rsa_alt_decrypt_wrap,
  731. NULL,
  732. #if defined(MBEDTLS_RSA_C)
  733. rsa_alt_check_pair,
  734. #else
  735. NULL,
  736. #endif
  737. rsa_alt_alloc_wrap,
  738. rsa_alt_free_wrap,
  739. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  740. NULL,
  741. NULL,
  742. #endif
  743. NULL,
  744. };
  745. #endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */
  746. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  747. static void *pk_opaque_alloc_wrap( void )
  748. {
  749. void *ctx = mbedtls_calloc( 1, sizeof( psa_key_id_t ) );
  750. /* no _init() function to call, an calloc() already zeroized */
  751. return( ctx );
  752. }
  753. static void pk_opaque_free_wrap( void *ctx )
  754. {
  755. mbedtls_platform_zeroize( ctx, sizeof( psa_key_id_t ) );
  756. mbedtls_free( ctx );
  757. }
  758. static size_t pk_opaque_get_bitlen( const void *ctx )
  759. {
  760. const psa_key_id_t *key = (const psa_key_id_t *) ctx;
  761. size_t bits;
  762. psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
  763. if( PSA_SUCCESS != psa_get_key_attributes( *key, &attributes ) )
  764. return( 0 );
  765. bits = psa_get_key_bits( &attributes );
  766. psa_reset_key_attributes( &attributes );
  767. return( bits );
  768. }
  769. static int pk_opaque_can_do( mbedtls_pk_type_t type )
  770. {
  771. /* For now opaque PSA keys can only wrap ECC keypairs,
  772. * as checked by setup_psa().
  773. * Also, ECKEY_DH does not really make sense with the current API. */
  774. return( type == MBEDTLS_PK_ECKEY ||
  775. type == MBEDTLS_PK_ECDSA );
  776. }
  777. #if defined(MBEDTLS_ECDSA_C)
  778. /*
  779. * Simultaneously convert and move raw MPI from the beginning of a buffer
  780. * to an ASN.1 MPI at the end of the buffer.
  781. * See also mbedtls_asn1_write_mpi().
  782. *
  783. * p: pointer to the end of the output buffer
  784. * start: start of the output buffer, and also of the mpi to write at the end
  785. * n_len: length of the mpi to read from start
  786. */
  787. static int asn1_write_mpibuf( unsigned char **p, unsigned char *start,
  788. size_t n_len )
  789. {
  790. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  791. size_t len = 0;
  792. if( (size_t)( *p - start ) < n_len )
  793. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  794. len = n_len;
  795. *p -= len;
  796. memmove( *p, start, len );
  797. /* ASN.1 DER encoding requires minimal length, so skip leading 0s.
  798. * Neither r nor s should be 0, but as a failsafe measure, still detect
  799. * that rather than overflowing the buffer in case of a PSA error. */
  800. while( len > 0 && **p == 0x00 )
  801. {
  802. ++(*p);
  803. --len;
  804. }
  805. /* this is only reached if the signature was invalid */
  806. if( len == 0 )
  807. return( MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED );
  808. /* if the msb is 1, ASN.1 requires that we prepend a 0.
  809. * Neither r nor s can be 0, so we can assume len > 0 at all times. */
  810. if( **p & 0x80 )
  811. {
  812. if( *p - start < 1 )
  813. return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );
  814. *--(*p) = 0x00;
  815. len += 1;
  816. }
  817. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );
  818. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,
  819. MBEDTLS_ASN1_INTEGER ) );
  820. return( (int) len );
  821. }
  822. /* Transcode signature from PSA format to ASN.1 sequence.
  823. * See ecdsa_signature_to_asn1 in ecdsa.c, but with byte buffers instead of
  824. * MPIs, and in-place.
  825. *
  826. * [in/out] sig: the signature pre- and post-transcoding
  827. * [in/out] sig_len: signature length pre- and post-transcoding
  828. * [int] buf_len: the available size the in/out buffer
  829. */
  830. static int pk_ecdsa_sig_asn1_from_psa( unsigned char *sig, size_t *sig_len,
  831. size_t buf_len )
  832. {
  833. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  834. size_t len = 0;
  835. const size_t rs_len = *sig_len / 2;
  836. unsigned char *p = sig + buf_len;
  837. MBEDTLS_ASN1_CHK_ADD( len, asn1_write_mpibuf( &p, sig + rs_len, rs_len ) );
  838. MBEDTLS_ASN1_CHK_ADD( len, asn1_write_mpibuf( &p, sig, rs_len ) );
  839. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, sig, len ) );
  840. MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, sig,
  841. MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );
  842. memmove( sig, p, len );
  843. *sig_len = len;
  844. return( 0 );
  845. }
  846. #endif /* MBEDTLS_ECDSA_C */
  847. static int pk_opaque_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,
  848. const unsigned char *hash, size_t hash_len,
  849. unsigned char *sig, size_t sig_size, size_t *sig_len,
  850. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
  851. {
  852. #if !defined(MBEDTLS_ECDSA_C)
  853. ((void) ctx);
  854. ((void) md_alg);
  855. ((void) hash);
  856. ((void) hash_len);
  857. ((void) sig);
  858. ((void) sig_size);
  859. ((void) sig_len);
  860. ((void) f_rng);
  861. ((void) p_rng);
  862. return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );
  863. #else /* !MBEDTLS_ECDSA_C */
  864. const psa_key_id_t *key = (const psa_key_id_t *) ctx;
  865. psa_algorithm_t alg = PSA_ALG_ECDSA( mbedtls_psa_translate_md( md_alg ) );
  866. psa_status_t status;
  867. /* PSA has its own RNG */
  868. (void) f_rng;
  869. (void) p_rng;
  870. /* make the signature */
  871. status = psa_sign_hash( *key, alg, hash, hash_len,
  872. sig, sig_size, sig_len );
  873. if( status != PSA_SUCCESS )
  874. return( mbedtls_psa_err_translate_pk( status ) );
  875. /* transcode it to ASN.1 sequence */
  876. return( pk_ecdsa_sig_asn1_from_psa( sig, sig_len, sig_size ) );
  877. #endif /* !MBEDTLS_ECDSA_C */
  878. }
  879. const mbedtls_pk_info_t mbedtls_pk_opaque_info = {
  880. MBEDTLS_PK_OPAQUE,
  881. "Opaque",
  882. pk_opaque_get_bitlen,
  883. pk_opaque_can_do,
  884. NULL, /* verify - will be done later */
  885. pk_opaque_sign_wrap,
  886. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  887. NULL, /* restartable verify - not relevant */
  888. NULL, /* restartable sign - not relevant */
  889. #endif
  890. NULL, /* decrypt - will be done later */
  891. NULL, /* encrypt - will be done later */
  892. NULL, /* check_pair - could be done later or left NULL */
  893. pk_opaque_alloc_wrap,
  894. pk_opaque_free_wrap,
  895. #if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
  896. NULL, /* restart alloc - not relevant */
  897. NULL, /* restart free - not relevant */
  898. #endif
  899. NULL, /* debug - could be done later, or even left NULL */
  900. };
  901. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  902. #endif /* MBEDTLS_PK_C */