Make ECDSA restartable sign and verify functions public
Make public the versions of ECSDA sign and verify which return raw signatures rather than returning ASN.1 encoded signatures, in order to use them for the internal implemention of psa_sign/verify_hash_interruptible. Signed-off-by: Paul Elliott <paul.elliott@arm.com>
This commit is contained in:
parent
9fe12f666b
commit
2ba002cc2f
2 changed files with 209 additions and 35 deletions
|
@ -222,6 +222,134 @@ int mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r,
|
||||||
void *p_rng_blind);
|
void *p_rng_blind);
|
||||||
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
||||||
|
|
||||||
|
#if !defined(MBEDTLS_ECDSA_SIGN_ALT)
|
||||||
|
/**
|
||||||
|
* \brief This function computes the ECDSA signature of a
|
||||||
|
* previously-hashed message, in a restartable way.
|
||||||
|
*
|
||||||
|
* \note The deterministic version implemented in
|
||||||
|
* mbedtls_ecdsa_sign_det_restartable() is usually
|
||||||
|
* preferred.
|
||||||
|
*
|
||||||
|
* \note This function is like \c mbedtls_ecdsa_sign() but
|
||||||
|
* it can return early and restart according to the
|
||||||
|
* limit set with \c mbedtls_ecp_set_max_ops() to
|
||||||
|
* reduce blocking.
|
||||||
|
*
|
||||||
|
* \note If the bitlength of the message hash is larger
|
||||||
|
* than the bitlength of the group order, then the
|
||||||
|
* hash is truncated as defined in <em>Standards for
|
||||||
|
* Efficient Cryptography Group (SECG): SEC1 Elliptic
|
||||||
|
* Curve Cryptography</em>, section 4.1.3, step 5.
|
||||||
|
*
|
||||||
|
* \see ecp.h
|
||||||
|
*
|
||||||
|
* \param grp The context for the elliptic curve to use.
|
||||||
|
* This must be initialized and have group parameters
|
||||||
|
* set, for example through mbedtls_ecp_group_load().
|
||||||
|
* \param r The MPI context in which to store the first part
|
||||||
|
* the signature. This must be initialized.
|
||||||
|
* \param s The MPI context in which to store the second part
|
||||||
|
* the signature. This must be initialized.
|
||||||
|
* \param d The private signing key. This must be initialized
|
||||||
|
* and setup, for example through
|
||||||
|
* mbedtls_ecp_gen_privkey().
|
||||||
|
* \param buf The hashed content to be signed. This must be a readable
|
||||||
|
* buffer of length \p blen Bytes. It may be \c NULL if
|
||||||
|
* \p blen is zero.
|
||||||
|
* \param blen The length of \p buf in Bytes.
|
||||||
|
* \param f_rng The RNG function. This must not be \c NULL.
|
||||||
|
* \param p_rng The RNG context to be passed to \p f_rng. This may be
|
||||||
|
* \c NULL if \p f_rng doesn't need a context parameter.
|
||||||
|
* \param f_rng_blind The RNG function used for blinding. This must not be
|
||||||
|
* \c NULL.
|
||||||
|
* \param p_rng_blind The RNG context to be passed to \p f_rng. This may be
|
||||||
|
* \c NULL if \p f_rng doesn't need a context parameter.
|
||||||
|
* \param rs_ctx The restart context to use. This may be \c NULL
|
||||||
|
* to disable restarting. If it is not \c NULL, it
|
||||||
|
* must point to an initialized restart context.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
|
||||||
|
* operations was reached: see \c
|
||||||
|
* mbedtls_ecp_set_max_ops().
|
||||||
|
* \return Another \c MBEDTLS_ERR_ECP_XXX, \c
|
||||||
|
* MBEDTLS_ERR_MPI_XXX or \c MBEDTLS_ERR_ASN1_XXX
|
||||||
|
* error code on failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ecdsa_sign_restartable(
|
||||||
|
mbedtls_ecp_group *grp,
|
||||||
|
mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
|
const mbedtls_mpi *d,
|
||||||
|
const unsigned char *buf, size_t blen,
|
||||||
|
int (*f_rng)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng,
|
||||||
|
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng_blind,
|
||||||
|
mbedtls_ecdsa_restart_ctx *rs_ctx);
|
||||||
|
|
||||||
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief This function computes the ECDSA signature of a
|
||||||
|
* previously-hashed message, in a restartable way.
|
||||||
|
*
|
||||||
|
* \note This function is like \c
|
||||||
|
* mbedtls_ecdsa_sign_det_ext() but it can return
|
||||||
|
* early and restart according to the limit set with
|
||||||
|
* \c mbedtls_ecp_set_max_ops() to reduce blocking.
|
||||||
|
*
|
||||||
|
* \note If the bitlength of the message hash is larger
|
||||||
|
* than the bitlength of the group order, then the
|
||||||
|
* hash is truncated as defined in <em>Standards for
|
||||||
|
* Efficient Cryptography Group (SECG): SEC1 Elliptic
|
||||||
|
* Curve Cryptography</em>, section 4.1.3, step 5.
|
||||||
|
*
|
||||||
|
* \see ecp.h
|
||||||
|
*
|
||||||
|
* \param grp The context for the elliptic curve to use.
|
||||||
|
* This must be initialized and have group parameters
|
||||||
|
* set, for example through mbedtls_ecp_group_load().
|
||||||
|
* \param r The MPI context in which to store the first part
|
||||||
|
* the signature. This must be initialized.
|
||||||
|
* \param s The MPI context in which to store the second part
|
||||||
|
* the signature. This must be initialized.
|
||||||
|
* \param d The private signing key. This must be initialized
|
||||||
|
* and setup, for example through
|
||||||
|
* mbedtls_ecp_gen_privkey().
|
||||||
|
* \param buf The hashed content to be signed. This must be a readable
|
||||||
|
* buffer of length \p blen Bytes. It may be \c NULL if
|
||||||
|
* \p blen is zero.
|
||||||
|
* \param blen The length of \p buf in Bytes.
|
||||||
|
* \param f_rng_blind The RNG function used for blinding. This must not be
|
||||||
|
* \c NULL.
|
||||||
|
* \param p_rng_blind The RNG context to be passed to \p f_rng. This may be
|
||||||
|
* \c NULL if \p f_rng doesn't need a context parameter.
|
||||||
|
* \param rs_ctx The restart context to use. This may be \c NULL
|
||||||
|
* to disable restarting. If it is not \c NULL, it
|
||||||
|
* must point to an initialized restart context.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
|
||||||
|
* operations was reached: see \c
|
||||||
|
* mbedtls_ecp_set_max_ops().
|
||||||
|
* \return Another \c MBEDTLS_ERR_ECP_XXX, \c
|
||||||
|
* MBEDTLS_ERR_MPI_XXX or \c MBEDTLS_ERR_ASN1_XXX
|
||||||
|
* error code on failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ecdsa_sign_det_restartable(
|
||||||
|
mbedtls_ecp_group *grp,
|
||||||
|
mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
|
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
||||||
|
mbedtls_md_type_t md_alg,
|
||||||
|
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
||||||
|
void *p_rng_blind,
|
||||||
|
mbedtls_ecdsa_restart_ctx *rs_ctx);
|
||||||
|
|
||||||
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
||||||
|
|
||||||
|
#endif /* !MBEDTLS_ECDSA_SIGN_ALT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function verifies the ECDSA signature of a
|
* \brief This function verifies the ECDSA signature of a
|
||||||
* previously-hashed message.
|
* previously-hashed message.
|
||||||
|
@ -257,6 +385,49 @@ int mbedtls_ecdsa_verify(mbedtls_ecp_group *grp,
|
||||||
const mbedtls_ecp_point *Q, const mbedtls_mpi *r,
|
const mbedtls_ecp_point *Q, const mbedtls_mpi *r,
|
||||||
const mbedtls_mpi *s);
|
const mbedtls_mpi *s);
|
||||||
|
|
||||||
|
#if !defined(MBEDTLS_ECDSA_VERIFY_ALT)
|
||||||
|
/**
|
||||||
|
* \brief This function verifies the ECDSA signature of a
|
||||||
|
* previously-hashed message, in a restartable manner
|
||||||
|
*
|
||||||
|
* \note If the bitlength of the message hash is larger than the
|
||||||
|
* bitlength of the group order, then the hash is truncated as
|
||||||
|
* defined in <em>Standards for Efficient Cryptography Group
|
||||||
|
* (SECG): SEC1 Elliptic Curve Cryptography</em>, section
|
||||||
|
* 4.1.4, step 3.
|
||||||
|
*
|
||||||
|
* \see ecp.h
|
||||||
|
*
|
||||||
|
* \param grp The ECP group to use.
|
||||||
|
* This must be initialized and have group parameters
|
||||||
|
* set, for example through mbedtls_ecp_group_load().
|
||||||
|
* \param buf The hashed content that was signed. This must be a readable
|
||||||
|
* buffer of length \p blen Bytes. It may be \c NULL if
|
||||||
|
* \p blen is zero.
|
||||||
|
* \param blen The length of \p buf in Bytes.
|
||||||
|
* \param Q The public key to use for verification. This must be
|
||||||
|
* initialized and setup.
|
||||||
|
* \param r The first integer of the signature.
|
||||||
|
* This must be initialized.
|
||||||
|
* \param s The second integer of the signature.
|
||||||
|
* This must be initialized.
|
||||||
|
* \param rs_ctx The restart context to use. This may be \c NULL to disable
|
||||||
|
* restarting. If it is not \c NULL, it must point to an
|
||||||
|
* initialized restart context.
|
||||||
|
*
|
||||||
|
* \return \c 0 on success.
|
||||||
|
* \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX
|
||||||
|
* error code on failure.
|
||||||
|
*/
|
||||||
|
int mbedtls_ecdsa_verify_restartable(mbedtls_ecp_group *grp,
|
||||||
|
const unsigned char *buf, size_t blen,
|
||||||
|
const mbedtls_ecp_point *Q,
|
||||||
|
const mbedtls_mpi *r,
|
||||||
|
const mbedtls_mpi *s,
|
||||||
|
mbedtls_ecdsa_restart_ctx *rs_ctx);
|
||||||
|
|
||||||
|
#endif /* !MBEDTLS_ECDSA_VERIFY_ALT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief This function computes the ECDSA signature and writes it
|
* \brief This function computes the ECDSA signature and writes it
|
||||||
* to a buffer, serialized as defined in <em>RFC-4492:
|
* to a buffer, serialized as defined in <em>RFC-4492:
|
||||||
|
@ -303,6 +474,8 @@ int mbedtls_ecdsa_verify(mbedtls_ecp_group *grp,
|
||||||
* \c NULL if \p f_rng is \c NULL or doesn't use a context.
|
* \c NULL if \p f_rng is \c NULL or doesn't use a context.
|
||||||
*
|
*
|
||||||
* \return \c 0 on success.
|
* \return \c 0 on success.
|
||||||
|
* \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
|
||||||
|
* operations was reached: see \c mbedtls_ecp_set_max_ops().
|
||||||
* \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
|
* \return An \c MBEDTLS_ERR_ECP_XXX, \c MBEDTLS_ERR_MPI_XXX or
|
||||||
* \c MBEDTLS_ERR_ASN1_XXX error code on failure.
|
* \c MBEDTLS_ERR_ASN1_XXX error code on failure.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -239,13 +239,13 @@ cleanup:
|
||||||
* Compute ECDSA signature of a hashed message (SEC1 4.1.3)
|
* Compute ECDSA signature of a hashed message (SEC1 4.1.3)
|
||||||
* Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message)
|
* Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message)
|
||||||
*/
|
*/
|
||||||
static int ecdsa_sign_restartable(mbedtls_ecp_group *grp,
|
int mbedtls_ecdsa_sign_restartable(mbedtls_ecp_group *grp,
|
||||||
mbedtls_mpi *r, mbedtls_mpi *s,
|
mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
||||||
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
|
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
|
||||||
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
||||||
void *p_rng_blind,
|
void *p_rng_blind,
|
||||||
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
||||||
{
|
{
|
||||||
int ret, key_tries, sign_tries;
|
int ret, key_tries, sign_tries;
|
||||||
int *p_sign_tries = &sign_tries, *p_key_tries = &key_tries;
|
int *p_sign_tries = &sign_tries, *p_key_tries = &key_tries;
|
||||||
|
@ -394,8 +394,8 @@ int mbedtls_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
|
int (*f_rng)(void *, unsigned char *, size_t), void *p_rng)
|
||||||
{
|
{
|
||||||
/* Use the same RNG for both blinding and ephemeral key generation */
|
/* Use the same RNG for both blinding and ephemeral key generation */
|
||||||
return ecdsa_sign_restartable(grp, r, s, d, buf, blen,
|
return mbedtls_ecdsa_sign_restartable(grp, r, s, d, buf, blen,
|
||||||
f_rng, p_rng, f_rng, p_rng, NULL);
|
f_rng, p_rng, f_rng, p_rng, NULL);
|
||||||
}
|
}
|
||||||
#endif /* !MBEDTLS_ECDSA_SIGN_ALT */
|
#endif /* !MBEDTLS_ECDSA_SIGN_ALT */
|
||||||
|
|
||||||
|
@ -406,13 +406,13 @@ int mbedtls_ecdsa_sign(mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
* note: The f_rng_blind parameter must not be NULL.
|
* note: The f_rng_blind parameter must not be NULL.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int ecdsa_sign_det_restartable(mbedtls_ecp_group *grp,
|
int mbedtls_ecdsa_sign_det_restartable(mbedtls_ecp_group *grp,
|
||||||
mbedtls_mpi *r, mbedtls_mpi *s,
|
mbedtls_mpi *r, mbedtls_mpi *s,
|
||||||
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
const mbedtls_mpi *d, const unsigned char *buf, size_t blen,
|
||||||
mbedtls_md_type_t md_alg,
|
mbedtls_md_type_t md_alg,
|
||||||
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
int (*f_rng_blind)(void *, unsigned char *, size_t),
|
||||||
void *p_rng_blind,
|
void *p_rng_blind,
|
||||||
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
||||||
{
|
{
|
||||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||||
mbedtls_hmac_drbg_context rng_ctx;
|
mbedtls_hmac_drbg_context rng_ctx;
|
||||||
|
@ -462,9 +462,9 @@ sign:
|
||||||
ret = mbedtls_ecdsa_sign(grp, r, s, d, buf, blen,
|
ret = mbedtls_ecdsa_sign(grp, r, s, d, buf, blen,
|
||||||
mbedtls_hmac_drbg_random, p_rng);
|
mbedtls_hmac_drbg_random, p_rng);
|
||||||
#else
|
#else
|
||||||
ret = ecdsa_sign_restartable(grp, r, s, d, buf, blen,
|
ret = mbedtls_ecdsa_sign_restartable(grp, r, s, d, buf, blen,
|
||||||
mbedtls_hmac_drbg_random, p_rng,
|
mbedtls_hmac_drbg_random, p_rng,
|
||||||
f_rng_blind, p_rng_blind, rs_ctx);
|
f_rng_blind, p_rng_blind, rs_ctx);
|
||||||
#endif /* MBEDTLS_ECDSA_SIGN_ALT */
|
#endif /* MBEDTLS_ECDSA_SIGN_ALT */
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -487,8 +487,8 @@ int mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r,
|
||||||
size_t),
|
size_t),
|
||||||
void *p_rng_blind)
|
void *p_rng_blind)
|
||||||
{
|
{
|
||||||
return ecdsa_sign_det_restartable(grp, r, s, d, buf, blen, md_alg,
|
return mbedtls_ecdsa_sign_det_restartable(grp, r, s, d, buf, blen, md_alg,
|
||||||
f_rng_blind, p_rng_blind, NULL);
|
f_rng_blind, p_rng_blind, NULL);
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
||||||
|
|
||||||
|
@ -497,11 +497,12 @@ int mbedtls_ecdsa_sign_det_ext(mbedtls_ecp_group *grp, mbedtls_mpi *r,
|
||||||
* Verify ECDSA signature of hashed message (SEC1 4.1.4)
|
* Verify ECDSA signature of hashed message (SEC1 4.1.4)
|
||||||
* Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message)
|
* Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message)
|
||||||
*/
|
*/
|
||||||
static int ecdsa_verify_restartable(mbedtls_ecp_group *grp,
|
int mbedtls_ecdsa_verify_restartable(mbedtls_ecp_group *grp,
|
||||||
const unsigned char *buf, size_t blen,
|
const unsigned char *buf, size_t blen,
|
||||||
const mbedtls_ecp_point *Q,
|
const mbedtls_ecp_point *Q,
|
||||||
const mbedtls_mpi *r, const mbedtls_mpi *s,
|
const mbedtls_mpi *r,
|
||||||
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
const mbedtls_mpi *s,
|
||||||
|
mbedtls_ecdsa_restart_ctx *rs_ctx)
|
||||||
{
|
{
|
||||||
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
|
||||||
mbedtls_mpi e, s_inv, u1, u2;
|
mbedtls_mpi e, s_inv, u1, u2;
|
||||||
|
@ -610,7 +611,7 @@ int mbedtls_ecdsa_verify(mbedtls_ecp_group *grp,
|
||||||
const mbedtls_mpi *r,
|
const mbedtls_mpi *r,
|
||||||
const mbedtls_mpi *s)
|
const mbedtls_mpi *s)
|
||||||
{
|
{
|
||||||
return ecdsa_verify_restartable(grp, buf, blen, Q, r, s, NULL);
|
return mbedtls_ecdsa_verify_restartable(grp, buf, blen, Q, r, s, NULL);
|
||||||
}
|
}
|
||||||
#endif /* !MBEDTLS_ECDSA_VERIFY_ALT */
|
#endif /* !MBEDTLS_ECDSA_VERIFY_ALT */
|
||||||
|
|
||||||
|
@ -665,9 +666,9 @@ int mbedtls_ecdsa_write_signature_restartable(mbedtls_ecdsa_context *ctx,
|
||||||
mbedtls_mpi_init(&s);
|
mbedtls_mpi_init(&s);
|
||||||
|
|
||||||
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
#if defined(MBEDTLS_ECDSA_DETERMINISTIC)
|
||||||
MBEDTLS_MPI_CHK(ecdsa_sign_det_restartable(&ctx->grp, &r, &s, &ctx->d,
|
MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign_det_restartable(&ctx->grp, &r, &s, &ctx->d,
|
||||||
hash, hlen, md_alg, f_rng,
|
hash, hlen, md_alg, f_rng,
|
||||||
p_rng, rs_ctx));
|
p_rng, rs_ctx));
|
||||||
#else
|
#else
|
||||||
(void) md_alg;
|
(void) md_alg;
|
||||||
|
|
||||||
|
@ -678,9 +679,9 @@ int mbedtls_ecdsa_write_signature_restartable(mbedtls_ecdsa_context *ctx,
|
||||||
hash, hlen, f_rng, p_rng));
|
hash, hlen, f_rng, p_rng));
|
||||||
#else
|
#else
|
||||||
/* Use the same RNG for both blinding and ephemeral key generation */
|
/* Use the same RNG for both blinding and ephemeral key generation */
|
||||||
MBEDTLS_MPI_CHK(ecdsa_sign_restartable(&ctx->grp, &r, &s, &ctx->d,
|
MBEDTLS_MPI_CHK(mbedtls_ecdsa_sign_restartable(&ctx->grp, &r, &s, &ctx->d,
|
||||||
hash, hlen, f_rng, p_rng, f_rng,
|
hash, hlen, f_rng, p_rng, f_rng,
|
||||||
p_rng, rs_ctx));
|
p_rng, rs_ctx));
|
||||||
#endif /* MBEDTLS_ECDSA_SIGN_ALT */
|
#endif /* MBEDTLS_ECDSA_SIGN_ALT */
|
||||||
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
#endif /* MBEDTLS_ECDSA_DETERMINISTIC */
|
||||||
|
|
||||||
|
@ -760,8 +761,8 @@ int mbedtls_ecdsa_read_signature_restartable(mbedtls_ecdsa_context *ctx,
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if ((ret = ecdsa_verify_restartable(&ctx->grp, hash, hlen,
|
if ((ret = mbedtls_ecdsa_verify_restartable(&ctx->grp, hash, hlen,
|
||||||
&ctx->Q, &r, &s, rs_ctx)) != 0) {
|
&ctx->Q, &r, &s, rs_ctx)) != 0) {
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
#endif /* MBEDTLS_ECDSA_VERIFY_ALT */
|
#endif /* MBEDTLS_ECDSA_VERIFY_ALT */
|
||||||
|
|
Loading…
Reference in a new issue