mirror of
https://github.com/yuzu-emu/mbedtls.git
synced 2025-01-11 03:55:31 +00:00
Fix pk_write with an EC key to write a constant-length private value
When writing a private EC key, use a constant size for the private value, as specified in RFC 5915. Previously, the value was written as an ASN.1 INTEGER, which caused the size of the key to leak about 1 bit of information on average, and could cause the value to be 1 byte too large for the output buffer.
This commit is contained in:
parent
c212166171
commit
2700cfbdd5
|
@ -38,7 +38,9 @@
|
||||||
#include "mbedtls/rsa.h"
|
#include "mbedtls/rsa.h"
|
||||||
#endif
|
#endif
|
||||||
#if defined(MBEDTLS_ECP_C)
|
#if defined(MBEDTLS_ECP_C)
|
||||||
|
#include "mbedtls/bignum.h"
|
||||||
#include "mbedtls/ecp.h"
|
#include "mbedtls/ecp.h"
|
||||||
|
#include "mbedtls/platform_util.h"
|
||||||
#endif
|
#endif
|
||||||
#if defined(MBEDTLS_ECDSA_C)
|
#if defined(MBEDTLS_ECDSA_C)
|
||||||
#include "mbedtls/ecdsa.h"
|
#include "mbedtls/ecdsa.h"
|
||||||
|
@ -154,6 +156,26 @@ static int pk_write_ec_param( unsigned char **p, unsigned char *start,
|
||||||
|
|
||||||
return( (int) len );
|
return( (int) len );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* privateKey OCTET STRING -- always of length ceil(log2(n)/8)
|
||||||
|
*/
|
||||||
|
static int pk_write_ec_private( unsigned char **p, unsigned char *start,
|
||||||
|
mbedtls_ecp_keypair *ec )
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
size_t byte_length = ( ec->grp.pbits + 7 ) / 8;
|
||||||
|
unsigned char tmp[MBEDTLS_ECP_MAX_BYTES];
|
||||||
|
|
||||||
|
ret = mbedtls_mpi_write_binary( &ec->d, tmp, byte_length );
|
||||||
|
if( ret != 0 )
|
||||||
|
goto exit;
|
||||||
|
ret = mbedtls_asn1_write_octet_string( p, start, tmp, byte_length );
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mbedtls_platform_zeroize( tmp, byte_length );
|
||||||
|
return( ret );
|
||||||
|
}
|
||||||
#endif /* MBEDTLS_ECP_C */
|
#endif /* MBEDTLS_ECP_C */
|
||||||
|
|
||||||
int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
|
int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
|
||||||
|
@ -424,9 +446,8 @@ int mbedtls_pk_write_key_der( mbedtls_pk_context *key, unsigned char *buf, size_
|
||||||
MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) );
|
MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) );
|
||||||
len += par_len;
|
len += par_len;
|
||||||
|
|
||||||
/* privateKey: write as MPI then fix tag */
|
/* privateKey */
|
||||||
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) );
|
MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_private( &c, buf, ec ) );
|
||||||
*c = MBEDTLS_ASN1_OCTET_STRING;
|
|
||||||
|
|
||||||
/* version */
|
/* version */
|
||||||
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) );
|
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) );
|
||||||
|
|
Loading…
Reference in a new issue