31 #if !defined(POLARSSL_CONFIG_FILE)
34 #include POLARSSL_CONFIG_FILE
37 #if defined(POLARSSL_DHM_C)
41 #if defined(POLARSSL_PEM_PARSE_C)
45 #if defined(POLARSSL_ASN1_PARSE_C)
49 #if defined(POLARSSL_PLATFORM_C)
53 #define polarssl_printf printf
54 #define polarssl_malloc malloc
55 #define polarssl_free free
59 static void polarssl_zeroize(
void *v,
size_t n ) {
60 volatile unsigned char *p = v;
while( n-- ) *p++ = 0;
66 static int dhm_read_bignum(
mpi *X,
68 const unsigned char *end )
75 n = ( (*p)[0] << 8 ) | (*p)[1];
78 if( (
int)( end - *p ) < n )
98 static int dhm_check_range(
const mpi *param,
const mpi *P )
129 const unsigned char *end )
133 if( ( ret = dhm_read_bignum( &ctx->
P, p, end ) ) != 0 ||
134 ( ret = dhm_read_bignum( &ctx->
G, p, end ) ) != 0 ||
135 ( ret = dhm_read_bignum( &ctx->
GY, p, end ) ) != 0 )
138 if( ( ret = dhm_check_range( &ctx->
GY, &ctx->
P ) ) != 0 )
150 unsigned char *output,
size_t *olen,
151 int (*f_rng)(
void *,
unsigned char *,
size_t),
174 while( dhm_check_range( &ctx->
X, &ctx->
P ) != 0 );
180 &ctx->
P , &ctx->
RP ) );
182 if( ( ret = dhm_check_range( &ctx->
GX, &ctx->
P ) ) != 0 )
188 #define DHM_MPI_EXPORT(X,n) \
189 MPI_CHK( mpi_write_binary( X, p + 2, n ) ); \
190 *p++ = (unsigned char)( n >> 8 ); \
191 *p++ = (unsigned char)( n ); p += n;
198 DHM_MPI_EXPORT( &ctx->
P , n1 );
199 DHM_MPI_EXPORT( &ctx->
G , n2 );
200 DHM_MPI_EXPORT( &ctx->
GX, n3 );
218 const unsigned char *input,
size_t ilen )
222 if( ctx == NULL || ilen < 1 || ilen > ctx->
len )
235 unsigned char *output,
size_t olen,
236 int (*f_rng)(
void *,
unsigned char *,
size_t),
241 if( ctx == NULL || olen < 1 || olen > ctx->
len )
260 while( dhm_check_range( &ctx->
X, &ctx->
P ) != 0 );
263 &ctx->
P , &ctx->
RP ) );
265 if( ( ret = dhm_check_range( &ctx->
GX, &ctx->
P ) ) != 0 )
285 int (*f_rng)(
void *,
unsigned char *,
size_t),
void *p_rng )
347 unsigned char *output,
size_t *olen,
348 int (*f_rng)(
void *,
unsigned char *,
size_t),
354 if( ctx == NULL || *olen < ctx->len )
357 if( ( ret = dhm_check_range( &ctx->
GY, &ctx->
P ) ) != 0 )
365 MPI_CHK( dhm_update_blinding( ctx, f_rng, p_rng ) );
374 &ctx->
P, &ctx->
RP ) );
409 #if defined(POLARSSL_ASN1_PARSE_C)
418 unsigned char *p, *end;
419 #if defined(POLARSSL_PEM_PARSE_C)
424 ret = pem_read_buffer( &pem,
425 "-----BEGIN DH PARAMETERS-----",
426 "-----END DH PARAMETERS-----",
427 dhmin, NULL, 0, &dhminlen );
434 dhminlen = pem.buflen;
439 p = ( ret == 0 ) ? pem.buf : (
unsigned char *) dhmin;
441 p = (
unsigned char *) dhmin;
479 #if defined(POLARSSL_PEM_PARSE_C)
488 #if defined(POLARSSL_FS_IO)
492 static int load_file(
const char *path,
unsigned char **buf,
size_t *n )
497 if( ( f = fopen( path,
"rb" ) ) == NULL )
500 fseek( f, 0, SEEK_END );
501 if( ( size = ftell( f ) ) == -1 )
506 fseek( f, 0, SEEK_SET );
517 if( fread( *buf, 1, *n, f ) != *n )
540 if( ( ret = load_file( path, &buf, &n ) ) != 0 )
545 polarssl_zeroize( buf, n + 1 );
553 #if defined(POLARSSL_SELF_TEST)
562 #if defined(POLARSSL_CERTS_C)
571 if( ( ret =
dhm_parse_dhm( &dhm, (
const unsigned char *) test_dhm_params,
572 strlen( test_dhm_params ) ) ) != 0 )