Skip to content

Commit fc6b6b3

Browse files
cameronrichikeyasu
cameronrich
authored andcommitted
Server side v1.2 is basically working
git-svn-id: svn://svn.code.sf.net/p/axtls/code/trunk@265 9a5d90b5-6617-0410-8a86-bb477d3ed2e3
1 parent 09619c9 commit fc6b6b3

File tree

7 files changed

+217
-35
lines changed

7 files changed

+217
-35
lines changed

ssl/crypto_misc.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ const char * x509_display_error(int error);
125125
#define ASN1_EXPLICIT_TAG 0xa0
126126
#define ASN1_V3_DATA 0xa3
127127

128-
#define SIG_TYPE_MD2 0x02
129128
#define SIG_TYPE_MD5 0x04
130129
#define SIG_TYPE_SHA1 0x05
131130
#define SIG_TYPE_SHA256 0x0b

ssl/ssl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ extern "C" {
100100
#define SSL_ERROR_UNSUPPORTED_EXTENSION -264
101101
#define SSL_ERROR_INVALID_SESSION -265
102102
#define SSL_ERROR_NO_CIPHER -266
103+
#define SSL_ERROR_INVALID_CERT_HASH_ALG -267
103104
#define SSL_ERROR_BAD_CERTIFICATE -268
104105
#define SSL_ERROR_INVALID_KEY -269
105106
#define SSL_ERROR_FINISHED_INVALID -271

ssl/tls1.c

Lines changed: 74 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ static void *crypt_new(SSL *ssl, uint8_t *key, uint8_t *iv, int is_decrypt, void
5454
static int send_raw_packet(SSL *ssl, uint8_t protocol);
5555
static void certificate_free(SSL* ssl);
5656
static int increase_bm_data_size(SSL *ssl, size_t size);
57+
static int check_certificate_chain(SSL *ssl);
5758

5859
/**
5960
* The server will pick the cipher based on the order that the order that the
@@ -348,6 +349,26 @@ int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len)
348349
ssl_cert = &ssl_ctx->certs[i];
349350
ssl_cert->size = len;
350351
ssl_cert->buf = (uint8_t *)malloc(len);
352+
353+
switch (cert->sig_type)
354+
{
355+
case SIG_TYPE_SHA1:
356+
ssl_cert->hash_alg = SIG_ALG_SHA1;
357+
break;
358+
359+
case SIG_TYPE_SHA256:
360+
ssl_cert->hash_alg = SIG_ALG_SHA256;
361+
break;
362+
363+
case SIG_TYPE_SHA384:
364+
ssl_cert->hash_alg = SIG_ALG_SHA384;
365+
break;
366+
367+
case SIG_TYPE_SHA512:
368+
ssl_cert->hash_alg = SIG_ALG_SHA512;
369+
break;
370+
}
371+
351372
memcpy(ssl_cert->buf, buf, len);
352373
ssl_ctx->chain_length++;
353374
len -= offset;
@@ -742,18 +763,10 @@ void add_packet(SSL *ssl, const uint8_t *pkt, int len)
742763
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2 || ssl->version == 0)
743764
{
744765
SHA256_Update(&ssl->dc->sha256_ctx, pkt, len);
745-
#if 0
746-
uint8_t buf[128];
747-
SHA256_CTX sha256_ctx = ssl->dc->sha256_ctx; // interim copy
748-
SHA256_Final(buf, &sha256_ctx);
749-
print_blob("handshake", buf, 8);
750-
#endif
751-
752766
}
753767

754-
if (ssl->version < SSL_PROTOCOL_VERSION_TLS1_2 || ssl->version == 0)
768+
if (ssl->version < SSL_PROTOCOL_VERSION_TLS1_2)
755769
{
756-
uint8_t q[128];
757770
MD5_Update(&ssl->dc->md5_ctx, pkt, len);
758771
SHA1_Update(&ssl->dc->sha1_ctx, pkt, len);
759772
}
@@ -1641,6 +1654,7 @@ int send_alert(SSL *ssl, int error_code)
16411654
break;
16421655

16431656
case SSL_X509_ERROR(X509_VFY_ERROR_UNSUPPORTED_DIGEST):
1657+
case SSL_ERROR_INVALID_CERT_HASH_ALG:
16441658
alert_num = SSL_ALERT_UNSUPPORTED_CERTIFICATE;
16451659
break;
16461660

@@ -1699,6 +1713,7 @@ int process_finished(SSL *ssl, uint8_t *buf, int hs_len)
16991713
*/
17001714
int send_certificate(SSL *ssl)
17011715
{
1716+
int ret = SSL_OK;
17021717
int i = 0;
17031718
uint8_t *buf = ssl->bm_data;
17041719
int offset = 7;
@@ -1708,6 +1723,12 @@ int send_certificate(SSL *ssl)
17081723
buf[1] = 0;
17091724
buf[4] = 0;
17101725

1726+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2 &&
1727+
((ret = check_certificate_chain(ssl)) != SSL_OK))
1728+
{
1729+
goto error;
1730+
}
1731+
17111732
while (i < ssl->ssl_ctx->chain_length)
17121733
{
17131734
SSL_CERT *cert = &ssl->ssl_ctx->certs[i];
@@ -1726,7 +1747,10 @@ int send_certificate(SSL *ssl)
17261747
buf[2] = chain_length >> 8; /* handshake length */
17271748
buf[3] = chain_length & 0xff;
17281749
ssl->bm_index = offset;
1729-
return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
1750+
ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
1751+
1752+
error:
1753+
return ret;
17301754
}
17311755

17321756
/**
@@ -1945,6 +1969,42 @@ EXP_FUNC int STDCALL ssl_get_config(int offset)
19451969
}
19461970
}
19471971

1972+
/**
1973+
* Check the certificate chain to see if the certs are supported
1974+
*/
1975+
static int check_certificate_chain(SSL *ssl)
1976+
{
1977+
int i = 0;
1978+
int ret = SSL_OK;
1979+
1980+
while (i < ssl->ssl_ctx->chain_length)
1981+
{
1982+
int j = 0;
1983+
uint8_t found = 0;
1984+
SSL_CERT *cert = &ssl->ssl_ctx->certs[i];
1985+
1986+
while (j < ssl->num_sig_algs)
1987+
{
1988+
if (ssl->sig_algs[j++] == cert->hash_alg)
1989+
{
1990+
found = 1;
1991+
break;
1992+
}
1993+
}
1994+
1995+
if (!found)
1996+
{
1997+
ret = SSL_ERROR_INVALID_CERT_HASH_ALG;
1998+
goto error;
1999+
}
2000+
2001+
i++;
2002+
}
2003+
2004+
error:
2005+
return ret;
2006+
}
2007+
19482008
#ifdef CONFIG_SSL_CERT_VERIFICATION
19492009
/**
19502010
* Authenticate a received certificate.
@@ -2258,6 +2318,10 @@ EXP_FUNC void STDCALL ssl_display_error(int error_code)
22582318
printf("no cipher");
22592319
break;
22602320

2321+
case SSL_ERROR_INVALID_CERT_HASH_ALG:
2322+
printf("invalid cert hash algorithm");
2323+
break;
2324+
22612325
case SSL_ERROR_CONN_LOST:
22622326
printf("connection lost");
22632327
break;

ssl/tls1.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,9 @@ extern "C" {
8282

8383
#define NUM_PROTOCOLS 4
8484

85+
#define MAX_SIG_ALGORITHMS 4
8586
#define SIG_ALG_EXTENSION 0x0d
86-
#define SIG_ALG_MD5 1
8787
#define SIG_ALG_SHA1 2
88-
#define SIG_ALG_SHA224 3
8988
#define SIG_ALG_SHA256 4
9089
#define SIG_ALG_SHA384 5
9190
#define SIG_ALG_SHA512 6
@@ -150,6 +149,7 @@ typedef struct
150149
{
151150
uint8_t *buf;
152151
int size;
152+
uint8_t hash_alg;
153153
} SSL_CERT;
154154

155155
typedef struct
@@ -188,6 +188,8 @@ struct _SSL
188188
uint16_t bm_index;
189189
uint16_t bm_read_index;
190190
size_t max_plain_length;
191+
uint8_t sig_algs[MAX_SIG_ALGORITHMS];
192+
uint8_t num_sig_algs;
191193
struct _SSL *next; /* doubly linked list */
192194
struct _SSL *prev;
193195
struct _SSL_CTX *ssl_ctx; /* back reference to a clnt/svr ctx */

ssl/tls1_clnt.c

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,15 @@
3838
#ifdef CONFIG_SSL_ENABLE_CLIENT /* all commented out if no client */
3939

4040
/* support sha512/384/256/1 rsa */
41-
static const uint8_t g_sig_alg[] = { 0x00, 0x08,
42-
0x00, SIG_ALG_EXTENSION, 0x00, 0x04, 0x00, 0x02,
43-
SIG_ALG_SHA256, SIG_ALG_RSA };
41+
static const uint8_t g_sig_alg[] = {
42+
0x00, 0x0e,
43+
0x00, SIG_ALG_EXTENSION,
44+
0x00, 0x0a, 0x00, 0x08,
45+
SIG_ALG_SHA256, SIG_ALG_RSA,
46+
SIG_ALG_SHA512, SIG_ALG_RSA,
47+
SIG_ALG_SHA384, SIG_ALG_RSA,
48+
SIG_ALG_SHA1, SIG_ALG_RSA
49+
};
4450

4551
static const uint8_t g_asn1_sha256[] =
4652
{
@@ -238,7 +244,8 @@ static int send_client_hello(SSL *ssl)
238244
buf[offset++] = 1; /* no compression */
239245
buf[offset++] = 0;
240246

241-
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
247+
/* send the signature algorithm extension for TLS 1.2+ */
248+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2)
242249
{
243250
memcpy(&buf[offset], g_sig_alg, sizeof(g_sig_alg));
244251
offset += sizeof(g_sig_alg);
@@ -371,17 +378,47 @@ static int process_cert_req(SSL *ssl)
371378
{
372379
uint8_t *buf = &ssl->bm_data[ssl->dc->bm_proc_index];
373380
int ret = SSL_OK;
374-
int offset = (buf[2] << 4) + buf[3];
381+
int cert_req_size = (buf[2]<<8) + buf[3];
382+
int offset = 4;
375383
int pkt_size = ssl->bm_index;
384+
uint8_t cert_type_len, sig_alg_len;
385+
386+
PARANOIA_CHECK(pkt_size, offset + cert_req_size);
387+
ssl->dc->bm_proc_index = cert_req_size;
376388

377389
/* don't do any processing - we will send back an RSA certificate anyway */
378390
ssl->next_state = HS_SERVER_HELLO_DONE;
379391
SET_SSL_FLAG(SSL_HAS_CERT_REQ);
380-
ssl->dc->bm_proc_index += offset;
381-
PARANOIA_CHECK(pkt_size, offset);
382392

383-
// don't care about sig/hash algorithm, let server take care of that
384-
// (only SHA256/RSA supported)
393+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
394+
{
395+
// supported certificate types
396+
cert_type_len = buf[offset++];
397+
PARANOIA_CHECK(pkt_size, offset + cert_type_len);
398+
offset += cert_type_len;
399+
400+
// supported signature algorithms
401+
sig_alg_len = buf[offset++] << 8;
402+
sig_alg_len += buf[offset++];
403+
PARANOIA_CHECK(pkt_size, offset + sig_alg_len);
404+
405+
while (sig_alg_len > 0)
406+
{
407+
uint8_t hash_alg = buf[offset++];
408+
uint8_t sig_alg = buf[offset++];
409+
sig_alg_len -= 2;
410+
411+
if (sig_alg == SIG_ALG_RSA &&
412+
(hash_alg == SIG_ALG_SHA1 ||
413+
hash_alg == SIG_ALG_SHA256 ||
414+
hash_alg == SIG_ALG_SHA384 ||
415+
hash_alg == SIG_ALG_SHA512))
416+
{
417+
ssl->sig_algs[ssl->num_sig_algs++] = hash_alg;
418+
}
419+
}
420+
}
421+
385422
error:
386423
return ret;
387424
}

0 commit comments

Comments
 (0)