Skip to content

Commit 5bafc9d

Browse files
authored
Merge pull request #2157 from tempesta-tech/ak-sha384-sign
Fix x509 certificate parsing
2 parents 0dee025 + 4acb4b3 commit 5bafc9d

File tree

18 files changed

+786
-808
lines changed

18 files changed

+786
-808
lines changed

fw/http.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7246,7 +7246,7 @@ __tfw_http_msg_body_dup(const char *filename, TfwStr *c_len, size_t *len,
72467246
tfw_str_to_cstr(c_len, res, t_sz);
72477247
b_start += c_len->len;
72487248
}
7249-
memcpy_fast(b_start, body, b_sz);
7249+
memcpy(b_start, body, b_sz);
72507250

72517251
*len = t_sz;
72527252
*body_offset = b_start - res;

fw/tls_conf.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* Tempesta FW
33
*
4-
* Copyright (C) 2019-2023 Tempesta Technologies, Inc.
4+
* Copyright (C) 2019-2024 Tempesta Technologies, Inc.
55
*
66
* This program is free software; you can redistribute it and/or modify
77
* it under the terms of the GNU General Public License as published by
@@ -121,8 +121,8 @@ tfw_tls_add_cn(const ttls_x509_buf *sname, void *a_vhost)
121121
TfwVhost *vhost = a_vhost;
122122
const char *hname = vhost->name.data;
123123
int hlen = vhost->name.len;
124-
BasicStr cn = {.data = sname->p, .len = sname->len};
125-
124+
/* cn-pointed data isn't modified, so just a type compatibility. */
125+
BasicStr cn = {.data = (char *)sname->p, .len = sname->len};
126126

127127
/*
128128
* Try wildcard match by RFC 2818 3.1:
@@ -153,7 +153,7 @@ tfw_tls_add_cn(const ttls_x509_buf *sname, void *a_vhost)
153153
* Add the chopped (w/o leading '*') wildcard to
154154
* the SNI mapping.
155155
*/
156-
cn.data = sname->p + 1;
156+
cn.data = (char *)sname->p + 1;
157157
cn.len = sname->len - 1;
158158
}
159159

@@ -186,18 +186,17 @@ tfw_tls_set_cert(TfwVhost *vhost, TfwCfgSpec *cs, TfwCfgEntry *ce)
186186
if (tfw_cfg_check_single_val(ce))
187187
return -EINVAL;
188188

189-
ttls_x509_crt_init(&conf->crt);
190-
/* Preserve 3 bytes for the certificate length. */
191189
crt_data = tfw_cfg_read_file(ce->vals[0], &crt_size);
192190
if (!crt_data) {
193191
T_ERR_NL("%s: Can't read certificate file '%s'\n",
194192
ce->name, ce->vals[0]);
195193
return -EINVAL;
196194
}
197195

