Skip to content

Commit 09619c9

Browse files
cameronrichikeyasu
cameronrich
authored andcommitted
Client side works with a certificate verify - still lots of work to go.
git-svn-id: svn://svn.code.sf.net/p/axtls/code/trunk@264 9a5d90b5-6617-0410-8a86-bb477d3ed2e3
1 parent d476a79 commit 09619c9

File tree

5 files changed

+135
-99
lines changed

5 files changed

+135
-99
lines changed

ssl/tls1.c

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const uint8_t ssl_prot_prefs[NUM_PROTOCOLS] =
6969
#elif CONFIG_SSL_PROT_MEDIUM /* medium security, medium speed */
7070
{ SSL_AES128_SHA256, SSL_AES256_SHA256, SSL_AES256_SHA, SSL_AES128_SHA };
7171
#else /* CONFIG_SSL_PROT_HIGH */ /* high security, low speed */
72-
{ SSL_AES256_SHA, SSL_AES128_SHA256, SSL_AES_256_SHA, SSL_AES128_SHA };
72+
{ SSL_AES256_SHA256, SSL_AES128_SHA256, SSL_AES256_SHA, SSL_AES128_SHA };
7373
#endif
7474

7575
/**
@@ -640,7 +640,7 @@ static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header,
640640
const uint8_t *buf, int buf_len, uint8_t *hmac_buf)
641641
{
642642
int hmac_len = buf_len + 8 + SSL_RECORD_SIZE;
643-
uint8_t *t_buf = (uint8_t *)alloca(buf_len);
643+
uint8_t *t_buf = (uint8_t *)alloca(buf_len+100);
644644

645645
memcpy(t_buf, (mode == SSL_SERVER_WRITE || mode == SSL_CLIENT_WRITE) ?
646646
ssl->write_sequence : ssl->read_sequence, 8);
@@ -683,7 +683,7 @@ static void add_hmac_digest(SSL *ssl, int mode, uint8_t *hmac_header,
683683
*/
684684
static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len)
685685
{
686-
uint8_t hmac_buf[SHA256_SIZE];
686+
uint8_t hmac_buf[128];
687687
int hmac_offset;
688688

689689
if (ssl->cipher_info->padding_size)
@@ -738,12 +738,22 @@ static int verify_digest(SSL *ssl, int mode, const uint8_t *buf, int read_len)
738738
*/
739739
void add_packet(SSL *ssl, const uint8_t *pkt, int len)
740740
{
741-
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
741+
// TLS1.2
742+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2 || ssl->version == 0)
742743
{
743744
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+
744752
}
745-
else // TLS1.0/1.0
753+
754+
if (ssl->version < SSL_PROTOCOL_VERSION_TLS1_2 || ssl->version == 0)
746755
{
756+
uint8_t q[128];
747757
MD5_Update(&ssl->dc->md5_ctx, pkt, len);
748758
SHA1_Update(&ssl->dc->sha1_ctx, pkt, len);
749759
}
@@ -870,7 +880,7 @@ static void prf(SSL *ssl, const uint8_t *sec, int sec_len,
870880
*/
871881
void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret)
872882
{
873-
uint8_t buf[128]; /* needs to be > 13+32+32 in size */
883+
uint8_t buf[128];
874884
//print_blob("premaster secret", premaster_secret, 48);
875885
strcpy((char *)buf, "master secret");
876886
memcpy(&buf[13], ssl->dc->client_random, SSL_RANDOM_SIZE);
@@ -903,10 +913,11 @@ static void generate_key_block(SSL *ssl,
903913
* Calculate the digest used in the finished message. This function also
904914
* doubles up as a certificate verify function.
905915
*/
906-
void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
916+
int finished_digest(SSL *ssl, const char *label, uint8_t *digest)
907917
{
908918
uint8_t mac_buf[128];
909919
uint8_t *q = mac_buf;
920+
int dgst_len;
910921

911922
if (label)
912923
{
@@ -919,17 +930,7 @@ void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
919930
SHA256_CTX sha256_ctx = ssl->dc->sha256_ctx; // interim copy
920931
SHA256_Final(q, &sha256_ctx);
921932
q += SHA256_SIZE;
922-
923-
if (label)
924-
{
925-
prf(ssl, ssl->dc->master_secret, SSL_SECRET_SIZE,
926-
mac_buf, (int)(q-mac_buf), digest,
927-
SSL_FINISHED_HASH_SIZE);
928-
}
929-
else // for use in a certificate verify
930-
{
931-
memcpy(digest, mac_buf, SHA256_SIZE);
932-
}
933+
dgst_len = (int)(q-mac_buf);
933934
}
934935
else // TLS1.0/1.1
935936
{
@@ -941,23 +942,26 @@ void finished_digest(SSL *ssl, const char *label, uint8_t *digest)
941942

942943
SHA1_Final(q, &sha1_ctx);
943944
q += SHA1_SIZE;
945+
dgst_len = (int)(q-mac_buf);
946+
}
944947

945-
if (label)
946-
{
947-
prf(ssl, ssl->dc->master_secret, SSL_SECRET_SIZE,
948-
mac_buf, (int)(q-mac_buf), digest, SSL_FINISHED_HASH_SIZE);
949-
}
950-
else /* for use in a certificate verify */
951-
{
952-
memcpy(digest, mac_buf, MD5_SIZE + SHA1_SIZE);
953-
}
948+
if (label)
949+
{
950+
prf(ssl, ssl->dc->master_secret, SSL_SECRET_SIZE,
951+
mac_buf, dgst_len, digest, SSL_FINISHED_HASH_SIZE);
952+
}
953+
else /* for use in a certificate verify */
954+
{
955+
memcpy(digest, mac_buf, dgst_len);
954956
}
955957

956958
#if 0
957959
printf("label: %s\n", label);
958-
print_blob("mac_buf", mac_buf, q-mac_buf);
960+
print_blob("mac_buf", mac_buf, dgst_len);
959961
print_blob("finished digest", digest, SSL_FINISHED_HASH_SIZE);
960962
#endif
963+
964+
return dgst_len;
961965
}
962966

963967
/**
@@ -1190,19 +1194,18 @@ static int set_key_block(SSL *ssl, int is_write)
11901194
return -1;
11911195

11921196
/* only do once in a handshake */
1193-
if (ssl->dc->bm_proc_index ==0 )
1197+
if (!ssl->dc->key_block_generated)
11941198
{
1195-
#if 0
1196-
print_blob("client", ssl->dc->client_random, 32);
1197-
print_blob("server", ssl->dc->server_random, 32);
1198-
print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE);
1199-
#endif
12001199
generate_key_block(ssl, ssl->dc->client_random, ssl->dc->server_random,
12011200
ssl->dc->master_secret, ssl->dc->key_block,
12021201
ciph_info->key_block_size);
12031202
#if 0
1203+
print_blob("master", ssl->dc->master_secret, SSL_SECRET_SIZE);
12041204
print_blob("keyblock", ssl->dc->key_block, ciph_info->key_block_size);
1205+
print_blob("client random", ssl->dc->client_random, 32);
1206+
print_blob("server random", ssl->dc->server_random, 32);
12051207
#endif
1208+
ssl->dc->key_block_generated = 1;
12061209
}
12071210

12081211
q = ssl->dc->key_block;
@@ -1229,6 +1232,12 @@ static int set_key_block(SSL *ssl, int is_write)
12291232
q += ciph_info->iv_size;
12301233
memcpy(server_iv, q, ciph_info->iv_size);
12311234
q += ciph_info->iv_size;
1235+
#if 0
1236+
print_blob("client key", client_key, ciph_info->key_size);
1237+
print_blob("server key", server_key, ciph_info->key_size);
1238+
print_blob("client iv", client_iv, ciph_info->iv_size);
1239+
print_blob("server iv", server_iv, ciph_info->iv_size);
1240+
#endif
12321241

12331242
// free(is_write ? ssl->encrypt_ctx : ssl->decrypt_ctx);
12341243

@@ -2285,6 +2294,10 @@ EXP_FUNC void STDCALL ssl_display_error(int error_code)
22852294
printf("\n");
22862295
}
22872296

2297+
/**
2298+
* Debugging routine to display alerts.
2299+
*/
2300+
22882301
/**
22892302
* Debugging routine to display alerts.
22902303
*/

ssl/tls1.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,15 @@ extern "C" {
8181
#define BM_RECORD_OFFSET 5
8282

8383
#define NUM_PROTOCOLS 4
84+
8485
#define SIG_ALG_EXTENSION 0x0d
86+
#define SIG_ALG_MD5 1
87+
#define SIG_ALG_SHA1 2
88+
#define SIG_ALG_SHA224 3
89+
#define SIG_ALG_SHA256 4
90+
#define SIG_ALG_SHA384 5
91+
#define SIG_ALG_SHA512 6
92+
#define SIG_ALG_RSA 1
8593

8694
#define PARANOIA_CHECK(A, B) if (A < B) { \
8795
ret = SSL_ERROR_INVALID_HANDSHAKE; goto error; }
@@ -155,6 +163,7 @@ typedef struct
155163
uint8_t master_secret[SSL_SECRET_SIZE];
156164
uint8_t key_block[256];
157165
uint16_t bm_proc_index;
166+
uint8_t key_block_generated;
158167
} DISPOSABLE_CTX;
159168

