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

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

<h1>RSA_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="#BUGS">BUGS</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>
RSA_sign, RSA_verify - RSA signatures

</P>
<P>
<HR>
<H1><A NAME="SYNOPSIS">SYNOPSIS</A></H1>
<PRE> #include &lt;openssl/rsa.h&gt;
</PRE>
<PRE> int RSA_sign(int type, const unsigned char *m, unsigned int m_len,
    unsigned char *sigret, unsigned int *siglen, RSA *rsa);
</PRE>
<PRE> int RSA_verify(int type, const unsigned char *m, unsigned int m_len,
    unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
</PRE>
<P>
<HR>
<H1><A NAME="DESCRIPTION">DESCRIPTION</A></H1>
<P>
<CODE>RSA_sign()</CODE> signs the message digest <STRONG>m</STRONG> of size <STRONG>m_len</STRONG> using the private key <STRONG>rsa</STRONG> as specified in PKCS #1 v2.0. It stores the signature in <STRONG>sigret</STRONG> and the signature size in <STRONG>siglen</STRONG>. <STRONG>sigret</STRONG>
must point to <CODE>RSA_size(</CODE><STRONG>rsa</STRONG>) bytes of memory.

</P>
<P>
<STRONG>type</STRONG> denotes the message digest algorithm that was used to generate
<STRONG>m</STRONG>. It usually is one of <STRONG>NID_sha1</STRONG>, <STRONG>NID_ripemd160</STRONG> and <STRONG>NID_md5</STRONG>; see <EM>objects(3)</EM> for details. If <STRONG>type</STRONG> is <STRONG>NID_md5_sha1</STRONG>, an SSL signature (MD5 and SHA1 message digests with PKCS #1 padding and
no algorithm identifier) is created.

</P>
<P>
<CODE>RSA_verify()</CODE> verifies that the signature <STRONG>sigbuf</STRONG> of size <STRONG>siglen</STRONG>
matches a given message digest <STRONG>m</STRONG> of size <STRONG>m_len</STRONG>. <STRONG>type</STRONG> denotes the message digest algorithm that was used to generate the
signature.
<STRONG>rsa</STRONG> is the signer's public key.

</P>
<P>
<HR>
<H1><A NAME="RETURN_VALUES">RETURN VALUES</A></H1>
<P>
<CODE>RSA_sign()</CODE> returns 1 on success, 0 otherwise.
<CODE>RSA_verify()</CODE> returns 1 on successful verification, 0
otherwise.

</P>
<P>
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="BUGS">BUGS</A></H1>
<P>
Certain signatures with an improper algorithm identifier are accepted for
compatibility with SSLeay 0.4.5 :-)

</P>
<P>
<HR>
<H1><A NAME="CONFORMING_TO">CONFORMING TO</A></H1>
<P>
SSL, PKCS #1 v2.0

</P>
<P>
<HR>
<H1><A NAME="SEE_ALSO">SEE ALSO</A></H1>
<P>
<A HREF="../crypto/ERR_get_error.html#">ERR_get_error(3)</A>, <EM>objects(3)</EM>,
<A HREF="../crypto/rsa.html#">rsa(3)</A>, <A HREF="../crypto/RSA_private_encrypt.html#">RSA_private_encrypt(3)</A>,
<A HREF="../crypto/RSA_private_encrypt.html#">RSA_public_decrypt(3)</A> 

 

</P>
<P>
<HR>
<H1><A NAME="HISTORY">HISTORY</A></H1>
<P>
<CODE>RSA_sign()</CODE> and <CODE>RSA_verify()</CODE> are available in all
versions of SSLeay and OpenSSL.

</P>
:}


