| 646 | */ |
| 647 | |
| 648 | size_t /* O - Total size of credentials string */ |
| 649 | httpCredentialsString( |
| 650 | cups_array_t *credentials, /* I - Credentials */ |
| 651 | char *buffer, /* I - Buffer or @code NULL@ */ |
| 652 | size_t bufsize) /* I - Size of buffer */ |
| 653 | { |
| 654 | http_credential_t *first; /* First certificate */ |
| 655 | gnutls_x509_crt_t cert; /* Certificate */ |
| 656 | |
| 657 | |
| 658 | DEBUG_printf(("httpCredentialsString(credentials=%p, buffer=%p, bufsize=" CUPS_LLFMT ")", credentials, buffer, CUPS_LLCAST bufsize)); |
| 659 | |
| 660 | if (!buffer) |
| 661 | return (0); |
| 662 | |
| 663 | if (bufsize > 0) |
| 664 | *buffer = '\0'; |
| 665 | |
| 666 | if ((first = (http_credential_t *)cupsArrayFirst(credentials)) != NULL && |
| 667 | (cert = http_gnutls_create_credential(first)) != NULL) |
| 668 | { |
| 669 | char name[256], /* Common name associated with cert */ |
| 670 | issuer[256]; /* Issuer associated with cert */ |
| 671 | size_t len; /* Length of string */ |
| 672 | time_t expiration; /* Expiration date of cert */ |
| 673 | int sigalg; /* Signature algorithm */ |
| 674 | unsigned char md5_digest[16]; /* MD5 result */ |
| 675 | |
| 676 | len = sizeof(name) - 1; |
| 677 | if (gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, name, &len) >= 0) |
| 678 | name[len] = '\0'; |
| 679 | else |
| 680 | strlcpy(name, "unknown", sizeof(name)); |
| 681 | |
| 682 | len = sizeof(issuer) - 1; |
| 683 | if (gnutls_x509_crt_get_issuer_dn_by_oid(cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, issuer, &len) >= 0) |
| 684 | issuer[len] = '\0'; |
| 685 | else |
| 686 | strlcpy(issuer, "unknown", sizeof(issuer)); |
| 687 | |
| 688 | expiration = gnutls_x509_crt_get_expiration_time(cert); |
| 689 | sigalg = gnutls_x509_crt_get_signature_algorithm(cert); |
| 690 | |
| 691 | cupsHashData("md5", first->data, first->datalen, md5_digest, sizeof(md5_digest)); |
| 692 | |
| 693 | snprintf(buffer, bufsize, "%s (issued by %s) / %s / %s / %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", name, issuer, httpGetDateString(expiration), gnutls_sign_get_name((gnutls_sign_algorithm_t)sigalg), md5_digest[0], md5_digest[1], md5_digest[2], md5_digest[3], md5_digest[4], md5_digest[5], md5_digest[6], md5_digest[7], md5_digest[8], md5_digest[9], md5_digest[10], md5_digest[11], md5_digest[12], md5_digest[13], md5_digest[14], md5_digest[15]); |
| 694 | |
| 695 | gnutls_x509_crt_deinit(cert); |
| 696 | } |
| 697 | |
| 698 | DEBUG_printf(("1httpCredentialsString: Returning \"%s\".", buffer)); |
| 699 | |
| 700 | return (strlen(buffer)); |
| 701 | } |
| 702 | |
| 703 | |
| 704 | /* |
no test coverage detected