SSL export fixes (from Adam Langley).

This commit is contained in:
Ben Laurie
2011-12-13 14:25:11 +00:00
parent 7b467c6b81
commit e87afb1518
5 changed files with 53 additions and 44 deletions

View File

@@ -1119,16 +1119,17 @@ int tls1_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
return(SSL3_MASTER_SECRET_SIZE);
}
int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
const char *label, unsigned int llen, const unsigned char *context,
unsigned int contextlen, int use_context)
int tls1_export_keying_material(SSL *s, unsigned char *out, size_t olen,
const char *label, size_t llen, const unsigned char *context,
size_t contextlen, int use_context)
{
unsigned char *buff;
unsigned char *val = NULL;
unsigned int vallen, currentvalpos, rv;
size_t vallen, currentvalpos;
int rv;
#ifdef KSSL_DEBUG
printf ("tls1_export_keying_material(%p, %p,%d, %s,%d, %p,%d)\n", s, out,olen, label,llen, p,plen);
printf ("tls1_export_keying_material(%p,%p,%d,%s,%d,%p,%d)\n", s, out, olen, label, llen, p, plen);
#endif /* KSSL_DEBUG */
buff = OPENSSL_malloc(olen);
@@ -1140,10 +1141,10 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
* does not create a prohibited label.
*/
vallen = llen + SSL3_RANDOM_SIZE * 2;
if (use_context)
{
vallen += 2 + contextlen;
}
if (use_context)
{
vallen += 2 + contextlen;
}
val = OPENSSL_malloc(vallen);
if (val == NULL) goto err2;
@@ -1155,17 +1156,17 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
memcpy(val + currentvalpos, s->s3->server_random, SSL3_RANDOM_SIZE);
currentvalpos += SSL3_RANDOM_SIZE;
if (use_context)
{
val[currentvalpos] = (contextlen << 8) & 0xff;
currentvalpos++;
val[currentvalpos] = contextlen & 0xff;
currentvalpos++;
if ((contextlen > 0) || (context != NULL))
{
memcpy(val + currentvalpos, context, contextlen);
}
}
if (use_context)
{
val[currentvalpos] = (contextlen >> 8) & 0xff;
currentvalpos++;
val[currentvalpos] = contextlen & 0xff;
currentvalpos++;
if ((contextlen > 0) || (context != NULL))
{
memcpy(val + currentvalpos, context, contextlen);
}
}
/* disallow prohibited labels
* note that SSL3_RANDOM_SIZE > max(prohibited label len) =
@@ -1181,19 +1182,18 @@ int tls1_export_keying_material(SSL *s, unsigned char *out, unsigned int olen,
if (memcmp(val, TLS_MD_KEY_EXPANSION_CONST,
TLS_MD_KEY_EXPANSION_CONST_SIZE) == 0) goto err1;
tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
val, vallen,
NULL, 0,
NULL, 0,
NULL, 0,
NULL, 0,
s->session->master_key,s->session->master_key_length,
out,buff,olen);
rv = tls1_PRF(s->s3->tmp.new_cipher->algorithm2,
val, vallen,
NULL, 0,
NULL, 0,
NULL, 0,
NULL, 0,
s->session->master_key,s->session->master_key_length,
out,buff,olen);
#ifdef KSSL_DEBUG
printf ("tls1_export_keying_material() complete\n");
#endif /* KSSL_DEBUG */
rv = olen;
goto ret;
err1:
SSLerr(SSL_F_TLS1_EXPORT_KEYING_MATERIAL, SSL_R_TLS_ILLEGAL_EXPORTER_LABEL);