X509_PUBKEY_NEW(3ossl)

πŸ“¦ version 3.5.0, in opensuse-leap 16.0

✨ X509_PUBKEY_NEW πŸ’…

okay bestie, so this is the OpenSSL 3ossl page for all the SubjectPublicKeyInfo public key functions, and honestly? it's giving crypto-baddie energy πŸŽ€

It covers X509_PUBKEY_new_ex, X509_PUBKEY_new, X509_PUBKEY_free, X509_PUBKEY_dup, X509_PUBKEY_set, X509_PUBKEY_get0, X509_PUBKEY_get, d2i_PUBKEY_ex, d2i_PUBKEY, i2d_PUBKEY, d2i_PUBKEY_ex_bio, d2i_PUBKEY_bio, d2i_PUBKEY_ex_fp, d2i_PUBKEY_fp, i2d_PUBKEY_fp, i2d_PUBKEY_bio, X509_PUBKEY_set0_public_key, X509_PUBKEY_set0_param, X509_PUBKEY_get0_param, and X509_PUBKEY_eq. all icon behavior fr fr πŸ‘‘


🌸 SYNOPSIS 🌸

#include <openssl/x509.h>

X509_PUBKEY *X509_PUBKEY_new_ex(OSSL_LIB_CTX *libctx, const char *propq);
X509_PUBKEY *X509_PUBKEY_new(void);
void X509_PUBKEY_free(X509_PUBKEY *a);
X509_PUBKEY *X509_PUBKEY_dup(const X509_PUBKEY *a);

int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey);
EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key);
EVP_PUBKEY *X509_PUBKEY_get(const X509_PUBKEY *key);

wait ngl don't copy that one, let me give you the real line πŸ’€

EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key);

okay slay, carrying on:

EVP_PKEY *d2i_PUBKEY_ex(EVP_PKEY **a, const unsigned char **pp, long length,
                        OSSL_LIB_CTX *libctx, const char *propq);
EVP_PKEY *d2i_PUBKEY(EVP_PKEY **a, const unsigned char **pp, long length);
int i2d_PUBKEY(const EVP_PKEY *a, unsigned char **pp);

EVP_PKEY *d2i_PUBKEY_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
                            const char *propq);
EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);

EVP_PKEY *d2i_PUBKEY_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
                           const char *propq);
EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);

int i2d_PUBKEY_fp(const FILE *fp, EVP_PKEY *pkey);
int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey);

void X509_PUBKEY_set0_public_key(X509_PUBKEY *pub,
                                 unsigned char *penc, int penclen);
int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj,
                           int ptype, void *pval,
                           unsigned char *penc, int penclen);
int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg,
                           const unsigned char **pk, int *ppklen,
                           X509_ALGOR **pa, const X509_PUBKEY *pub);
int X509_PUBKEY_eq(X509_PUBKEY *a, X509_PUBKEY *b);

πŸ¦‹ DESCRIPTION πŸ¦‹

so the X509_PUBKEY structure is literally the ASN.1 SubjectPublicKeyInfo structure (defined in RFC5280), the one that shows up inside certificates and certificate requests. main character energy, honestly πŸ’–

X509_PUBKEY_new_ex() allocates and initializes an X509_PUBKEY structure, and it's associated with whatever OSSL_LIB_CTX you hand it in the libctx parameter. any algorithm fetches that happen from using the X509_PUBKEY object will use the property query string propq. if you wanna know more about algorithm fetching, go peek at "ALGORITHM FETCHING" in crypto(7) β€” iykyk πŸ“š

X509_PUBKEY_new() is the exact same as X509_PUBKEY_new_ex() except it uses the default (NULL) OSSL_LIB_CTX and a NULL property query string. no frills, no notes πŸ’…

X509_PUBKEY_dup() creates a duplicate copy of the X509_PUBKEY object specified by a. twin moment 🫢

X509_PUBKEY_free() frees up the X509_PUBKEY structure a. and if a is NULL, literally nothing is done. no drama, no crash, we love a safe lil cancel 😌

X509_PUBKEY_set() sets the public key in *x to the public key contained in the EVP_PKEY structure pkey. heads up: if *x is not NULL, any existing public key structure will be freed first. out with the old, in with the new πŸ’«

X509_PUBKEY_get0() returns the public key contained in key. important: the returned value is an internal pointer which MUST NOT be freed after use. don't touch it, don't free it, just admire it from a respectful distance πŸ™ˆ

X509_PUBKEY_get() is like X509_PUBKEY_get0() except the reference count on the returned key gets incremented, so it MUST be freed using EVP_PKEY_free() after use. you're responsible for this one, bestie πŸ”₯

d2i_PUBKEY_ex() decodes an EVP_PKEY structure using SubjectPublicKeyInfo format. some public key decoding implementations may use cryptographic algorithms β€” and in that case the supplied library context libctx and property query string propq get used. d2i_PUBKEY() does the same as d2i_PUBKEY_ex() except it uses the default library context and property query string ⭐

