
#use wml::openssl-macros area=docs page=DSA_sign

<title>Documents, DSA_sign(3)</title>

<h1>DSA_sign(3)</h1>

#use wml::imp::generic

{:
## What's this? [[s|(<STRONG>[^<].+?)</A>(</STRONG><DD>)|$1$2|sg]]
[[s|<P>\s+<P>|<P>|sg]]
[[s|<P>\s+</|</|sg]]
[[s|<DD>\s*<DT>|<DD>&nbsp;<DT>|sg]]
[[s|<DD>\s*</DL>|<DD>&nbsp;</DL>|sg]]
[[s|\[|&#91;|sg]]
[[s|\]|&#93;|sg]]

<!-- INDEX BEGIN -->

<UL>

	<LI><A HREF="#NAME">NAME</A>
	<LI><A HREF="#SYNOPSIS">SYNOPSIS</A>
	<LI><A HREF="#DESCRIPTION">DESCRIPTION</A>
	<LI><A HREF="#RETURN_VALUES">RETURN VALUES</A>
	<LI><A HREF="#CONFORMING_TO">CONFORMING TO</A>
	<LI><A HREF="#SEE_ALSO">SEE ALSO</A>
	<LI><A HREF="#HISTORY">HISTORY</A>
</UL>
<!-- INDEX END -->

<HR>
<P>
<HR>
<H1><A NAME="NAME">NAME</A></H1>
<P>
DSA_sign, DSA_sign_setup, DSA_verify - DSA signatures

</P>
<P>
<HR>
<H1><A NAME="SYNOPSIS">SYNOPSIS</A></H1>
<PRE> #include &lt;openssl/dsa.h&gt;
</PRE>
<PRE> int    DSA_sign(int type, const unsigned char *dgst, int len,
                unsigned char *sigret, unsigned int *siglen, DSA *dsa);
</PRE>
<PRE> int    DSA_sign_setup(DSA *dsa, BN_CTX *ctx, BIGNUM **kinvp,
                BIGNUM **rp);
</PRE>
<PRE> int    DSA_verify(int type, const unsigned char *dgst, int len,
                unsigned char *sigbuf, int siglen, DSA *dsa);
</PRE>
<P>
<HR>
<H1><A NAME="DESCRIPTION">DESCRIPTION</A></H1>
<P>
<CODE>DSA_sign()</CODE> computes a digital signature on the <STRONG>len</STRONG> byte message digest <STRONG>dgst</STRONG> using the private key <STRONG>dsa</STRONG> and places its ASN.1 DER encoding at <STRONG>sigret</STRONG>. The length of the signature is places in *<STRONG>siglen</STRONG>. <STRONG>sigret</STRONG> must point to <CODE>DSA_size(</CODE><STRONG>dsa</STRONG>) bytes of memory.

</P>
<P>
<CODE>DSA_sign_setup()</CODE> may be used to precompute part of the signing
operation in case signature generation is time-critical. It expects
<STRONG>dsa</STRONG> to contain DSA parameters. It places the precomputed values in newly
allocated <STRONG>BIGNUM</STRONG>s at *<STRONG>kinvp</STRONG> and *<STRONG>rp</STRONG>, after freeing the old ones unless *<STRONG>kinvp</STRONG> and *<STRONG>rp</STRONG> are NULL. These values may be passed to <CODE>DSA_sign()</CODE> in <STRONG>dsa-&gt;kinv</STRONG> and <STRONG>dsa-&gt;r</STRONG>.
<STRONG>ctx</STRONG> is a pre-allocated <STRONG>BN_CTX</STRONG> or NULL.

</P>
<P>
<CODE>DSA_verify()</CODE> verifies that the signature <STRONG>sigbuf</STRONG> of size <STRONG>siglen</STRONG>
matches a given message digest <STRONG>dgst</STRONG> of size <STRONG>len</STRONG>.
<STRONG>dsa</STRONG> is the signer's public key.

</P>
<P>
The <STRONG>type</STRONG> parameter is ignored.

</P>
<P>
The PRNG must be seeded before <CODE>DSA_sign()</CODE> (or
<CODE>DSA_sign_setup())</CODE> is called.

</P>
<P>
<HR>
<H1><A NAME="RETURN_VALUES">RETURN VALUES</A></H1>
<P>
<CODE>DSA_sign()</CODE> and <CODE>DSA_sign_setup()</CODE> return 1 on
success, 0 on error. <CODE>DSA_verify()</CODE> returns 1 for a valid
signature, 0 for an incorrect signature and -1 on error. The error codes
can be obtained by
<A HREF="../crypto/ERR_get_error.html#">ERR_get_error(3)</A>.

</P>
<P>
<HR>
<H1><A NAME="CONFORMING_TO">CONFORMING TO</A></H1>
<P>
US Federal Information Processing Standard FIPS 186 (Digital Signature
Standard, DSS), ANSI X9.30

</P>
<P>
<HR>
<H1><A NAME="SEE_ALSO">SEE ALSO</A></H1>
<P>
<A HREF="../crypto/dsa.html#">dsa(3)</A>, <A HREF="../crypto/ERR_get_error.html#">ERR_get_error(3)</A>, <A HREF="../crypto/rand.html#">rand(3)</A>,
<A HREF="../crypto/DSA_do_sign.html#">DSA_do_sign(3)</A>



</P>
<P>
<HR>
<H1><A NAME="HISTORY">HISTORY</A></H1>
<P>
<CODE>DSA_sign()</CODE> and <CODE>DSA_verify()</CODE> are available in all
versions of SSLeay. <CODE>DSA_sign_setup()</CODE> was added in SSLeay 0.8.

</P>
:}