160169
struct _SSL
@@ -245,7 +254,7 @@ int send_finished(SSL *ssl);
245254
int send_certificate(SSL *ssl);
246255
int basic_read(SSL *ssl, uint8_t **in_data);
247256
int send_change_cipher_spec(SSL *ssl);
248-
void finished_digest(SSL *ssl, const char *label, uint8_t *digest);
257+
int finished_digest(SSL *ssl, const char *label, uint8_t *digest);
249258
void generate_master_secret(SSL *ssl, const uint8_t *premaster_secret);
250259
void add_packet(SSL *ssl, const uint8_t *pkt, int len);
251260
int add_cert(SSL_CTX *ssl_ctx, const uint8_t *buf, int len);

ssl/tls1_clnt.c

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,16 @@
3737

3838
#ifdef CONFIG_SSL_ENABLE_CLIENT /* all commented out if no client */
3939

40-
/* support sha512/384/256/224/1 rsa */
41-
static const uint8_t g_sig_alg[] = { 0x00, 0x10,
42-
0x00, SIG_ALG_EXTENSION, 0x00, 0x0c, 0x00, 0x0a,
43-
0x06, 0x01, 0x05, 0x01, 0x04, 0x01, 0x03, 0x01, 0x02, 0x01 };
40+
/* 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 };
44+
45+
static const uint8_t g_asn1_sha256[] =
46+
{
47+
0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03,
48+
0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
49+
};
4450

4551
static int send_client_hello(SSL *ssl);
4652
static int process_server_hello(SSL *ssl);
@@ -232,14 +238,13 @@ static int send_client_hello(SSL *ssl)
232238
buf[offset++] = 1; /* no compression */
233239
buf[offset++] = 0;
234240

