Skip to content

Commit 2ad5e45

Browse files
Merge pull request #314 from gilles-peskine-arm/pkwrite_ECPrivateKey_size-crypto
Fix pk_write with EC key to use a constant size for the private value
2 parents c82ed6f + 2700cfb commit 2ad5e45

File tree

4 files changed

+44
-3
lines changed

4 files changed

+44
-3
lines changed

library/pkwrite.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
#include "mbedtls/rsa.h"
3939
#endif
4040
#if defined(MBEDTLS_ECP_C)
41+
#include "mbedtls/bignum.h"
4142
#include "mbedtls/ecp.h"
43+
#include "mbedtls/platform_util.h"
4244
#endif
4345
#if defined(MBEDTLS_ECDSA_C)
4446
#include "mbedtls/ecdsa.h"
@@ -154,6 +156,26 @@ static int pk_write_ec_param( unsigned char **p, unsigned char *start,
154156

155157
return( (int) len );
156158
}
159+
160+
/*
161+
* privateKey OCTET STRING -- always of length ceil(log2(n)/8)
162+
*/
163+
static int pk_write_ec_private( unsigned char **p, unsigned char *start,
164+
mbedtls_ecp_keypair *ec )
165+
{
166+
int ret;
167+
size_t byte_length = ( ec->grp.pbits + 7 ) / 8;
168+
unsigned char tmp[MBEDTLS_ECP_MAX_BYTES];
169+
170+
ret = mbedtls_mpi_write_binary( &ec->d, tmp, byte_length );
171+
if( ret != 0 )
172+
goto exit;
173+
ret = mbedtls_asn1_write_octet_string( p, start, tmp, byte_length );
174+
175+
exit:
176+
mbedtls_platform_zeroize( tmp, byte_length );
177+
return( ret );
178+
}
157179
#endif /* MBEDTLS_ECP_C */
158180

159181
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_
424446
MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) );
425447
len += par_len;
426448

427-
/* privateKey: write as MPI then fix tag */
428-
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) );
429-
*c = MBEDTLS_ASN1_OCTET_STRING;
449+
/* privateKey */
450+
MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_private( &c, buf, ec ) );
430451

431452
/* version */
432453
MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) );

tests/data_files/ec_256_long_prv.pem

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MHcCAQEEIIcex4mqXsQamUKTVf8vXmTAJrQvGjh5mXG8p9+OR4xAoAoGCCqGSM49
3+
AwEHoUQDQgAEqJ2HQjPpc6fDwE/vSa6U35USXawkTo98y4U6NsAl+rOGuqMPEFXf
4+
P1Srm/Jrzwa/RuppRL5kgyAsGJTUmwZEzQ==
5+
-----END EC PRIVATE KEY-----

tests/data_files/ec_521_short_prv.pem

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-----BEGIN EC PRIVATE KEY-----
2+
MIHcAgEBBEIAOXdk7W+Hf5L7Hc9fKe44wmpaRNs5ERFTkv5CrlXv/Bu3y28M673q
3+
vBNo7a/UE/6NNQHu2pQODEYFpMg6R34b5SigBwYFK4EEACOhgYkDgYYABAFUMHXV
4+
KPA4vkMgq+pFgDoH96XoM517gF2GJFV6h2gLhykzIHL/otAyEpAStw7MBvbU0V21
5+
ixB+hjqzO7Snxaj9mwB8g87OKxm5eGfsqvJNPdJ0RZ/EKy06Ukg6KThlhQeyrtIk
6+
g5PTCrPnNszlffAy6/jCOe3Moi59g15H13sSzwfX6g==
7+
-----END EC PRIVATE KEY-----

tests/suites/test_suite_pkwrite.data

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,18 @@ Private key write check EC 192 bits
3030
depends_on:MBEDTLS_ECP_C:MBEDTLS_BASE64_C:MBEDTLS_ECP_DP_SECP192R1_ENABLED
3131
pk_write_key_check:"data_files/ec_prv.sec1.pem"
3232

33+
Private key write check EC 256 bits (top bit set)
34+
depends_on:MBEDTLS_ECP_C:MBEDTLS_BASE64_C:MBEDTLS_ECP_DP_SECP256R1_ENABLED
35+
pk_write_key_check:"data_files/ec_256_long_prv.pem"
36+
3337
Private key write check EC 521 bits
3438
depends_on:MBEDTLS_ECP_C:MBEDTLS_BASE64_C:MBEDTLS_ECP_DP_SECP521R1_ENABLED
3539
pk_write_key_check:"data_files/ec_521_prv.pem"
3640

41+
Private key write check EC 521 bits (top byte is 0)
42+
depends_on:MBEDTLS_ECP_C:MBEDTLS_BASE64_C:MBEDTLS_ECP_DP_SECP521R1_ENABLED
43+
pk_write_key_check:"data_files/ec_521_short_prv.pem"
44+
3745
Private key write check EC Brainpool 512 bits
3846
depends_on:MBEDTLS_ECP_C:MBEDTLS_BASE64_C:MBEDTLS_ECP_DP_BP512R1_ENABLED
3947
pk_write_key_check:"data_files/ec_bp512_prv.pem"

0 commit comments

Comments
 (0)