OSSL_CRMF_MSG_GET0_TMPL(3ossl)
π OSSL_CRMF_MSG_GET0_TMPL π
okay so bestie, welcome to OSSL_CRMF_MSG_GET0_TMPL(3ossl) β yes that's the whole manual name, it's a mouthful, we know π β this is the OpenSSL page for the little gang of getters that read stuff out of CRMF CertReqMsg structures. no cap, it's all "get me this field, get me that field" and honestly? we love a low-maintenance API π«Ά
β¨ NAME β¨
okay so it's a whole squad, one page, here's the full lineup (say hi π):
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 what do they all do? they're functions reading from CRMF CertReqMsg structures. that's the vibe check, periodt. π
π SYNOPSIS π
copy this exactly bestie, character for character, no improvising π
#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);
like, it's giving "wall of prototypes" but every single one of them is serving π
πΈ DESCRIPTION πΈ
so here's the tea on each one, going down the list one by one βοΈβ¨
OSSL_CRMF_MSG_get0_tmpl()β snags the certificate template out ofcrm. that's it. that's the whole job. iconic behaviour honestly.OSSL_CRMF_CERTTEMPLATE_get0_publicKey()β pulls out the public key of the certificate templatetmplyou handed it. πOSSL_CRMF_CERTTEMPLATE_get0_subject()β grabs the subject name of the certificate templatetmpl. the "who is this even" field πββοΈOSSL_CRMF_CERTTEMPLATE_get0_issuer()β grabs the issuer name of the certificate templatetmpl. the "who signed off on this" field ποΈOSSL_CRMF_CERTTEMPLATE_get0_serialNumber()β retrieves theserialNumberof the certificate templatetmpl. it's a number, it's serial, we move π’OSSL_CRMF_CERTTEMPLATE_get0_extensions()β retrieves the X.509 extensions of the certificate templatetmpl, orNULLif not present. no extensions? no problem, you just getNULL, don't @ me πOSSL_CRMF_CERTID_get0_serialNumberβ retrieves theserialNumberof the givenCertIdcid. (yes, no parentheses on this one in the original, that's just how it's written, we don't fix, we don't argue, we copy π«‘)OSSL_CRMF_CERTID_get0_issuerβ retrieves the issuer name of the givenCertIdcid, which must be of ASN.1 typeGEN_DIRNAME. important!! don't try to be cute with other types, it literally says must π₯OSSL_CRMF_ENCRYPTEDKEY_get1_encCert()β decrypts the certificate in the givenencryptedKeyecert, using the private keypkey, library contextlibctxand property query stringpropq(seeOSSL_LIB_CTX(3)). 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. β οΈ you own it, you free it, that's the deal bestie π«ΆOSSL_CRMF_ENCRYPTEDKEY_get1_pkey()β decrypts the private key inencryptedKey. ifencryptedKeyis not of typeOSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA, decryption uses the private keypkey. the library contextlibctxand property querypropqare taken into account as usual. π now, the rest of this paragraph is relevant only if CMS support not disabled for the OpenSSL build andencryptedKeyis of type caseOSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA. decryption uses thesecretparameter if notNULL; otherwise uses the private key<pkey>and the certificatecertrelated topkey, wherecertis recommended to be given if available. on success, the function verifies the decrypted data as signed data, using the trust storetsand any untrusted certificates inextra. doing so, it checks for the purpose "CMP Key Generation Authority" (cmKGA). like, it's thorough, it's doing the most, and honestly? it should π
ngl that paragraph is a lot, so re-read it if you need to β every conditional in there matters and i'm not about to paraphrase away your only warning about CMS support being disabled in your build π
OSSL_CRMF_ENCRYPTEDKEY_init_envdata()β returnsOSSL_CRMF_ENCRYPTEDKEY, initialized with the enveloped dataenvdata. fresh out the box, pre-loaded πOSSL_CRMF_ENCRYPTEDVALUE_decrypt()β decrypts the encrypted value in the givenencryptedValueenc, using the private keypkey, library contextlibctxand property query stringpropq(seeOSSL_LIB_CTX(3)). πOSSL_CRMF_ENCRYPTEDVALUE_get1_encCert()β decrypts the certificate in the givenencryptedValueecert, using the private keypkey, library contextlibctxand property query stringpropq(seeOSSL_LIB_CTX(3)). 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 drill: caller frees it, don't forget or it's a leak, and leaks are not the aesthetic πΈOSSL_CRMF_MSG_get_certReqId()β retrieves thecertReqIdofcrm. short, sweet, to the point β¨OSSL_CRMF_MSG_centralkeygen_requested()β returns1if central key generation is requested, i.e. the public key in the certificate request (crmis taken if it is non-NULL, otherwisep10cr) isNULLor has an empty key value (with length zero). in casecrmis non-NULL, this is checked for consistency with itspopofield (must beNULLif and only if central key generation is requested). otherwise it returns0, and on error a negative value. π so:1= yes bestie,0= nah, negative = something went sideways. got it? got it. π
π¦ 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 check forNULL, that's the whole mood π
π SEE ALSO π
RFC 4211β go read it, i believe in you πβ¨
π HISTORY π
the lore, chronologically:
- the OpenSSL CRMF support was added in OpenSSL 3.0. og era π°οΈ
OSSL_CRMF_CERTTEMPLATE_get0_publicKey()was added in OpenSSL 3.2. glow-up era β¨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. fresh drop, new arrivals, we ate π₯
π 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>. legal stuff, but make it cute π
okay that's the whole page bestie, you're officially CRMF-literate π
β¨ mwah, go forth and check your NULLs. this was OSSL_CRMF_MSG_GET0_TMPL(3ossl) from the 3.5.6 drop, dated 2026-04-07 β see you in the next manpage, love u, bye π¦ππ
π¦ where this page comes from
- freebsd 15.1: base 15.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms