OSSL_CRMF_MSG_GET0_TMPL(3ossl)
π OSSL_CRMF_MSG_GET0_TMPL π
okay bestie, this is the 3ossl manual page for a whole little squad of functions that read stuff out of CRMF CertReqMsg structures. like, they don't build anything, they just look inside and hand you a pointer. very demure, very minding-their-own-business. β¨
πΈ NAME πΈ
OSSL_CRMF_MSG_get0_tmpl, OSSL_CRMF_CERTTEMPLATE_get0_publicKey, OSSL_CRMF_CERTTEMPLATE_get0_subject, OSSL_CRMF_CERTTEMPLATE_get0_issuer, OSSL_CRMF_CERTTEMPLATE_get0_serialNumber, OSSL_CRMF_CERTTEMPLATE_get0_extensions, OSSL_CRMF_CERTID_get0_serialNumber, OSSL_CRMF_CERTID_get0_issuer, OSSL_CRMF_ENCRYPTEDKEY_get1_encCert, OSSL_CRMF_ENCRYPTEDKEY_get1_pkey, OSSL_CRMF_ENCRYPTEDKEY_init_envdata, OSSL_CRMF_ENCRYPTEDVALUE_decrypt, OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert, OSSL_CRMF_MSG_get_certReqId, OSSL_CRMF_MSG_centralkeygen_requested β functions reading from CRMF CertReqMsg structures π¦
β¨ SYNOPSIS β¨
#include <openssl/crmf.h>
OSSL_CRMF_CERTTEMPLATE *OSSL_CRMF_MSG_get0_tmpl(const OSSL_CRMF_MSG *crm);
X509_PUBKEY
*OSSL_CRMF_CERTTEMPLATE_get0_publicKey(const OSSL_CRMF_CERTTEMPLATE *tmpl);
const X509_NAME
*OSSL_CRMF_CERTTEMPLATE_get0_subject(const OSSL_CRMF_CERTTEMPLATE *tmpl);
const X509_NAME
*OSSL_CRMF_CERTTEMPLATE_get0_issuer(const OSSL_CRMF_CERTTEMPLATE *tmpl);
const ASN1_INTEGER
*OSSL_CRMF_CERTTEMPLATE_get0_serialNumber(const OSSL_CRMF_CERTTEMPLATE *tmpl);
X509_EXTENSIONS
*OSSL_CRMF_CERTTEMPLATE_get0_extensions(const OSSL_CRMF_CERTTEMPLATE *tmpl);
const ASN1_INTEGER
*OSSL_CRMF_CERTID_get0_serialNumber(const OSSL_CRMF_CERTID *cid);
const X509_NAME *OSSL_CRMF_CERTID_get0_issuer(const OSSL_CRMF_CERTID *cid);
X509 *OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(const OSSL_CRMF_ENCRYPTEDKEY *ecert,
OSSL_LIB_CTX *libctx, const char *propq,
EVP_PKEY *pkey, unsigned int flags);
EVP_PKEY
*OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(OSSL_CRMF_ENCRYPTEDKEY *encryptedKey,
X509_STORE *ts, STACK_OF(X509) *extra,
EVP_PKEY *pkey, X509 *cert,
ASN1_OCTET_STRING *secret,
OSSL_LIB_CTX *libctx, const char *propq);
OSSL_CRMF_ENCRYPTEDKEY
*OSSL_CRMF_ENCRYPTEDKEY_init_envdata(CMS_EnvelopedData *envdata);
unsigned char
*OSSL_CRMF_ENCRYPTEDVALUE_decrypt(const OSSL_CRMF_ENCRYPTEDVALUE *enc,
OSSL_LIB_CTX *libctx, const char *propq,
EVP_PKEY *pkey, int *outlen);
X509
*OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert(const OSSL_CRMF_ENCRYPTEDVALUE *ecert,
OSSL_LIB_CTX *libctx, const char *propq,
EVP_PKEY *pkey);
int OSSL_CRMF_MSG_get_certReqId(const OSSL_CRMF_MSG *crm);
int OSSL_CRMF_MSG_centralkeygen_requested(const OSSL_CRMF_MSG *crm,
const X509_REQ *p10cr);
π DESCRIPTION π
OSSL_CRMF_MSG_get0_tmpl() pulls the certificate template out of crm. like, the whole template. here you go bestie. π
OSSL_CRMF_CERTTEMPLATE_get0_publicKey() grabs the public key from the certificate template tmpl you handed it.
OSSL_CRMF_CERTTEMPLATE_get0_subject() gets the subject name of that certificate template tmpl.
OSSL_CRMF_CERTTEMPLATE_get0_issuer() gets the issuer name of the given certificate template tmpl.
OSSL_CRMF_CERTTEMPLATE_get0_serialNumber() gets the serialNumber of the given certificate template tmpl.
OSSL_CRMF_CERTTEMPLATE_get0_extensions() gets the X.509 extensions of the given certificate template tmpl, or NULL if they're not present. no extensions, no problem. π
OSSL_CRMF_CERTID_get0_serialNumber gets the serialNumber of the given CertId cid.
OSSL_CRMF_CERTID_get0_issuer gets the issuer name of the given CertId cid, and heads up, that one must be of ASN.1 type GEN_DIRNAME. like it's giving requirements, respectfully. π
OSSL_CRMF_ENCRYPTEDKEY_get1_encCert() decrypts the certificate sitting in the given encryptedKey ecert, using the private key pkey, the library context libctx and the property query string propq (peep OSSL_LIB_CTX(3) for that one). this is needed for the indirect POPO method as in RFC 9810 section 5.2.8.3.2. the function returns the decrypted certificate as a copy, and ownership stays with the caller, who is the one responsible for freeing it. yes bestie, you free it. not me. π₯
OSSL_CRMF_ENCRYPTEDKEY_get1_pkey() decrypts the private key in encryptedKey. if encryptedKey is not of type OSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA, the decryption just uses the private key pkey. the library context libctx and property query propq are taken into account as usual, obviously, we're not animals. π«Ά
okay so the rest of this paragraph only matters if CMS support is not disabled for the OpenSSL build and encryptedKey is of type case OSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA. (yes, that's the original wording, "type case", we don't make the rules.) in that case, decryption uses the secret parameter if it's not NULL; otherwise it uses the private key <pkey> and the certificate cert related to pkey, where cert is recommended to be given if available. on success, the function verifies the decrypted data as signed data, using the trust store ts and any untrusted certificates in extra. and while doing all that, it checks for the purpose "CMP Key Generation Authority" (cmKGA). so fancy. π
OSSL_CRMF_ENCRYPTEDKEY_init_envdata() returns OSSL_CRMF_ENCRYPTEDKEY, initialized with the enveloped data envdata.
OSSL_CRMF_ENCRYPTEDVALUE_decrypt() decrypts the encrypted value in the given encryptedValue enc, using the private key pkey, library context libctx and property query string propq (again, OSSL_LIB_CTX(3)).
OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert() decrypts the certificate in the given encryptedValue ecert, using the private key pkey, library context libctx and property query string propq (yes, OSSL_LIB_CTX(3), we know). this is needed for the indirect POPO method as in RFC 9810 section 5.2.8.3.2. the function returns the decrypted certificate as a copy, leaving its ownership with the caller, who is responsible for freeing it. same deal as before β the copy is yours to free. π
OSSL_CRMF_MSG_get_certReqId() retrieves the certReqId of crm.
OSSL_CRMF_MSG_centralkeygen_requested() returns 1 if central key generation is requested, i.e., the public key in the certificate request (crm is taken if it's non-NULL, otherwise p10cr) is NULL or has an empty key value (with length zero). in case crm is non-NULL, this is checked for consistency with its popo field (which must be NULL if and only if central key generation is requested). otherwise it returns 0, and on error a negative value. so basically it's a yes / no / uh-oh situation. β
π₯ RETURN VALUES π₯
OSSL_CRMF_MSG_get_certReqId()returns the certificate request ID as a nonnegative integer, or-1on error.OSSL_CRMF_MSG_centralkeygen_requested()returns1if central key generation is requested,0if it is not requested, and a negative value on error.- all the other functions return a pointer with the intended result, or
NULLon error. so like, always vibe check that pointer, bestie. π
π SEE ALSO π
π HISTORY π
- the OpenSSL CRMF support was added in OpenSSL 3.0.
OSSL_CRMF_CERTTEMPLATE_get0_publicKey()was added in OpenSSL 3.2.OSSL_CRMF_ENCRYPTEDKEY_get1_encCert(),OSSL_CRMF_ENCRYPTEDKEY_get1_pkey(),OSSL_CRMF_ENCRYPTEDKEY_init_envdata(),OSSL_CRMF_ENCRYPTEDVALUE_decrypt()andOSSL_CRMF_MSG_centralkeygen_requested()were added in OpenSSL 3.5. glow-up era. π
π COPYRIGHT π
Copyright 2007-2025 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
and that's the whole page, bestie!! this was 3.5.9, dated 2026-09-29, from the OSSL_CRMF_MSG_GET0_TMPL(3ossl) manual. no cap, you now know CRMF reads. go off. π¦πβ¨
π¦ where this page comes from
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms