psa_crypto_ecp.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. /*
  2. * PSA ECP layer on top of Mbed TLS crypto
  3. */
  4. /*
  5. * Copyright The Mbed TLS Contributors
  6. * SPDX-License-Identifier: Apache-2.0
  7. *
  8. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  9. * not use this file except in compliance with the License.
  10. * You may obtain a copy of the License at
  11. *
  12. * http://www.apache.org/licenses/LICENSE-2.0
  13. *
  14. * Unless required by applicable law or agreed to in writing, software
  15. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  16. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  17. * See the License for the specific language governing permissions and
  18. * limitations under the License.
  19. */
  20. #include "common.h"
  21. #if defined(MBEDTLS_PSA_CRYPTO_C)
  22. #include <psa/crypto.h>
  23. #include "psa_crypto_core.h"
  24. #include "psa_crypto_ecp.h"
  25. #include "psa_crypto_random_impl.h"
  26. #include "psa_crypto_hash.h"
  27. #include <stdlib.h>
  28. #include <string.h>
  29. #include "mbedtls/platform.h"
  30. #if !defined(MBEDTLS_PLATFORM_C)
  31. #define mbedtls_calloc calloc
  32. #define mbedtls_free free
  33. #endif
  34. #include <mbedtls/ecdsa.h>
  35. #include <mbedtls/ecp.h>
  36. #include <mbedtls/error.h>
  37. #if ( defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \
  38. ( defined(PSA_CRYPTO_DRIVER_TEST) && \
  39. defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) ) )
  40. #define BUILTIN_KEY_TYPE_ECC_KEY_PAIR 1
  41. #endif
  42. #if ( defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || \
  43. ( defined(PSA_CRYPTO_DRIVER_TEST) && \
  44. defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY) ) )
  45. #define BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY 1
  46. #endif
  47. #if ( defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
  48. ( defined(PSA_CRYPTO_DRIVER_TEST) && \
  49. defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) && \
  50. defined(MBEDTLS_ECDSA_C) ) )
  51. #define BUILTIN_ALG_ECDSA 1
  52. #endif
  53. #if ( defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) || \
  54. ( defined(PSA_CRYPTO_DRIVER_TEST) && \
  55. defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) && \
  56. defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECDSA_DETERMINISTIC) ) )
  57. #define BUILTIN_ALG_DETERMINISTIC_ECDSA 1
  58. #endif
  59. #if defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \
  60. defined(BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) || \
  61. defined(BUILTIN_ALG_ECDSA) || \
  62. defined(BUILTIN_ALG_DETERMINISTIC_ECDSA) || \
  63. defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH)
  64. psa_status_t mbedtls_psa_ecp_load_representation(
  65. psa_key_type_t type, size_t curve_bits,
  66. const uint8_t *data, size_t data_length,
  67. mbedtls_ecp_keypair **p_ecp )
  68. {
  69. mbedtls_ecp_group_id grp_id = MBEDTLS_ECP_DP_NONE;
  70. psa_status_t status;
  71. mbedtls_ecp_keypair *ecp = NULL;
  72. size_t curve_bytes = data_length;
  73. int explicit_bits = ( curve_bits != 0 );
  74. if( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) &&
  75. PSA_KEY_TYPE_ECC_GET_FAMILY( type ) != PSA_ECC_FAMILY_MONTGOMERY )
  76. {
  77. /* A Weierstrass public key is represented as:
  78. * - The byte 0x04;
  79. * - `x_P` as a `ceiling(m/8)`-byte string, big-endian;
  80. * - `y_P` as a `ceiling(m/8)`-byte string, big-endian.
  81. * So its data length is 2m+1 where m is the curve size in bits.
  82. */
  83. if( ( data_length & 1 ) == 0 )
  84. return( PSA_ERROR_INVALID_ARGUMENT );
  85. curve_bytes = data_length / 2;
  86. /* Montgomery public keys are represented in compressed format, meaning
  87. * their curve_bytes is equal to the amount of input. */
  88. /* Private keys are represented in uncompressed private random integer
  89. * format, meaning their curve_bytes is equal to the amount of input. */
  90. }
  91. if( explicit_bits )
  92. {
  93. /* With an explicit bit-size, the data must have the matching length. */
  94. if( curve_bytes != PSA_BITS_TO_BYTES( curve_bits ) )
  95. return( PSA_ERROR_INVALID_ARGUMENT );
  96. }
  97. else
  98. {
  99. /* We need to infer the bit-size from the data. Since the only
  100. * information we have is the length in bytes, the value of curve_bits
  101. * at this stage is rounded up to the nearest multiple of 8. */
  102. curve_bits = PSA_BYTES_TO_BITS( curve_bytes );
  103. }
  104. /* Allocate and initialize a key representation. */
  105. ecp = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );
  106. if( ecp == NULL )
  107. return( PSA_ERROR_INSUFFICIENT_MEMORY );
  108. mbedtls_ecp_keypair_init( ecp );
  109. /* Load the group. */
  110. grp_id = mbedtls_ecc_group_of_psa( PSA_KEY_TYPE_ECC_GET_FAMILY( type ),
  111. curve_bits, !explicit_bits );
  112. if( grp_id == MBEDTLS_ECP_DP_NONE )
  113. {
  114. /* We can't distinguish between a nonsensical family/size combination
  115. * (which would warrant PSA_ERROR_INVALID_ARGUMENT) and a
  116. * well-regarded curve that Mbed TLS just doesn't know about (which
  117. * would warrant PSA_ERROR_NOT_SUPPORTED). For uniformity with how
  118. * curves that Mbed TLS knows about but for which support is disabled
  119. * at build time, return NOT_SUPPORTED. */
  120. status = PSA_ERROR_NOT_SUPPORTED;
  121. goto exit;
  122. }
  123. status = mbedtls_to_psa_error(
  124. mbedtls_ecp_group_load( &ecp->grp, grp_id ) );
  125. if( status != PSA_SUCCESS )
  126. goto exit;
  127. /* Load the key material. */
  128. if( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
  129. {
  130. /* Load the public value. */
  131. status = mbedtls_to_psa_error(
  132. mbedtls_ecp_point_read_binary( &ecp->grp, &ecp->Q,
  133. data,
  134. data_length ) );
  135. if( status != PSA_SUCCESS )
  136. goto exit;
  137. /* Check that the point is on the curve. */
  138. status = mbedtls_to_psa_error(
  139. mbedtls_ecp_check_pubkey( &ecp->grp, &ecp->Q ) );
  140. if( status != PSA_SUCCESS )
  141. goto exit;
  142. }
  143. else
  144. {
  145. /* Load and validate the secret value. */
  146. status = mbedtls_to_psa_error(
  147. mbedtls_ecp_read_key( ecp->grp.id,
  148. ecp,
  149. data,
  150. data_length ) );
  151. if( status != PSA_SUCCESS )
  152. goto exit;
  153. }
  154. *p_ecp = ecp;
  155. exit:
  156. if( status != PSA_SUCCESS )
  157. {
  158. mbedtls_ecp_keypair_free( ecp );
  159. mbedtls_free( ecp );
  160. }
  161. return( status );
  162. }
  163. #endif /* defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR) ||
  164. * defined(BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) ||
  165. * defined(BUILTIN_ALG_ECDSA) ||
  166. * defined(BUILTIN_ALG_DETERMINISTIC_ECDSA) ||
  167. * defined(MBEDTLS_PSA_BUILTIN_ALG_ECDH) */
  168. #if defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \
  169. defined(BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY)
  170. static psa_status_t ecp_import_key(
  171. const psa_key_attributes_t *attributes,
  172. const uint8_t *data, size_t data_length,
  173. uint8_t *key_buffer, size_t key_buffer_size,
  174. size_t *key_buffer_length, size_t *bits )
  175. {
  176. psa_status_t status;
  177. mbedtls_ecp_keypair *ecp = NULL;
  178. /* Parse input */
  179. status = mbedtls_psa_ecp_load_representation( attributes->core.type,
  180. attributes->core.bits,
  181. data,
  182. data_length,
  183. &ecp );
  184. if( status != PSA_SUCCESS )
  185. goto exit;
  186. if( PSA_KEY_TYPE_ECC_GET_FAMILY( attributes->core.type ) ==
  187. PSA_ECC_FAMILY_MONTGOMERY )
  188. *bits = ecp->grp.nbits + 1;
  189. else
  190. *bits = ecp->grp.nbits;
  191. /* Re-export the data to PSA export format. There is currently no support
  192. * for other input formats then the export format, so this is a 1-1
  193. * copy operation. */
  194. status = mbedtls_psa_ecp_export_key( attributes->core.type,
  195. ecp,
  196. key_buffer,
  197. key_buffer_size,
  198. key_buffer_length );
  199. exit:
  200. /* Always free the PK object (will also free contained ECP context) */
  201. mbedtls_ecp_keypair_free( ecp );
  202. mbedtls_free( ecp );
  203. return( status );
  204. }
  205. psa_status_t mbedtls_psa_ecp_export_key( psa_key_type_t type,
  206. mbedtls_ecp_keypair *ecp,
  207. uint8_t *data,
  208. size_t data_size,
  209. size_t *data_length )
  210. {
  211. psa_status_t status;
  212. if( PSA_KEY_TYPE_IS_PUBLIC_KEY( type ) )
  213. {
  214. /* Check whether the public part is loaded */
  215. if( mbedtls_ecp_is_zero( &ecp->Q ) )
  216. {
  217. /* Calculate the public key */
  218. status = mbedtls_to_psa_error(
  219. mbedtls_ecp_mul( &ecp->grp, &ecp->Q, &ecp->d, &ecp->grp.G,
  220. mbedtls_psa_get_random,
  221. MBEDTLS_PSA_RANDOM_STATE ) );
  222. if( status != PSA_SUCCESS )
  223. return( status );
  224. }
  225. status = mbedtls_to_psa_error(
  226. mbedtls_ecp_point_write_binary( &ecp->grp, &ecp->Q,
  227. MBEDTLS_ECP_PF_UNCOMPRESSED,
  228. data_length,
  229. data,
  230. data_size ) );
  231. if( status != PSA_SUCCESS )
  232. memset( data, 0, data_size );
  233. return( status );
  234. }
  235. else
  236. {
  237. if( data_size < PSA_BITS_TO_BYTES( ecp->grp.nbits ) )
  238. return( PSA_ERROR_BUFFER_TOO_SMALL );
  239. status = mbedtls_to_psa_error(
  240. mbedtls_ecp_write_key( ecp,
  241. data,
  242. PSA_BITS_TO_BYTES( ecp->grp.nbits ) ) );
  243. if( status == PSA_SUCCESS )
  244. *data_length = PSA_BITS_TO_BYTES( ecp->grp.nbits );
  245. else
  246. memset( data, 0, data_size );
  247. return( status );
  248. }
  249. }
  250. static psa_status_t ecp_export_public_key(
  251. const psa_key_attributes_t *attributes,
  252. const uint8_t *key_buffer, size_t key_buffer_size,
  253. uint8_t *data, size_t data_size, size_t *data_length )
  254. {
  255. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  256. mbedtls_ecp_keypair *ecp = NULL;
  257. status = mbedtls_psa_ecp_load_representation(
  258. attributes->core.type, attributes->core.bits,
  259. key_buffer, key_buffer_size, &ecp );
  260. if( status != PSA_SUCCESS )
  261. return( status );
  262. status = mbedtls_psa_ecp_export_key(
  263. PSA_KEY_TYPE_ECC_PUBLIC_KEY(
  264. PSA_KEY_TYPE_ECC_GET_FAMILY( attributes->core.type ) ),
  265. ecp, data, data_size, data_length );
  266. mbedtls_ecp_keypair_free( ecp );
  267. mbedtls_free( ecp );
  268. return( status );
  269. }
  270. #endif /* defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR) ||
  271. * defined(BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */
  272. #if defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR)
  273. static psa_status_t ecp_generate_key(
  274. const psa_key_attributes_t *attributes,
  275. uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
  276. {
  277. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  278. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  279. psa_ecc_family_t curve = PSA_KEY_TYPE_ECC_GET_FAMILY(
  280. attributes->core.type );
  281. mbedtls_ecp_group_id grp_id =
  282. mbedtls_ecc_group_of_psa( curve, attributes->core.bits, 0 );
  283. const mbedtls_ecp_curve_info *curve_info =
  284. mbedtls_ecp_curve_info_from_grp_id( grp_id );
  285. mbedtls_ecp_keypair ecp;
  286. if( attributes->domain_parameters_size != 0 )
  287. return( PSA_ERROR_NOT_SUPPORTED );
  288. if( grp_id == MBEDTLS_ECP_DP_NONE || curve_info == NULL )
  289. return( PSA_ERROR_NOT_SUPPORTED );
  290. mbedtls_ecp_keypair_init( &ecp );
  291. ret = mbedtls_ecp_gen_key( grp_id, &ecp,
  292. mbedtls_psa_get_random,
  293. MBEDTLS_PSA_RANDOM_STATE );
  294. if( ret != 0 )
  295. {
  296. mbedtls_ecp_keypair_free( &ecp );
  297. return( mbedtls_to_psa_error( ret ) );
  298. }
  299. status = mbedtls_to_psa_error(
  300. mbedtls_ecp_write_key( &ecp, key_buffer, key_buffer_size ) );
  301. mbedtls_ecp_keypair_free( &ecp );
  302. if( status == PSA_SUCCESS )
  303. *key_buffer_length = key_buffer_size;
  304. return( status );
  305. }
  306. #endif /* defined(BUILTIN_KEY_TYPE_ECC_KEY_PAIR) */
  307. /****************************************************************/
  308. /* ECDSA sign/verify */
  309. /****************************************************************/
  310. #if defined(BUILTIN_ALG_ECDSA) || \
  311. defined(BUILTIN_ALG_DETERMINISTIC_ECDSA)
  312. static psa_status_t ecdsa_sign_hash(
  313. const psa_key_attributes_t *attributes,
  314. const uint8_t *key_buffer, size_t key_buffer_size,
  315. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  316. uint8_t *signature, size_t signature_size, size_t *signature_length )
  317. {
  318. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  319. mbedtls_ecp_keypair *ecp = NULL;
  320. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  321. size_t curve_bytes;
  322. mbedtls_mpi r, s;
  323. status = mbedtls_psa_ecp_load_representation( attributes->core.type,
  324. attributes->core.bits,
  325. key_buffer,
  326. key_buffer_size,
  327. &ecp );
  328. if( status != PSA_SUCCESS )
  329. return( status );
  330. curve_bytes = PSA_BITS_TO_BYTES( ecp->grp.pbits );
  331. mbedtls_mpi_init( &r );
  332. mbedtls_mpi_init( &s );
  333. if( signature_size < 2 * curve_bytes )
  334. {
  335. ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;
  336. goto cleanup;
  337. }
  338. if( PSA_ALG_ECDSA_IS_DETERMINISTIC( alg ) )
  339. {
  340. #if defined(BUILTIN_ALG_DETERMINISTIC_ECDSA)
  341. psa_algorithm_t hash_alg = PSA_ALG_SIGN_GET_HASH( alg );
  342. const mbedtls_md_info_t *md_info = mbedtls_md_info_from_psa( hash_alg );
  343. mbedtls_md_type_t md_alg = mbedtls_md_get_type( md_info );
  344. MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign_det_ext(
  345. &ecp->grp, &r, &s,
  346. &ecp->d, hash,
  347. hash_length, md_alg,
  348. mbedtls_psa_get_random,
  349. MBEDTLS_PSA_RANDOM_STATE ) );
  350. #else
  351. ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE;
  352. goto cleanup;
  353. #endif /* defined(BUILTIN_ALG_DETERMINISTIC_ECDSA) */
  354. }
  355. else
  356. {
  357. (void) alg;
  358. MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ecp->grp, &r, &s, &ecp->d,
  359. hash, hash_length,
  360. mbedtls_psa_get_random,
  361. MBEDTLS_PSA_RANDOM_STATE ) );
  362. }
  363. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &r,
  364. signature,
  365. curve_bytes ) );
  366. MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &s,
  367. signature + curve_bytes,
  368. curve_bytes ) );
  369. cleanup:
  370. mbedtls_mpi_free( &r );
  371. mbedtls_mpi_free( &s );
  372. if( ret == 0 )
  373. *signature_length = 2 * curve_bytes;
  374. mbedtls_ecp_keypair_free( ecp );
  375. mbedtls_free( ecp );
  376. return( mbedtls_to_psa_error( ret ) );
  377. }
  378. static psa_status_t ecdsa_verify_hash(
  379. const psa_key_attributes_t *attributes,
  380. const uint8_t *key_buffer, size_t key_buffer_size,
  381. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  382. const uint8_t *signature, size_t signature_length )
  383. {
  384. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  385. mbedtls_ecp_keypair *ecp = NULL;
  386. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  387. size_t curve_bytes;
  388. mbedtls_mpi r, s;
  389. (void)alg;
  390. status = mbedtls_psa_ecp_load_representation( attributes->core.type,
  391. attributes->core.bits,
  392. key_buffer,
  393. key_buffer_size,
  394. &ecp );
  395. if( status != PSA_SUCCESS )
  396. return( status );
  397. curve_bytes = PSA_BITS_TO_BYTES( ecp->grp.pbits );
  398. mbedtls_mpi_init( &r );
  399. mbedtls_mpi_init( &s );
  400. if( signature_length != 2 * curve_bytes )
  401. {
  402. ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;
  403. goto cleanup;
  404. }
  405. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r,
  406. signature,
  407. curve_bytes ) );
  408. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &s,
  409. signature + curve_bytes,
  410. curve_bytes ) );
  411. /* Check whether the public part is loaded. If not, load it. */
  412. if( mbedtls_ecp_is_zero( &ecp->Q ) )
  413. {
  414. MBEDTLS_MPI_CHK(
  415. mbedtls_ecp_mul( &ecp->grp, &ecp->Q, &ecp->d, &ecp->grp.G,
  416. mbedtls_psa_get_random, MBEDTLS_PSA_RANDOM_STATE ) );
  417. }
  418. ret = mbedtls_ecdsa_verify( &ecp->grp, hash, hash_length,
  419. &ecp->Q, &r, &s );
  420. cleanup:
  421. mbedtls_mpi_free( &r );
  422. mbedtls_mpi_free( &s );
  423. mbedtls_ecp_keypair_free( ecp );
  424. mbedtls_free( ecp );
  425. return( mbedtls_to_psa_error( ret ) );
  426. }
  427. #endif /* defined(BUILTIN_ALG_ECDSA) || \
  428. * defined(BUILTIN_ALG_DETERMINISTIC_ECDSA) */
  429. #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) || \
  430. defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY)
  431. psa_status_t mbedtls_psa_ecp_import_key(
  432. const psa_key_attributes_t *attributes,
  433. const uint8_t *data, size_t data_length,
  434. uint8_t *key_buffer, size_t key_buffer_size,
  435. size_t *key_buffer_length, size_t *bits )
  436. {
  437. return( ecp_import_key( attributes, data, data_length,
  438. key_buffer, key_buffer_size,
  439. key_buffer_length, bits ) );
  440. }
  441. psa_status_t mbedtls_psa_ecp_export_public_key(
  442. const psa_key_attributes_t *attributes,
  443. const uint8_t *key_buffer, size_t key_buffer_size,
  444. uint8_t *data, size_t data_size, size_t *data_length )
  445. {
  446. return( ecp_export_public_key( attributes, key_buffer, key_buffer_size,
  447. data, data_size, data_length ) );
  448. }
  449. #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) ||
  450. * defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_PUBLIC_KEY) */
  451. #if defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR)
  452. psa_status_t mbedtls_psa_ecp_generate_key(
  453. const psa_key_attributes_t *attributes,
  454. uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
  455. {
  456. return( ecp_generate_key( attributes, key_buffer, key_buffer_size,
  457. key_buffer_length ) );
  458. }
  459. #endif /* defined(MBEDTLS_PSA_BUILTIN_KEY_TYPE_ECC_KEY_PAIR) */
  460. #if defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) || \
  461. defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA)
  462. psa_status_t mbedtls_psa_ecdsa_sign_hash(
  463. const psa_key_attributes_t *attributes,
  464. const uint8_t *key_buffer, size_t key_buffer_size,
  465. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  466. uint8_t *signature, size_t signature_size, size_t *signature_length )
  467. {
  468. return( ecdsa_sign_hash( attributes,
  469. key_buffer, key_buffer_size,
  470. alg, hash, hash_length,
  471. signature, signature_size, signature_length ) );
  472. }
  473. psa_status_t mbedtls_psa_ecdsa_verify_hash(
  474. const psa_key_attributes_t *attributes,
  475. const uint8_t *key_buffer, size_t key_buffer_size,
  476. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  477. const uint8_t *signature, size_t signature_length )
  478. {
  479. return( ecdsa_verify_hash( attributes,
  480. key_buffer, key_buffer_size,
  481. alg, hash, hash_length,
  482. signature, signature_length ) );
  483. }
  484. #endif /* defined(MBEDTLS_PSA_BUILTIN_ALG_ECDSA) ||
  485. * defined(MBEDTLS_PSA_BUILTIN_ALG_DETERMINISTIC_ECDSA) */
  486. /*
  487. * BEYOND THIS POINT, TEST DRIVER ENTRY POINTS ONLY.
  488. */
  489. #if defined(PSA_CRYPTO_DRIVER_TEST)
  490. #if defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) || \
  491. defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY)
  492. psa_status_t mbedtls_test_driver_ecp_import_key(
  493. const psa_key_attributes_t *attributes,
  494. const uint8_t *data, size_t data_length,
  495. uint8_t *key_buffer, size_t key_buffer_size,
  496. size_t *key_buffer_length, size_t *bits )
  497. {
  498. return( ecp_import_key( attributes, data, data_length,
  499. key_buffer, key_buffer_size,
  500. key_buffer_length, bits ) );
  501. }
  502. psa_status_t mbedtls_test_driver_ecp_export_public_key(
  503. const psa_key_attributes_t *attributes,
  504. const uint8_t *key_buffer, size_t key_buffer_size,
  505. uint8_t *data, size_t data_size, size_t *data_length )
  506. {
  507. return( ecp_export_public_key( attributes, key_buffer, key_buffer_size,
  508. data, data_size, data_length ) );
  509. }
  510. #endif /* defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) ||
  511. defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY) */
  512. #if defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) && \
  513. defined(MBEDTLS_GENPRIME)
  514. psa_status_t mbedtls_transparent_test_driver_ecp_generate_key(
  515. const psa_key_attributes_t *attributes,
  516. uint8_t *key_buffer, size_t key_buffer_size, size_t *key_buffer_length )
  517. {
  518. return( ecp_generate_key( attributes, key_buffer, key_buffer_size,
  519. key_buffer_length ) );
  520. }
  521. #endif /* defined(MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR) &&
  522. defined(MBEDTLS_GENPRIME) */
  523. #if defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) || \
  524. defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA)
  525. psa_status_t mbedtls_transparent_test_driver_ecdsa_sign_hash(
  526. const psa_key_attributes_t *attributes,
  527. const uint8_t *key_buffer, size_t key_buffer_size,
  528. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  529. uint8_t *signature, size_t signature_size, size_t *signature_length )
  530. {
  531. #if defined(MBEDTLS_ECDSA_C)
  532. return( ecdsa_sign_hash( attributes,
  533. key_buffer, key_buffer_size,
  534. alg, hash, hash_length,
  535. signature, signature_size, signature_length ) );
  536. #else
  537. (void)attributes;
  538. (void)key_buffer;
  539. (void)key_buffer_size;
  540. (void)alg;
  541. (void)hash;
  542. (void)hash_length;
  543. (void)signature;
  544. (void)signature_size;
  545. (void)signature_length;
  546. return( PSA_ERROR_NOT_SUPPORTED );
  547. #endif
  548. }
  549. psa_status_t mbedtls_transparent_test_driver_ecdsa_verify_hash(
  550. const psa_key_attributes_t *attributes,
  551. const uint8_t *key_buffer, size_t key_buffer_size,
  552. psa_algorithm_t alg, const uint8_t *hash, size_t hash_length,
  553. const uint8_t *signature, size_t signature_length )
  554. {
  555. #if defined(MBEDTLS_ECDSA_C)
  556. return( ecdsa_verify_hash( attributes,
  557. key_buffer, key_buffer_size,
  558. alg, hash, hash_length,
  559. signature, signature_length ) );
  560. #else
  561. (void)attributes;
  562. (void)key_buffer;
  563. (void)key_buffer_size;
  564. (void)alg;
  565. (void)hash;
  566. (void)hash_length;
  567. (void)signature;
  568. (void)signature_length;
  569. return( PSA_ERROR_NOT_SUPPORTED );
  570. #endif
  571. }
  572. #endif /* defined(MBEDTLS_PSA_ACCEL_ALG_ECDSA) ||
  573. * defined(MBEDTLS_PSA_ACCEL_ALG_DETERMINISTIC_ECDSA) */
  574. #endif /* PSA_CRYPTO_DRIVER_TEST */
  575. #endif /* MBEDTLS_PSA_CRYPTO_C */