diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/usr.bin/openssl/x509.c | 141 |
1 files changed, 133 insertions, 8 deletions
diff --git a/src/usr.bin/openssl/x509.c b/src/usr.bin/openssl/x509.c index 1ebdfb005f..fc8a0daeb3 100644 --- a/src/usr.bin/openssl/x509.c +++ b/src/usr.bin/openssl/x509.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: x509.c,v 1.39 2024/05/27 16:12:55 tb Exp $ */ | 1 | /* $OpenBSD: x509.c,v 1.40 2024/12/04 08:14:34 tb 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 | * |
@@ -1595,7 +1595,119 @@ callb(int ok, X509_STORE_CTX *ctx) | |||
1595 | } | 1595 | } |
1596 | } | 1596 | } |
1597 | 1597 | ||
1598 | /* self sign */ | 1598 | static int |
1599 | key_identifier_hash(EVP_PKEY *pkey, unsigned char *md, unsigned int *md_len) | ||
1600 | { | ||
1601 | X509_PUBKEY *x509_pubkey = NULL; | ||
1602 | const unsigned char *der; | ||
1603 | int der_len; | ||
1604 | int ret = 0; | ||
1605 | |||
1606 | if (*md_len < SHA_DIGEST_LENGTH) | ||
1607 | goto err; | ||
1608 | |||
1609 | if (!X509_PUBKEY_set(&x509_pubkey, pkey)) | ||
1610 | goto err; | ||
1611 | if (!X509_PUBKEY_get0_param(NULL, &der, &der_len, NULL, x509_pubkey)) | ||
1612 | goto err; | ||
1613 | if (!EVP_Digest(der, der_len, md, md_len, EVP_sha1(), NULL)) | ||
1614 | goto err; | ||
1615 | |||
1616 | ret = 1; | ||
1617 | |||
1618 | err: | ||
1619 | X509_PUBKEY_free(x509_pubkey); | ||
1620 | |||
1621 | return ret; | ||
1622 | } | ||
1623 | |||
1624 | static ASN1_OCTET_STRING * | ||
1625 | compute_key_identifier(EVP_PKEY *pkey) | ||
1626 | { | ||
1627 | ASN1_OCTET_STRING *ki = NULL; | ||
1628 | unsigned char md[EVP_MAX_MD_SIZE]; | ||
1629 | unsigned int md_len = EVP_MAX_MD_SIZE; | ||
1630 | |||
1631 | if (!key_identifier_hash(pkey, md, &md_len)) | ||
1632 | goto err; | ||
1633 | |||
1634 | if ((ki = ASN1_OCTET_STRING_new()) == NULL) | ||
1635 | goto err; | ||
1636 | if (!ASN1_STRING_set(ki, md, md_len)) | ||
1637 | goto err; | ||
1638 | |||
1639 | return ki; | ||
1640 | |||
1641 | err: | ||
1642 | ASN1_OCTET_STRING_free(ki); | ||
1643 | |||
1644 | return NULL; | ||
1645 | } | ||
1646 | |||
1647 | static ASN1_OCTET_STRING * | ||
1648 | compute_subject_key_identifier(EVP_PKEY *subject_key) | ||
1649 | { | ||
1650 | return compute_key_identifier(subject_key); | ||
1651 | } | ||
1652 | |||
1653 | static AUTHORITY_KEYID * | ||
1654 | compute_authority_key_identifier(EVP_PKEY *issuer_key) | ||
1655 | { | ||
1656 | AUTHORITY_KEYID *aki = NULL; | ||
1657 | |||
1658 | if ((aki = AUTHORITY_KEYID_new()) == NULL) | ||
1659 | goto err; | ||
1660 | if ((aki->keyid = compute_key_identifier(issuer_key)) == NULL) | ||
1661 | goto err; | ||
1662 | |||
1663 | return aki; | ||
1664 | |||
1665 | err: | ||
1666 | AUTHORITY_KEYID_free(aki); | ||
1667 | |||
1668 | return NULL; | ||
1669 | } | ||
1670 | |||
1671 | static int | ||
1672 | set_key_identifiers(X509 *cert, EVP_PKEY *issuer_key) | ||
1673 | { | ||
1674 | EVP_PKEY *subject_key; | ||
1675 | ASN1_OCTET_STRING *ski = NULL; | ||
1676 | AUTHORITY_KEYID *aki = NULL; | ||
1677 | int ret = 0; | ||
1678 | |||
1679 | if ((subject_key = X509_get0_pubkey(cert)) == NULL) | ||
1680 | goto err; | ||
1681 | |||
1682 | if ((ski = compute_subject_key_identifier(subject_key)) == NULL) | ||
1683 | goto err; | ||
1684 | if (!X509_add1_ext_i2d(cert, NID_subject_key_identifier, ski, 0, | ||
1685 | X509V3_ADD_REPLACE)) | ||
1686 | goto err; | ||
1687 | |||
1688 | /* | ||
1689 | * Historical OpenSSL behavior: don't set AKI if we're self-signing. | ||
1690 | * RFC 5280 says we MAY omit it, so this is ok. | ||
1691 | */ | ||
1692 | if (EVP_PKEY_cmp(subject_key, issuer_key) == 1) | ||
1693 | goto done; | ||
1694 | |||
1695 | if ((aki = compute_authority_key_identifier(issuer_key)) == NULL) | ||
1696 | goto err; | ||
1697 | if (!X509_add1_ext_i2d(cert, NID_authority_key_identifier, aki, 0, | ||
1698 | X509V3_ADD_REPLACE)) | ||
1699 | goto err; | ||
1700 | |||
1701 | done: | ||
1702 | ret = 1; | ||
1703 | |||
1704 | err: | ||
1705 | ASN1_OCTET_STRING_free(ski); | ||
1706 | AUTHORITY_KEYID_free(aki); | ||
1707 | |||
1708 | return ret; | ||
1709 | } | ||
1710 | |||
1599 | static int | 1711 | static int |
1600 | sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, | 1712 | sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, |
1601 | CONF *conf, char *section, X509_NAME *issuer, char *force_pubkey) | 1713 | CONF *conf, char *section, X509_NAME *issuer, char *force_pubkey) |
@@ -1617,12 +1729,7 @@ sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, | |||
1617 | if (X509_gmtime_adj(X509_get_notBefore(x), 0) == NULL) | 1729 | if (X509_gmtime_adj(X509_get_notBefore(x), 0) == NULL) |
1618 | goto err; | 1730 | goto err; |
1619 | 1731 | ||
1620 | /* Lets just make it 12:00am GMT, Jan 1 1970 */ | 1732 | if (X509_gmtime_adj(X509_get_notAfter(x), 60L * 60 * 24 * days) == NULL) |
1621 | /* memcpy(x->cert_info->validity->notBefore,"700101120000Z",13); */ | ||
1622 | /* 28 days to be certified */ | ||
1623 | |||
1624 | if (X509_gmtime_adj(X509_get_notAfter(x), | ||
1625 | (long) 60 * 60 * 24 * days) == NULL) | ||
1626 | goto err; | 1733 | goto err; |
1627 | 1734 | ||
1628 | if (force_pubkey == NULL) { | 1735 | if (force_pubkey == NULL) { |
@@ -1637,12 +1744,30 @@ sign(X509 *x, EVP_PKEY *pkey, int days, int clrext, const EVP_MD *digest, | |||
1637 | } | 1744 | } |
1638 | if (conf != NULL) { | 1745 | if (conf != NULL) { |
1639 | X509V3_CTX ctx; | 1746 | X509V3_CTX ctx; |
1747 | |||
1640 | if (!X509_set_version(x, 2)) /* version 3 certificate */ | 1748 | if (!X509_set_version(x, 2)) /* version 3 certificate */ |
1641 | goto err; | 1749 | goto err; |
1642 | X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0); | 1750 | X509V3_set_ctx(&ctx, x, x, NULL, NULL, 0); |
1643 | X509V3_set_nconf(&ctx, conf); | 1751 | X509V3_set_nconf(&ctx, conf); |
1644 | if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) | 1752 | if (!X509V3_EXT_add_nconf(conf, &ctx, section, x)) |
1645 | goto err; | 1753 | goto err; |
1754 | if (force_pubkey != NULL) { | ||
1755 | /* | ||
1756 | * Set or fix up SKI and AKI. | ||
1757 | * | ||
1758 | * XXX - Doing this in a fully OpenSSL 3 compatible way | ||
1759 | * is extremely nasty: they hang an issuer_pubkey off | ||
1760 | * the X509V3_CTX and adjusted v2i_AUTHORITY_KEYID(). | ||
1761 | * Punt on this and make things work in the specific | ||
1762 | * situation we're interested in. Like OpenSSL, we only | ||
1763 | * support the keyid form of the AKI, which is what | ||
1764 | * RFC 5280 recommends, but unlike OpenSSL we replace | ||
1765 | * existing SKI and AKI rather than honoring the most | ||
1766 | * likely outdated ones already present in the cert. | ||
1767 | */ | ||
1768 | if (!set_key_identifiers(x, pkey)) | ||
1769 | goto err; | ||
1770 | } | ||
1646 | } | 1771 | } |
1647 | if (!X509_sign(x, pkey, digest)) | 1772 | if (!X509_sign(x, pkey, digest)) |
1648 | goto err; | 1773 | goto err; |