235-
if (ssl->version > SSL_PROTOCOL_VERSION_TLS1_1)
241+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
236242
{
237243
memcpy(&buf[offset], g_sig_alg, sizeof(g_sig_alg));
238244
offset += sizeof(g_sig_alg);
239245
}
240246

241247
buf[3] = offset - 4; /* handshake size */
242-
243248
return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset);
244249
}
245250

@@ -303,43 +308,13 @@ static int process_server_hello(SSL *ssl)
303308
ssl->next_state = IS_SET_SSL_FLAG(SSL_SESSION_RESUME) ?
304309
HS_FINISHED : HS_CERTIFICATE;
305310

306-
offset++; // skip the compr
311+
offset += 2; // ignore compression
307312
PARANOIA_CHECK(pkt_size, offset);
308313

309-
// Check for extensions from the server - only the signature algorithm
310-
// is supported
311-
if (pkt_size > offset)
312-
{
313-
if (buf[offset++] > 0) // MSB of extension len must be 0
314-
{
315-
ret = SSL_ALERT_UNSUPPORTED_EXTENSION;
316-
goto error;
317-
}
318-
319-
offset++; // ignore the extension size as we only look at one
320-
321-
if (buf[offset++] == 0 && buf[offset++] == SIG_ALG_EXTENSION)
322-
{
323-
if (buf[offset++] != 0) // MSB of alg_sig_len must be 0
324-
{
325-
ret = SSL_ALERT_UNSUPPORTED_EXTENSION;
326-
goto error;
327-
}
328-
329-
int alg_sig_len = buf[offset++];
330-
offset += alg_sig_len;
331-
PARANOIA_CHECK(pkt_size, offset);
332-
// we don't use what comes back (for now)
333-
}
334-
else
335-
{
336-
ret = SSL_ALERT_UNSUPPORTED_EXTENSION;
337-
goto error;
338-
}
339-
}
340-
341314
ssl->dc->bm_proc_index = offset+1;
315+
PARANOIA_CHECK(pkt_size, offset);
342316