196+
ttls_x509_crt_init(&conf->crt);
198197
r = ttls_x509_crt_parse(&conf->crt, crt_data, crt_size);
199198
if (r) {
200-
T_ERR_NL("%s: Invalid certificate specified (%x)\n",
199+
T_ERR_NL("%s: Invalid certificate specified, err=%x\n",
201200
cs->name, -r);
202201
goto err;
203202
}

tls/asn1.c

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Based on mbed TLS, https://tls.mbed.org.
77
*
88
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
9-
* Copyright (C) 2015-2020 Tempesta Technologies, Inc.
9+
* Copyright (C) 2015-2024 Tempesta Technologies, Inc.
1010
*
1111
* This program is free software; you can redistribute it and/or modify
1212
* it under the terms of the GNU General Public License as published by
@@ -39,7 +39,7 @@
3939
* @len - The variable that will receive the value
4040
*/
4141
int
42-
ttls_asn1_get_len(unsigned char **p, const unsigned char *end, size_t *len)
42+
ttls_asn1_get_len(const unsigned char **p, const unsigned char *end, size_t *len)
4343
{
4444
if ((end - *p) < 1)
4545
return(TTLS_ERR_ASN1_OUT_OF_DATA);
@@ -92,7 +92,7 @@ ttls_asn1_get_len(unsigned char **p, const unsigned char *end, size_t *len)
9292
* @tag - The expected tag
9393
*/
9494
int
95-
ttls_asn1_get_tag(unsigned char **p, const unsigned char *end, size_t *len,
95+
ttls_asn1_get_tag(const unsigned char **p, const unsigned char *end, size_t *len,
9696
int tag)
9797
{
9898
if ((end - *p) < 1)
@@ -115,7 +115,7 @@ ttls_asn1_get_tag(unsigned char **p, const unsigned char *end, size_t *len,
115115
* @val - The variable that will receive the value
116116
*/
117117
int
118-
ttls_asn1_get_bool(unsigned char **p, const unsigned char *end, int *val)
118+
ttls_asn1_get_bool(const unsigned char **p, const unsigned char *end, int *val)
119119
{
120120
int r;
121121
size_t len;
@@ -141,7 +141,7 @@ ttls_asn1_get_bool(unsigned char **p, const unsigned char *end, int *val)
141141
* @val - The variable that will receive the value
142142
*/
143143
int
144-
ttls_asn1_get_int(unsigned char **p, const unsigned char *end, int *val)
144+
ttls_asn1_get_int(const unsigned char **p, const unsigned char *end, int *val)
145145
{
146146
int r;
147147
size_t len;
@@ -171,7 +171,7 @@ ttls_asn1_get_int(unsigned char **p, const unsigned char *end, int *val)
171171
* @X - The MPI that will receive the value
172172
*/
173173
int
174-
ttls_asn1_get_mpi(unsigned char **p, const unsigned char *end, TlsMpi *X)
174+
ttls_asn1_get_mpi(const unsigned char **p, const unsigned char *end, TlsMpi *X)
175175
{
176176
int r;
177177
size_t len;
@@ -187,7 +187,7 @@ ttls_asn1_get_mpi(unsigned char **p, const unsigned char *end, TlsMpi *X)
187187
}
188188

189189
int
190-
ttls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
190+
ttls_asn1_get_bitstring(const unsigned char **p, const unsigned char *end,
191191
ttls_asn1_bitstring *bs)
192192
{
193193
int r;
@@ -201,9 +201,8 @@ ttls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
201201
return TTLS_ERR_ASN1_OUT_OF_DATA;
202202
bs->len -= 1;
203203

204-
/* Get number of unused bits, ensure unused bits <= 7 */
205-
bs->unused_bits = **p;
206-
if (bs->unused_bits > 7)
204+
/* Ensure unused bits is <= 7. */
205+
if (**p > 7)
207206
return TTLS_ERR_ASN1_INVALID_LENGTH;
208207
++*p;
209208

@@ -218,22 +217,26 @@ ttls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
218217
* Retrieve a bitstring ASN.1 tag without unused bits and its value.
219218
*/
220219
int
221-
ttls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
220+
ttls_asn1_get_bitstring_null(const unsigned char **p, const unsigned char *end,
222221
size_t *len)
223222
{
224223
int r;
225224

226225
if ((r = ttls_asn1_get_tag(p, end, len, TTLS_ASN1_BIT_STRING)))
227226
return r;
228227

229-
return ((*len)-- < 2 || *(*p)++ != 0) ? -EINVAL : 0;
228+
if (!*len)
229+
return -EINVAL;
230+
--*len;
231+
232+
return *(*p)++ ? -EINVAL : 0;
230233
}
231234

232235
/*
233236
* Parses and splits an ASN.1 "SEQUENCE OF <tag>"
234237
*/
235238
int
236-
ttls_asn1_get_sequence_of(unsigned char **p, const unsigned char *end,
239+
ttls_asn1_get_sequence_of(const unsigned char **p, const unsigned char *end,
237240
ttls_asn1_sequence *cur, int tag)
238241
{
239242
int r;
@@ -249,7 +252,7 @@ ttls_asn1_get_sequence_of(unsigned char **p, const unsigned char *end,
249252
return TTLS_ERR_ASN1_LENGTH_MISMATCH;
250253

251254
while (*p < end) {
252-
buf = &(cur->buf);
255+
buf = &cur->buf;
253256
buf->tag = **p;
254257

255258
if ((r = ttls_asn1_get_tag(p, end, &buf->len, tag)))
@@ -284,7 +287,7 @@ ttls_asn1_get_sequence_of(unsigned char **p, const unsigned char *end,
284287
* @params - The buffer to receive the params (if any)
285288
*/
286289
int
287-
ttls_asn1_get_alg(unsigned char **p, const unsigned char *end,
290+
ttls_asn1_get_alg(const unsigned char **p, const unsigned char *end,
288291
ttls_asn1_buf *alg, ttls_asn1_buf *params)
289292
{
290293
int r;
@@ -324,7 +327,7 @@ ttls_asn1_get_alg(unsigned char **p, const unsigned char *end,
324327
}
325328

326329
int
327-
ttls_asn1_get_alg_null(unsigned char **p, const unsigned char *end,
330+
ttls_asn1_get_alg_null(const unsigned char **p, const unsigned char *end,
328331
ttls_asn1_buf *alg)
329332
{
330333
int r;
@@ -356,15 +359,15 @@ ttls_asn1_write_len(unsigned char **p, unsigned char *start, size_t len)
356359
if (len < 0x80) {
357360
if (*p - start < 1)
358361
return -ENOSPC;
359-
*--(*p) = (unsigned char) len;
362+
*--(*p) = (unsigned char)len;
360363
return 1;
361364
}
362365

363366
if (len <= 0xFF) {
364367
if (*p - start < 2)
365368
return -ENOSPC;
366369

367-
*--(*p) = (unsigned char) len;
370+
*--(*p) = (unsigned char)len;
368371
*--(*p) = 0x81;
369372
return 2;
370373
}

tls/asn1.h

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Based on mbed TLS, https://tls.mbed.org.
77
*
88
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
9-
* Copyright (C) 2015-2020 Tempesta Technologies, Inc.
9+
* Copyright (C) 2015-2024 Tempesta Technologies, Inc.
1010
*
1111
* This program is free software; you can redistribute it and/or modify
1212
* it under the terms of the GNU General Public License as published by
@@ -102,8 +102,7 @@
102102
do { \
103103
if ((ret = f) < 0) \
104104
return ret; \
105-
else \
106-
g += ret; \
105+
g += ret; \
107106
} while (0)
108107

109108
/**
@@ -114,22 +113,20 @@ do { \
114113
* @p - ASN1 data, e.g. in ASCII.
115114
*/
116115
typedef struct {
117-
int tag;
118-
size_t len;
119-
unsigned char *p;
116+
int tag;
117+
size_t len;
118+
const unsigned char *p;
120119
} ttls_asn1_buf;
121120

122121
/**
123122
* Container for ASN1 bit strings.
124123
*
125124
* @len - ASN1 length, in octets;
126-
* @unused_bits - Number of unused bits at the end of the string;
127125
* @p - Raw ASN1 data for the bit string.
128126
*/
129127
typedef struct {
130-
size_t len;
131-
unsigned char unused_bits;
132-
unsigned char *p;
128+
size_t len;
129+
const unsigned char *p;
133130
} ttls_asn1_bitstring;
134131

135132
/**
@@ -140,7 +137,7 @@ typedef struct {
140137
*/
141138
typedef struct ttls_asn1_sequence
142139
{
143-
ttls_asn1_buf buf;
140+
ttls_asn1_buf buf;
144141
struct ttls_asn1_sequence *next;
145142
} ttls_asn1_sequence;
146143

@@ -160,21 +157,25 @@ typedef struct ttls_asn1_named_data
160157
unsigned char next_merged;
161158
} ttls_asn1_named_data;
162159

163-
int ttls_asn1_get_len(unsigned char **p, const unsigned char *end, size_t *len);
164-
int ttls_asn1_get_tag(unsigned char **p, const unsigned char *end, size_t *len,
165-
int tag);
166-
int ttls_asn1_get_bool(unsigned char **p, const unsigned char *end, int *val);
167-
int ttls_asn1_get_int(unsigned char **p, const unsigned char *end, int *val);
168-
int ttls_asn1_get_mpi(unsigned char **p, const unsigned char *end, TlsMpi *X);
169-
int ttls_asn1_get_bitstring(unsigned char **p, const unsigned char *end,
160+
int ttls_asn1_get_len(const unsigned char **p, const unsigned char *end,
161+
size_t *len);
162+
int ttls_asn1_get_tag(const unsigned char **p, const unsigned char *end,
163+
size_t *len, int tag);
164+
int ttls_asn1_get_bool(const unsigned char **p, const unsigned char *end,
165+
int *val);
166+
int ttls_asn1_get_int(const unsigned char **p, const unsigned char *end,
167+
int *val);
168+
int ttls_asn1_get_mpi(const unsigned char **p, const unsigned char *end,
169+
TlsMpi *X);
170+
int ttls_asn1_get_bitstring(const unsigned char **p, const unsigned char *end,
170171
ttls_asn1_bitstring *bs);
171-
int ttls_asn1_get_bitstring_null(unsigned char **p, const unsigned char *end,
172-
size_t *len);
173-
int ttls_asn1_get_sequence_of(unsigned char **p, const unsigned char *end,
172+
int ttls_asn1_get_bitstring_null(const unsigned char **p,
173+
const unsigned char *end, size_t *len);
174+
int ttls_asn1_get_sequence_of(const unsigned char **p, const unsigned char *end,
174175
ttls_asn1_sequence *cur, int tag);
175-
int ttls_asn1_get_alg(unsigned char **p, const unsigned char *end,
176+
int ttls_asn1_get_alg(const unsigned char **p, const unsigned char *end,
176177
ttls_asn1_buf *alg, ttls_asn1_buf *params);
177-
int ttls_asn1_get_alg_null(unsigned char **p, const unsigned char *end,
178+
int ttls_asn1_get_alg_null(const unsigned char **p, const unsigned char *end,
178179
ttls_asn1_buf *alg);
179180
int ecdsa_signature_to_asn1(const TlsMpi *r, const TlsMpi *s,
180181
unsigned char *sig, size_t *slen);

0 commit comments

Comments
 (0)