601 | | X509_NAME_ENTRY *ent = X509_NAME_get_entry(x509_name, i); |
602 | | if (ent) |
603 | | { |
604 | | ASN1_STRING *val = X509_NAME_ENTRY_get_data (ent); |
605 | | unsigned char *buf; |
606 | | buf = (unsigned char *)1; /* bug in OpenSSL 0.9.6b ASN1_STRING_to_UTF8 requires this workaround */ |
607 | | if (ASN1_STRING_to_UTF8 (&buf, val) > 0) |
608 | | { |
609 | | do_setenv_x509(es, xt->name, (char *)buf, depth); |
610 | | OPENSSL_free (buf); |
611 | | } |
612 | | } |
| 599 | case NID_sha1: |
| 600 | { |
| 601 | int i; |
| 602 | const int hl = SHA_DIGEST_LENGTH*3+1; |
| 603 | char hash_str[hl]; |
| 604 | char *hs = hash_str; |
| 605 | const unsigned char *src = x509->sha1_hash; |
| 606 | for (i = 0; i < SHA_DIGEST_LENGTH; ++i) |
| 607 | { |
| 608 | openvpn_snprintf(hs, 4, "%02X:", src[i]); |
| 609 | hs += 3; |
| 610 | } |
| 611 | --hs; /* wipe the trailing ':' */ |
| 612 | *hs = '\0'; |
| 613 | do_setenv_x509(es, xt->name, hash_str, depth); |
| 614 | } |
| 615 | break; |
| 616 | default: |
| 617 | { |
| 618 | int i = X509_NAME_get_index_by_NID(x509_name, xt->nid, -1); |
| 619 | if (i >= 0) |
| 620 | { |
| 621 | X509_NAME_ENTRY *ent = X509_NAME_get_entry(x509_name, i); |
| 622 | if (ent) |
| 623 | { |
| 624 | ASN1_STRING *val = X509_NAME_ENTRY_get_data (ent); |
| 625 | unsigned char *buf; |
| 626 | buf = (unsigned char *)1; /* bug in OpenSSL 0.9.6b ASN1_STRING_to_UTF8 requires this workaround */ |
| 627 | if (ASN1_STRING_to_UTF8 (&buf, val) > 0) |
| 628 | { |
| 629 | do_setenv_x509(es, xt->name, (char *)buf, depth); |
| 630 | OPENSSL_free (buf); |
| 631 | } |
| 632 | } |
| 633 | } |
| 634 | else |
| 635 | { |
| 636 | i = X509_get_ext_by_NID(x509, xt->nid, -1); |
| 637 | if (i >= 0) |
| 638 | { |
| 639 | X509_EXTENSION *ext = X509_get_ext(x509, i); |
| 640 | if (ext) |
| 641 | { |
| 642 | BIO *bio = BIO_new(BIO_s_mem()); |
| 643 | if (bio) |
| 644 | { |
| 645 | if (X509V3_EXT_print(bio, ext, 0, 0)) |
| 646 | { |
| 647 | if (BIO_write(bio, &nullc, 1) == 1) |
| 648 | { |
| 649 | char *str; |
| 650 | BIO_get_mem_data(bio, &str); |
| 651 | do_setenv_x509(es, xt->name, str, depth); |
| 652 | } |
| 653 | } |
| 654 | BIO_free(bio); |
| 655 | } |
| 656 | } |
| 657 | } |
| 658 | } |
| 659 | } |
614 | | else |
615 | | { |
616 | | i = X509_get_ext_by_NID(x509, xt->nid, -1); |
617 | | if (i >= 0) |
618 | | { |
619 | | X509_EXTENSION *ext = X509_get_ext(x509, i); |
620 | | if (ext) |
621 | | { |
622 | | BIO *bio = BIO_new(BIO_s_mem()); |
623 | | if (bio) |
624 | | { |
625 | | if (X509V3_EXT_print(bio, ext, 0, 0)) |
626 | | { |
627 | | if (BIO_write(bio, &nullc, 1) == 1) |
628 | | { |
629 | | char *str; |
630 | | BIO_get_mem_data(bio, &str); |
631 | | do_setenv_x509(es, xt->name, str, depth); |
632 | | } |
633 | | } |
634 | | BIO_free(bio); |
635 | | } |
636 | | } |
637 | | } |
638 | | } |