diff options
-rw-r--r-- | src/lib/libcrypto/objects/obj_dat.c | 71 |
1 files changed, 16 insertions, 55 deletions
diff --git a/src/lib/libcrypto/objects/obj_dat.c b/src/lib/libcrypto/objects/obj_dat.c index 7aecda2641..03e65f1dfe 100644 --- a/src/lib/libcrypto/objects/obj_dat.c +++ b/src/lib/libcrypto/objects/obj_dat.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: obj_dat.c,v 1.46 2022/02/11 16:39:16 jsing Exp $ */ | 1 | /* $OpenBSD: obj_dat.c,v 1.47 2022/02/12 03:01:59 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -526,10 +526,9 @@ OBJ_txt2obj(const char *s, int no_name) | |||
526 | int | 526 | int |
527 | OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) | 527 | OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) |
528 | { | 528 | { |
529 | int i, ret = 0, len, nid, first = 1, use_bn; | 529 | int i, ret = 0, len, nid, first = 1; |
530 | BIGNUM *bl = NULL; | ||
531 | unsigned long l; | ||
532 | const unsigned char *p; | 530 | const unsigned char *p; |
531 | uint64_t l; | ||
533 | 532 | ||
534 | /* Ensure that, at every state, |buf| is NUL-terminated. */ | 533 | /* Ensure that, at every state, |buf| is NUL-terminated. */ |
535 | if (buf_len > 0) | 534 | if (buf_len > 0) |
@@ -554,42 +553,24 @@ OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) | |||
554 | 553 | ||
555 | while (len > 0) { | 554 | while (len > 0) { |
556 | l = 0; | 555 | l = 0; |
557 | use_bn = 0; | ||
558 | for (;;) { | 556 | for (;;) { |
559 | unsigned char c = *p++; | 557 | unsigned char c = *p++; |
560 | len--; | 558 | len--; |
561 | if ((len == 0) && (c & 0x80)) | 559 | if ((len == 0) && (c & 0x80)) |
562 | goto err; | 560 | goto err; |
563 | if (use_bn) { | 561 | l |= c & 0x7f; |
564 | if (!BN_add_word(bl, c & 0x7f)) | ||
565 | goto err; | ||
566 | } else | ||
567 | l |= c & 0x7f; | ||
568 | if (!(c & 0x80)) | 562 | if (!(c & 0x80)) |
569 | break; | 563 | break; |
570 | if (!use_bn && (l > (ULONG_MAX >> 7L))) { | 564 | if (l > (UINT64_MAX >> 7L)) |
571 | if (!bl && !(bl = BN_new())) | 565 | goto err; |
572 | goto err; | 566 | l <<= 7L; |
573 | if (!BN_set_word(bl, l)) | ||
574 | goto err; | ||
575 | use_bn = 1; | ||
576 | } | ||
577 | if (use_bn) { | ||
578 | if (!BN_lshift(bl, bl, 7)) | ||
579 | goto err; | ||
580 | } else | ||
581 | l <<= 7L; | ||
582 | } | 567 | } |
583 | 568 | ||
584 | if (first) { | 569 | if (first) { |
585 | first = 0; | 570 | first = 0; |
586 | if (l >= 80) { | 571 | if (l >= 80) { |
587 | i = 2; | 572 | i = 2; |
588 | if (use_bn) { | 573 | l -= 80; |
589 | if (!BN_sub_word(bl, 80)) | ||
590 | goto err; | ||
591 | } else | ||
592 | l -= 80; | ||
593 | } else { | 574 | } else { |
594 | i = (int)(l / 40); | 575 | i = (int)(l / 40); |
595 | l -= (long)(i * 40); | 576 | l -= (long)(i * 40); |
@@ -602,39 +583,19 @@ OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name) | |||
602 | ret++; | 583 | ret++; |
603 | } | 584 | } |
604 | 585 | ||
605 | if (use_bn) { | 586 | i = snprintf(buf, buf_len, ".%llu", l); |
606 | char *bndec; | 587 | if (i < 0) |
607 | 588 | goto err; | |
608 | bndec = BN_bn2dec(bl); | 589 | if (i >= buf_len) { |
609 | if (!bndec) | 590 | buf_len = 0; |
610 | goto err; | ||
611 | i = snprintf(buf, buf_len, ".%s", bndec); | ||
612 | free(bndec); | ||
613 | if (i < 0) | ||
614 | goto err; | ||
615 | if (i >= buf_len) { | ||
616 | buf_len = 0; | ||
617 | } else { | ||
618 | buf += i; | ||
619 | buf_len -= i; | ||
620 | } | ||
621 | ret += i; | ||
622 | } else { | 591 | } else { |
623 | i = snprintf(buf, buf_len, ".%lu", l); | 592 | buf += i; |
624 | if (i < 0) | 593 | buf_len -= i; |
625 | goto err; | ||
626 | if (i >= buf_len) { | ||
627 | buf_len = 0; | ||
628 | } else { | ||
629 | buf += i; | ||
630 | buf_len -= i; | ||
631 | } | ||
632 | ret += i; | ||
633 | } | 594 | } |
595 | ret += i; | ||
634 | } | 596 | } |
635 | 597 | ||
636 | out: | 598 | out: |
637 | BN_free(bl); | ||
638 | return ret; | 599 | return ret; |
639 | 600 | ||
640 | err: | 601 | err: |