D2I_DSAPUBLICKEY(3) | Library Functions Manual | D2I_DSAPUBLICKEY(3)

# NAME

`d2i_DSAPublicKey`, `i2d_DSAPublicKey`, `d2i_DSA_PUBKEY`, `i2d_DSA_PUBKEY`, `d2i_DSA_PUBKEY_bio`, `d2i_DSA_PUBKEY_fp`, `i2d_DSA_PUBKEY_bio`, `i2d_DSA_PUBKEY_fp`, `d2i_DSAPrivateKey`, `i2d_DSAPrivateKey`, `d2i_DSAPrivateKey_bio`, `d2i_DSAPrivateKey_fp`, `i2d_DSAPrivateKey_bio`, `i2d_DSAPrivateKey_fp`, `d2i_DSAparams`, `i2d_DSAparams`, `d2i_DSAparams_bio`, `i2d_DSAparams_bio`, `d2i_DSAparams_fp`, `i2d_DSAparams_fp`, `DSAparams_dup`, `d2i_DSA_SIG`, `i2d_DSA_SIG` — decode and encode DSA keys

# SYNOPSIS

library “libcrypto”
`#include <openssl/dsa.h>`

DSA *
`d2i_DSAPublicKey`(DSA **val_out, const unsigned char **der_in, long length);

int
`i2d_DSAPublicKey`(const DSA *val_in, unsigned char **der_out);

`#include <openssl/x509.h>`

DSA *
`d2i_DSA_PUBKEY`(DSA **val_out, const unsigned char **der_in, long length);

int
`i2d_DSA_PUBKEY`(const DSA *val_in, unsigned char **der_out);

DSA *
`d2i_DSA_PUBKEY_bio`(BIO *in_bio, DSA **val_out);

DSA *
`d2i_DSA_PUBKEY_fp`(FILE *in_fp, DSA **val_out);

int
`i2d_DSA_PUBKEY_bio`(BIO *out_bio, DSA *val_in);

int
`i2d_DSA_PUBKEY_fp`(FILE *out_fp, DSA *val_in);

`#include <openssl/dsa.h>`

DSA *
`d2i_DSAPrivateKey`(DSA **val_out, const unsigned char **der_in, long length);

int
`i2d_DSAPrivateKey`(const DSA *val_in, unsigned char **der_out);

`#include <openssl/x509.h>`

DSA *
`d2i_DSAPrivateKey_bio`(BIO *in_bio, DSA **val_out);

DSA *
`d2i_DSAPrivateKey_fp`(FILE *in_fp, DSA **val_out);

int
`i2d_DSAPrivateKey_bio`(BIO *out_bio, DSA *val_in);

int
`i2d_DSAPrivateKey_fp`(FILE *out_fp, DSA *val_in);

`#include <openssl/dsa.h>`

DSA *
`d2i_DSAparams`(DSA **val_out, const unsigned char **der_in, long length);

int
`i2d_DSAparams`(const DSA *val_in, unsigned char **der_out);

DSA *
`d2i_DSAparams_bio`(BIO *in_bio, DSA **val_out);

int
`i2d_DSAparams_bio`(BIO *out_bio, DSA *val_in);

DSA *
`d2i_DSAparams_fp`(FILE *in_fp, DSA **val_out);

int
`i2d_DSAparams_fp`(FILE, *out_fp, DSA *val_in);

DSA *
`DSAparams_dup`(DSA *val_in);

DSA_SIG *
`d2i_DSA_SIG`(DSA_SIG **val_out, const unsigned char **der_in, long length);

int
`i2d_DSA_SIG`(const DSA_SIG *val_in, unsigned char **der_out);

# DESCRIPTION

These functions decode and encode DSA keys and parameters. For details about the semantics, examples, caveats, and bugs, see ASN1_item_d2i(3).

`d2i_DSAPublicKey`() and `i2d_DSAPublicKey`() decode and encode the DSA public key components using a non-standard format, so consider using `d2i_DSA_PUBKEY`() and `i2d_DSA_PUBKEY`() instead. The actual data encoded depends on the value of val_in->write_params. If val_in->write_params is zero, only the val_in->pub_key field is encoded as an ASN.1 INTEGER. If val_in->write_params is 1, then a SEQUENCE consisting of the val_in->p, val_in->q, val_in->g, and val_in->pub_key fields is encoded.