i2d_PUBKEY() encodes an EVP_PKEY structure using SubjectPublicKeyInfo format. the reverse slay πŸ’–

d2i_PUBKEY_bio(), d2i_PUBKEY_fp(), i2d_PUBKEY_bio() and i2d_PUBKEY_fp() are similar to d2i_PUBKEY() and i2d_PUBKEY() except they decode or encode using a BIO or FILE pointer. same vibe, different vehicle πŸš—

d2i_PUBKEY_ex_bio() and d2i_PUBKEY_ex_fp() are similar to d2i_PUBKEY_ex() except they decode using a BIO or FILE pointer. yup, that's it, that's the whole note ✨

X509_PUBKEY_set0_public_key() sets the public-key encoding of pub to the penclen bytes contained in buffer penc. any earlier public-key encoding in pub gets freed. and penc may be NULL to indicate that there is no actual public key data. ownership of the penc argument is passed to pub β€” so don't go freeing it after, you gave it away πŸ’€

X509_PUBKEY_set0_param() sets the public-key parameters of pub. the OID associated with the algorithm gets set to aobj. the type of the algorithm parameters gets set to type using the structure pval. if penc is not NULL, the encoding of the public key itself gets set to the penclen bytes contained in buffer penc, and any earlier public-key encoding in pub is freed. on success, ownership of all the supplied arguments is passed to pub, so they must not be freed after the call. like, all of them. everything. it's theirs now πŸ‘‘πŸ˜­

X509_PUBKEY_get0_param() retrieves the public key parameters from pub. *ppkalg gets set to the associated OID, the encoding consists of *ppklen bytes at *pk, and *pa gets set to the associated AlgorithmIdentifier for the public key. if you don't need any of these parameters, you can set them to NULL. all of the retrieved pointers are internal and must NOT be freed after the call. hands off, respectfully 🫢

X509_PUBKEY_eq() compares two X509_PUBKEY values. are they the same? are they different? it knows πŸ€”


🌈 NOTES 🌈

the X509_PUBKEY functions can be used to encode and decode public keys in a standard format. cute and useful πŸŽ€

but bestie, in many cases applications will not call the X509_PUBKEY functions directly β€” they'll instead call wrapper functions such as X509_get0_pubkey(). so if you're wondering why you never see these in the wild, that's why πŸ‘€

πŸ’œ RETURN VALUES πŸ’œ

if the allocation fails, X509_PUBKEY_new() and X509_PUBKEY_dup() return NULL and set an error code that can be obtained by ERR_get_error(3). otherwise they return a pointer to the newly allocated structure. slay or cry 😭

X509_PUBKEY_free() does not return a value. it's void, it's free, it's at peace ✨

X509_PUBKEY_get0(), X509_PUBKEY_get(), d2i_PUBKEY_ex(), d2i_PUBKEY(), d2i_PUBKEY_ex_bio(), d2i_PUBKEY_bio(), d2i_PUBKEY_ex_fp() and d2i_PUBKEY_fp() return a pointer to an EVP_PKEY structure, or NULL if an error occurs. good luck out there πŸ’«

i2d_PUBKEY() returns the number of bytes successfully encoded, or a negative value if an error occurs. numbers, we love to see them πŸ“

i2d_PUBKEY_fp() and i2d_PUBKEY_bio() return 1 if successfully encoded, or 0 if an error occurs. binary queen πŸ’…

X509_PUBKEY_set0_public_key() does not return a value. void again, iconic πŸŽ€

X509_PUBKEY_set(), X509_PUBKEY_set0_param() and X509_PUBKEY_get0_param() return 1 for success and 0 if an error occurred. one for the win, zero for the flop πŸ†

X509_PUBKEY_eq() returns 1 for equal, 0 for different, and < 0 on error. three whole moods fr fr 🌸

πŸ”₯ SEE ALSO πŸ”₯

⭐ HISTORY ⭐

the X509_PUBKEY_new_ex() and X509_PUBKEY_eq() functions were added in OpenSSL 3.0. glow-up era πŸ’–

the X509_PUBKEY_set0_public_key(), d2i_PUBKEY_ex_bio() and d2i_PUBKEY_ex_fp() functions were added in OpenSSL 3.2. newer, shinier, still iconic 🌟


Copyright 2016-2022 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>.

bestie please actually read the license before you go copy-pasting, that's the whole vibe check ok πŸ’€πŸ“œ

and that's the page!! πŸ“ written by OpenSSL, version 3.5.0, dated 2026-09-25 β€” so when you see X509_PUBKEY_NEW(3ossl) in the wild, you'll know exactly what's up. mwah, go forth and encode responsibly πŸ’‹πŸ¦‹

πŸ“¦ where this page comes from