| 628 | } |
| 629 | |
| 630 | apr_status_t md_pkey_fload(md_pkey_t **ppkey, apr_pool_t *p, |
| 631 | const char *key, apr_size_t key_len, |
| 632 | const char *fname) |
| 633 | { |
| 634 | apr_status_t rv = APR_ENOENT; |
| 635 | md_pkey_t *pkey; |
| 636 | BIO *bf; |
| 637 | passwd_ctx ctx; |
| 638 | |
| 639 | pkey = make_pkey(p); |
| 640 | if (NULL != (bf = BIO_new_file(fname, "r"))) { |
| 641 | ctx.pass_phrase = key; |
| 642 | ctx.pass_len = (int)key_len; |
| 643 | |
| 644 | ERR_clear_error(); |
| 645 | pkey->pkey = PEM_read_bio_PrivateKey(bf, NULL, pem_passwd, &ctx); |
| 646 | BIO_free(bf); |
| 647 | |
| 648 | if (pkey->pkey != NULL) { |
| 649 | rv = APR_SUCCESS; |
| 650 | apr_pool_cleanup_register(p, pkey, pkey_cleanup, apr_pool_cleanup_null); |
| 651 | } |
| 652 | else { |
| 653 | unsigned long err = ERR_get_error(); |
| 654 | rv = APR_EINVAL; |
| 655 | md_log_perror(MD_LOG_MARK, MD_LOG_WARNING, rv, p, |
| 656 | "error loading pkey %s: %s (pass phrase was %snull)", fname, |
| 657 | ERR_error_string(err, NULL), key? "not " : ""); |
| 658 | } |
| 659 | } |
| 660 | *ppkey = (APR_SUCCESS == rv)? pkey : NULL; |
| 661 | return rv; |
| 662 | } |
| 663 | |
| 664 | static apr_status_t pkey_to_buffer(md_data_t *buf, md_pkey_t *pkey, apr_pool_t *p, |
| 665 | const char *pass, apr_size_t pass_len) |
no test coverage detected