OSSL_CRMF_MSG_GET0_TMPL(3SSL)
β¨ OSSL_CRMF_MSG_GET0_TMPL(3SSL) β¨
okay bestie, welcome to the 3SSL section of the OpenSSL manual β this is the one where we meet a whole lil friend group of functions that read stuff out of CRMF CertReqMsg structures. no cap, it's giving "getters, but make it certificate request management framework". π
π NAME π
So the whole squad is:
OSSL_CRMF_MSG_get0_tmplOSSL_CRMF_CERTTEMPLATE_get0_publicKeyOSSL_CRMF_CERTTEMPLATE_get0_subjectOSSL_CRMF_CERTTEMPLATE_get0_issuerOSSL_CRMF_CERTTEMPLATE_get0_serialNumberOSSL_CRMF_CERTTEMPLATE_get0_extensionsOSSL_CRMF_CERTID_get0_serialNumberOSSL_CRMF_CERTID_get0_issuerOSSL_CRMF_ENCRYPTEDKEY_get1_encCertOSSL_CRMF_ENCRYPTEDKEY_get1_pkeyOSSL_CRMF_ENCRYPTEDKEY_init_envdataOSSL_CRMF_ENCRYPTEDVALUE_decryptOSSL_CRMF_ENCRYPTEDVALUE_get1_encCertOSSL_CRMF_MSG_get_certReqIdOSSL_CRMF_MSG_centralkeygen_requested
β¦and together they're literally just functions reading from CRMF CertReqMsg structures. iconic behavior tbh. π
π¦ 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 *p10);
πΈ DESCRIPTION πΈ
let's go one by one, bestie, no skimming, we're eating the whole plate π
OSSL_CRMF_MSG_get0_tmpl()β pulls out the certificate template ofcrm.OSSL_CRMF_CERTTEMPLATE_get0_publicKey()β hands you the public key of the given certificate templatetmpl.OSSL_CRMF_CERTTEMPLATE_get0_subject()β grabs the subject name of the given certificate templatetmpl.OSSL_CRMF_CERTTEMPLATE_get0_issuer()β gets the issuer name of the given certificate templatetmpl.OSSL_CRMF_CERTTEMPLATE_get0_serialNumber()β retrieves theserialNumberof the given certificate templatetmpl.OSSL_CRMF_CERTTEMPLATE_get0_extensions()β gets the X.509 extensions of the given certificate templatetmpl, orNULLif they're justβ¦ not there. πOSSL_CRMF_CERTID_get0_serialNumberβ retrieves theserialNumberof the givenCertIdcid.OSSL_CRMF_CERTID_get0_issuerβ retrieves the issuer name of the givenCertIdcid, which must be of ASN.1 typeGEN_DIRNAME. no exceptions, she's specific. πOSSL_CRMF_ENCRYPTEDKEY_get1_encCert()β decrypts the certificate sitting in the givenencryptedKeyecert, using the private keypkey, library contextlibctxand property query stringpropq(peepOSSL_LIB_CTX(3)). this is the move you need for the indirect POPO method, exactly as laid out in RFC 9810 section 5.2.8.3.2. it returns the decrypted certificate as a copy, so ownership stays with you, the caller, and you're the one responsible for freeing it. π«ΆOSSL_CRMF_ENCRYPTEDKEY_get1_pkey()β decrypts the private key insideencryptedKey. ifencryptedKeyis not of typeOSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA, the decryption just uses the private keypkey. the library contextlibctxand property querypropqget taken into account like always. everything after this sentence only matters if CMS support is not disabled for the OpenSSL build andencryptedKeyis of typeOSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA: decryption uses thesecretparameter when it isn'tNULL; otherwise it uses the private keypkeyand the certificatecertrelated topkey, and honestly you're encouraged to passcertwhen you've got it. on success it verifies the decrypted data as signed data, using the trust storetsand any untrusted certificates inextra. while doing all that, it checks for the purpose"CMP Key Generation Authority"(cmKGA). πOSSL_CRMF_ENCRYPTEDKEY_init_envdata()β returns anOSSL_CRMF_ENCRYPTEDKEY, initialized with the enveloped dataenvdata.OSSL_CRMF_ENCRYPTEDVALUE_decrypt()β decrypts the encrypted value in the givenencryptedValueenc, using the private keypkey, library contextlibctxand property query stringpropq(again,OSSL_LIB_CTX(3)).OSSL_CRMF_ENCRYPTEDVALUE_get1_encCert()β decrypts the certificate in the givenencryptedValueecert, using the private keypkey, library contextlibctxand property query stringpropq(yes,OSSL_LIB_CTX(3)). needed for the indirect POPO method, RFC 9810 section 5.2.8.3.2, same deal. returns the decrypted certificate as a copy β ownership is yours, you free it. πOSSL_CRMF_MSG_get_certReqId()β retrieves thecertReqIdofcrm.OSSL_CRMF_MSG_centralkeygen_requested()β returns1if central key generation is requested, meaning the public key in the certificate request (crmis used if it's non-NULL, otherwisep10) isNULLor has an empty key value with length zero. whencrmis non-NULL, this gets checked for consistency with itspopofield, which must beNULLif and only if central key generation is requested. otherwise it returns0, and on error it returns a negative value. π
π 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.
fr fr, if you see a NULL come back, that's the error era, not the slay era. π
π₯ 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.
π COPYRIGHT π
Copyright 2007-2026 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 β straight from version 4.0.3, dated 2026-09-29, OSSL_CRMF_MSG_GET0_TMPL(3SSL). you ate that documentation. periodt. π
β¨π
π¦ where this page comes from
- ubuntu stonking: libssl-doc 4.0.3-1ubuntu1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms