Skip to content

Commit 1052703

Browse files
committed
fix/improve DER tests
Signed-off-by: Steffen Jaeckel <s@jaeckel.eu>
1 parent c2f6c40 commit 1052703

File tree

1 file changed

+52
-12
lines changed

1 file changed

+52
-12
lines changed

tests/der_test.c

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -229,19 +229,45 @@ SEQUENCE(3 elem)
229229
#define CHECK_ASN1_HAS_NO_DATA(l) CHECK_ASN1_HAS_NO(l, data)
230230

231231
#ifdef LTC_DER_TESTS_PRINT_FLEXI
232+
233+
static void* s_xmalloc(int l)
234+
{
235+
void *r = XMALLOC(l);
236+
237+
#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
238+
fprintf(stderr, "ALLOC %9d to %p\n", l, r);
239+
#endif
240+
if (!r) {
241+
fprintf(stderr, "Could not allocate %d bytes of memory\n", l);
242+
exit(EXIT_FAILURE);
243+
}
244+
return r;
245+
}
246+
247+
static void s_free(void *p)
248+
{
249+
#if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 3
250+
fprintf(stderr, "FREE %p\n", p);
251+
#endif
252+
XFREE(p);
253+
}
254+
232255
static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
233256
{
234-
char buf[1024];
257+
char *buf = NULL;
235258
const char* name = NULL;
236259
const char* text = NULL;
237260
ltc_asn1_list* ostring = NULL;
238261
unsigned int n;
262+
int slen;
239263

240264
switch (l->type)
241265
{
242266
case LTC_ASN1_EOL:
243267
name = "EOL";
244-
snprintf(buf, sizeof(buf),__ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
268+
slen = snprintf(NULL, 0, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
269+
buf = s_xmalloc(slen);
270+
slen = snprintf(buf, slen, ASN1_FMTSTRING_FMT "\n", ASN1_FMTSTRING_VAL(l));
245271
text = buf;
246272
break;
247273
case LTC_ASN1_BOOLEAN:
@@ -255,6 +281,7 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
255281
break;
256282
case LTC_ASN1_INTEGER:
257283
name = "INTEGER";
284+
buf = s_xmalloc(((mp_get_digit_count(l->data) + 1) * ltc_mp.bits_per_digit) / 3);
258285
mp_toradix(l->data, buf, 10);
259286
text = buf;
260287
break;
@@ -273,11 +300,10 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
273300
*/
274301
if (der_decode_sequence_flexi(l->data, &ostring_l, &ostring) == CRYPT_OK) {
275302
text = "";
276-
}
277-
else {
303+
} else {
278304
int r;
279-
char* s = buf;
280-
int sz = sizeof(buf);
305+
int sz = l->size * 2 + 1;
306+
char* s = buf = s_xmalloc(sz);
281307
for (n = 0; n < l->size; ++n) {
282308
r = snprintf(s, sz, "%02X", ((unsigned char*)l->data)[n]);
283309
if (r < 0 || r >= sz) {
@@ -298,7 +324,12 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
298324
case LTC_ASN1_OBJECT_IDENTIFIER:
299325
name = "OBJECT IDENTIFIER";
300326
{
301-
unsigned long len = sizeof(buf);
327+
unsigned long len = 0;
328+
if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_BUFFER_OVERFLOW) {
329+
fprintf(stderr, "%s WTF\n", name);
330+
exit(EXIT_FAILURE);
331+
}
332+
buf = s_xmalloc(len);
302333
if (pk_oid_num_to_str(l->data, l->size, buf, &len) != CRYPT_OK) {
303334
fprintf(stderr, "%s boom\n", name);
304335
exit(EXIT_FAILURE);
@@ -321,7 +352,9 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
321352
name = "UTCTIME";
322353
{
323354
ltc_utctime* ut = l->data;
324-
snprintf(buf, sizeof(buf), "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d",
355+
slen = 32;
356+
buf = s_xmalloc(slen);
357+
snprintf(buf, slen, "%02d-%02d-%02d %02d:%02d:%02d %c%02d:%02d",
325358
ut->YY, ut->MM, ut->DD, ut->hh, ut->mm, ut->ss,
326359
ut->off_dir ? '-' : '+', ut->off_hh, ut->off_mm);
327360
text = buf;
@@ -331,11 +364,13 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
331364
name = "GENERALIZED TIME";
332365
{
333366
ltc_generalizedtime* gt = l->data;
367+
slen = 32;
368+
buf = s_xmalloc(slen);
334369
if(gt->fs)
335-
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d.%02dZ",
370+
snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02d.%02dZ",
336371
gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss, gt->fs);
337372
else
338-
snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02dZ",
373+
snprintf(buf, slen, "%04d-%02d-%02d %02d:%02d:%02dZ",
339374
gt->YYYY, gt->MM, gt->DD, gt->hh, gt->mm, gt->ss);
340375
text = buf;
341376
}
@@ -366,8 +401,8 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
366401
name = "NON STANDARD";
367402
{
368403
int r;
369-
char* s = buf;
370-
int sz = sizeof(buf);
404+
int sz = 128;
405+
char* s = buf = s_xmalloc(sz);
371406

372407
r = snprintf(s, sz, "[%s %s %llu]", der_asn1_class_to_string_map[l->klass], der_asn1_pc_to_string_map[l->pc], l->tag);
373408
if (r < 0 || r >= sz) {
@@ -394,6 +429,11 @@ static void s_der_tests_print_flexi(ltc_asn1_list* l, unsigned int level)
394429
else
395430
fprintf(stderr, "WTF type=%i\n", l->type);
396431

432+
if (buf) {
433+
s_free(buf);
434+
buf = NULL;
435+
}
436+
397437
if (ostring) {
398438
s_der_tests_print_flexi(ostring, level + 1);
399439
der_free_sequence_flexi(ostring);

0 commit comments

Comments
 (0)