317+
// no extensions
343318
error:
344319
return ret;
345320
}
@@ -404,6 +379,9 @@ static int process_cert_req(SSL *ssl)
404379
SET_SSL_FLAG(SSL_HAS_CERT_REQ);
405380
ssl->dc->bm_proc_index += offset;
406381
PARANOIA_CHECK(pkt_size, offset);
382+
383+
// don't care about sig/hash algorithm, let server take care of that
384+
// (only SHA256/RSA supported)
407385
error:
408386
return ret;
409387
}
@@ -414,9 +392,11 @@ static int process_cert_req(SSL *ssl)
414392
static int send_cert_verify(SSL *ssl)
415393
{
416394
uint8_t *buf = ssl->bm_data;
417-
uint8_t dgst[MD5_SIZE+SHA1_SIZE];
395+
uint8_t dgst[128];
418396
RSA_CTX *rsa_ctx = ssl->ssl_ctx->rsa_ctx;
419397
int n = 0, ret;
398+
int offset = 0;
399+
int dgst_len;
420400

421401
if (rsa_ctx == NULL)
422402
return SSL_OK;
@@ -426,13 +406,26 @@ static int send_cert_verify(SSL *ssl)
426406
buf[0] = HS_CERT_VERIFY;
427407
buf[1] = 0;
428408

429-
finished_digest(ssl, NULL, dgst); /* calculate the digest */
409+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
410+
{
411+
buf[4] = SIG_ALG_SHA256;
412+
buf[5] = SIG_ALG_RSA;
413+
offset = 6;
414+
memcpy(dgst, g_asn1_sha256, sizeof(g_asn1_sha256));
415+
dgst_len = finished_digest(ssl, NULL, &dgst[sizeof(g_asn1_sha256)]) +
416+
sizeof(g_asn1_sha256);
417+
}
418+
else
419+
{
420+
offset = 4;
421+
dgst_len = finished_digest(ssl, NULL, dgst);
422+
}
430423

431424
/* rsa_ctx->bi_ctx is not thread-safe */
432425
if (rsa_ctx)
433426
{
434427
SSL_CTX_LOCK(ssl->ssl_ctx->mutex);
435-
n = RSA_encrypt(rsa_ctx, dgst, sizeof(dgst), &buf[6], 1);
428+
n = RSA_encrypt(rsa_ctx, dgst, dgst_len, &buf[offset+2], 1);
436429
SSL_CTX_UNLOCK(ssl->ssl_ctx->mutex);
437430

438431
if (n == 0)
@@ -442,12 +435,18 @@ static int send_cert_verify(SSL *ssl)
442435
}
443436
}
444437

445-
buf[4] = n >> 8; /* add the RSA size (not officially documented) */
446-
buf[5] = n & 0xff;
438+
buf[offset] = n >> 8; /* add the RSA size */
439+
buf[offset+1] = n & 0xff;
447440
n += 2;
441+
442+
if (ssl->version >= SSL_PROTOCOL_VERSION_TLS1_2) // TLS1.2
443+
{
444+
n += 2;
445+
}
446+
448447
buf[2] = n >> 8;
449448
buf[3] = n & 0xff;
450-
ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, n+4);
449+
ret = send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, n + offset - 2);
451450

452451
error:
453452
return ret;

0 commit comments

Comments
 (0)