`d2i_DSA_PUBKEY`() and `i2d_DSA_PUBKEY`() decode and encode a DSA public key using an ASN.1 SubjectPublicKeyInfo structure defined in RFC 5280 section 4.1 and documented in X509_PUBKEY_new(3). `d2i_DSA_PUBKEY_bio`(), `d2i_DSA_PUBKEY_fp`(), `i2d_DSA_PUBKEY_bio`(), and `i2d_DSA_PUBKEY_fp`() are similar except that they decode or encode using a BIO or FILE pointer.

`d2i_DSAPrivateKey`() and `i2d_DSAPrivateKey`() decode and encode the DSA private key components. The DSA object passed to the private key encoding functions should have all the private key components present. These functions use a non-standard structure consisting of a SEQUENCE containing the val_in->p, val_in->q, val_in->g, val_in->pub_key, and val_in->priv_key fields. This data format is unencrypted. For private key security when writing private keys to files, consider using PEM_write_DSAPrivateKey(3) instead. `d2i_DSAPrivateKey_bio`(), `d2i_DSAPrivateKey_fp`(), `i2d_DSAPrivateKey_bio`(), and `i2d_DSAPrivateKey_fp`() are similar except that they decode or encode using a BIO or FILE pointer.

`d2i_DSAparams`() and `i2d_DSAparams`() decode and encode the DSA parameters using an ASN.1 Dss-Parms structure defined in RFC 3279 section 2.3.2 and used for the parameters field of the ASN.1 AlgorithmIdentifier structure defined in RFC 5280 section 4.1.1.2. `d2i_DSAparams_bio`(), `i2d_DSAparams_bio`(), `d2i_DSAparams_fp`(), `i2d_DSAparams_fp`() are similar except that they decode or encode using a BIO or FILE pointer.

`DSAparams_dup`() allocates and initializes an empty DSA object and copies the DSA parameters from val_in to it by calling `i2d_DSAparams`() and `d2i_DSAparams`(). If a private or public key are present in val_in, they are not copied.

`d2i_DSA_SIG`() and `i2d_DSA_SIG`() decode and encode a DSA signature using an ASN.1 Dss-Sig-Value structure as defined in RFC 3279 section 2.2.2 and used for the signatureValue field of the ASN.1 Certificate structure described in RFC 5280 sections 4.1.1.3 and 5.1.1.3.

# RETURN VALUES

`d2i_DSAPublicKey`(), `d2i_DSA_PUBKEY`(), `d2i_DSA_PUBKEY_bio`(), `d2i_DSA_PUBKEY_fp`(), `d2i_DSAPrivateKey`(), `d2i_DSAPrivateKey_bio`(), `d2i_DSAPrivateKey_fp`(), `d2i_DSAparams`(), `d2i_DSAparams_bio`(), `d2i_DSAparams_fp`(), and `DSAparams_dup`() return a valid DSA object or `NULL` if an error occurs.

`d2i_DSA_SIG`() returns a valid DSA_SIG object or `NULL` if an error occurs.

# SEE ALSO

ASN1_item_d2i(3), DSA_new(3), DSA_SIG_new(3), EVP_PKEY_set1_DSA(3), PEM_write_DSAPrivateKey(3), X509_PUBKEY_new(3)

# STANDARDS

RFC 5280: Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile, section 4.1: Basic Certificate Fields

RFC 3279: Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile:

- section 2.2.2: DSA Signature Algorithm
- section 2.3.2: DSA Signature Keys

# HISTORY

`d2i_DSAPublicKey`(), `i2d_DSAPublicKey`(), `d2i_DSAPrivateKey`(), and `i2d_DSAPrivateKey`() first appeared in SSLeay 0.6.0. `d2i_DSAPrivateKey_bio`(), `d2i_DSAPrivateKey_fp`(), `i2d_DSAPrivateKey_bio`(), `i2d_DSAPrivateKey_fp`(), `d2i_DSAparams`(), `i2d_DSAparams`(), `d2i_DSAparams_bio`(), `i2d_DSAparams_bio`(), `d2i_DSAparams_fp`(), `i2d_DSAparams_fp`(), and `DSAparams_dup`() first appeared in SSLeay 0.8.0. These functions have been available since OpenBSD 2.4.

`d2i_DSA_SIG`() and `i2d_DSA_SIG`() first appeared in OpenSSL 0.9.3 and have been available since OpenBSD 2.6.

`d2i_DSA_PUBKEY`(), `i2d_DSA_PUBKEY`(), `d2i_DSA_PUBKEY_bio`(), `d2i_DSA_PUBKEY_fp`(), `i2d_DSA_PUBKEY_bio`(), and `i2d_DSA_PUBKEY_fp`() first appeared in OpenSSL 0.9.5 and have been available since OpenBSD 2.7.

June 8, 2025 | Debian