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_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

…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 of crm.
  • OSSL_CRMF_CERTTEMPLATE_get0_publicKey() β€” hands you the public key of the given certificate template tmpl.
  • OSSL_CRMF_CERTTEMPLATE_get0_subject() β€” grabs the subject name of the given certificate template tmpl.
  • OSSL_CRMF_CERTTEMPLATE_get0_issuer() β€” gets the issuer name of the given certificate template tmpl.
  • OSSL_CRMF_CERTTEMPLATE_get0_serialNumber() β€” retrieves 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 just… not there. πŸ™ˆ
  • OSSL_CRMF_CERTID_get0_serialNumber β€” retrieves the serialNumber of the given CertId cid.
  • OSSL_CRMF_CERTID_get0_issuer β€” retrieves the issuer name of the given CertId cid, which must be of ASN.1 type GEN_DIRNAME. no exceptions, she's specific. πŸ’…
  • OSSL_CRMF_ENCRYPTEDKEY_get1_encCert() β€” decrypts the certificate sitting in the given encryptedKey ecert, using the private key pkey, library context libctx and property query string propq (peep OSSL_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 inside 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 get taken into account like always. everything after this sentence only matters if CMS support is not disabled for the OpenSSL build and encryptedKey is of type OSSL_CRMF_ENCRYPTEDKEY_ENVELOPEDDATA: decryption uses the secret parameter when it isn't NULL; otherwise it uses the private key pkey and the certificate cert related to pkey, and honestly you're encouraged to pass cert when you've got it. on success it verifies the decrypted data as signed data, using the trust store ts and any untrusted certificates in extra. while doing all that, it checks for the purpose "CMP Key Generation Authority" (cmKGA). πŸ‘‘
  • OSSL_CRMF_ENCRYPTEDKEY_init_envdata() β€” returns an 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)). 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 the certReqId of crm.
  • OSSL_CRMF_MSG_centralkeygen_requested() β€” returns 1 if central key generation is requested, meaning the public key in the certificate request (crm is used if it's non-NULL, otherwise p10) is NULL or has an empty key value with length zero. when crm is non-NULL, this gets 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 it returns a negative value. πŸ’€

πŸ‘‘ RETURN VALUES πŸ‘‘

  • OSSL_CRMF_MSG_get_certReqId() β€” returns the certificate request ID as a nonnegative integer, or -1 on error.
  • OSSL_CRMF_MSG_centralkeygen_requested() β€” returns 1 if central key generation is requested, 0 if it is not requested, and a negative value on error.
  • all the other functions β€” return a pointer with the intended result, or NULL on 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() and OSSL_CRMF_MSG_centralkeygen_requested() were added in OpenSSL 3.5.

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