=pod

=head1 NAME

dsa - Digital Signature Algorithm

=head1 SYNOPSIS

 #include <openssl/dsa.h>

 DSA *	DSA_new(void);
 void	DSA_free(DSA *dsa);

 int	DSA_size(DSA *dsa);

 DSA *	DSA_generate_parameters(int bits, unsigned char *seed,
                int seed_len, int *counter_ret, unsigned long *h_ret,
		void (*callback)(int, int, void *), void *cb_arg);

 DH *	DSA_dup_DH(DSA *r);

 int	DSA_generate_key(DSA *dsa);

 int	DSA_sign(int dummy, const unsigned char *dgst, int len,
		unsigned char *sigret, unsigned int *siglen, DSA *dsa);
 int	DSA_sign_setup(DSA *dsa, BN_CTX *ctx, BIGNUM **kinvp,
                BIGNUM **rp);
 int	DSA_verify(int dummy, const unsigned char *dgst, int len,
		unsigned char *sigbuf, int siglen, DSA *dsa);

 void DSA_set_default_method(DSA_METHOD *meth);
 DSA_METHOD *DSA_get_default_method(void);
 DSA_METHOD *DSA_set_method(DSA *dsa, DSA_METHOD *meth);
 DSA *DSA_new_method(DSA_METHOD *meth);
 DSA_METHOD *DSA_OpenSSL(void);

 int DSA_get_ex_new_index(long argl, char *argp, int (*new_func)(),
	     int (*dup_func)(), void (*free_func)());
 int DSA_set_ex_data(DSA *d, int idx, char *arg);
 char *DSA_get_ex_data(DSA *d, int idx);

 DSA_SIG *DSA_SIG_new(void);
 void	DSA_SIG_free(DSA_SIG *a);
 int	i2d_DSA_SIG(DSA_SIG *a, unsigned char **pp);
 DSA_SIG *d2i_DSA_SIG(DSA_SIG **v, unsigned char **pp, long length);

 DSA_SIG *DSA_do_sign(const unsigned char *dgst, int dlen, DSA *dsa);
 int	DSA_do_verify(const unsigned char *dgst, int dgst_len,
	     DSA_SIG *sig, DSA *dsa);

 DSA *	d2i_DSAPublicKey(DSA **a, unsigned char **pp, long length);
 DSA *	d2i_DSAPrivateKey(DSA **a, unsigned char **pp, long length);
 DSA * 	d2i_DSAparams(DSA **a, unsigned char **pp, long length);
 int	i2d_DSAPublicKey(DSA *a, unsigned char **pp);
 int 	i2d_DSAPrivateKey(DSA *a, unsigned char **pp);
 int	i2d_DSAparams(DSA *a,unsigned char **pp);

 int	DSAparams_print(BIO *bp, DSA *x);
 int	DSAparams_print_fp(FILE *fp, DSA *x);
 int	DSA_print(BIO *bp, DSA *x, int off);
 int	DSA_print_fp(FILE *bp, DSA *x, int off);

=head1 DESCRIPTION

These functions implement the Digital Signature Algorithm (DSA).  The
generation of shared DSA parameters is described in
L<DSA_generate_parameters(3)|DSA_generate_parameters(3)>;
L<DSA_generate_key(3)|DSA_generate_key(3)> describes how to
generate a signature key. Signature generation and verification are
described in L<DSA_sign(3)|DSA_sign(3)>.

The B<DSA> structure consists of several BIGNUM components.

 struct
        {
        BIGNUM *p;		// prime number (public)
        BIGNUM *q;		// 160-bit subprime, q | p-1 (public)
        BIGNUM *g;		// generator of subgroup (public)
        BIGNUM *priv_key;	// private key x
        BIGNUM *pub_key;	// public key y = g^x
        // ...
        }
 DSA;

In public keys, B<priv_key> is NULL.

=head1 CONFORMING TO

US Federal Information Processing Standard FIPS 186 (Digital Signature
Standard, DSS), ANSI X9.30

=head1 SEE ALSO

L<bn(3)|bn(3)>, L<dh(3)|dh(3)>, L<err(3)|err(3)>, L<rand(3)|rand(3)>,
L<rsa(3)|rsa(3)>, L<sha(3)|sha(3)>, L<DSA_new(3)|DSA_new(3)>,
L<DSA_size(3)|DSA_size(3)>,
L<DSA_generate_parameters(3)|DSA_generate_parameters(3)>,
L<DSA_dup_DH(3)|DSA_dup_DH(3)>,
L<DSA_generate_key(3)|DSA_generate_key(3)>,
L<DSA_sign(3)|DSA_sign(3)>, L<DSA_set_method(3)|DSA_set_method(3)>,
L<DSA_get_ex_new_index(3)|DSA_get_ex_new_index(3)>,
L<RSA_print(3)|RSA_print(3)>

=cut
