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

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

<h1>EVP_PKEY_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="#NOTES">NOTES</A>
	<LI><A HREF="#RETURN_VALUES">RETURN VALUES</A>
	<LI><A HREF="#EXAMPLE">EXAMPLE</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>
EVP_PKEY_sign_init, EVP_PKEY_sign - sign using a public key algorithm

</P>
<P>
<HR>
<H1><A NAME="SYNOPSIS">SYNOPSIS</A></H1>
<PRE> #include &lt;openssl/evp.h&gt;
</PRE>
<PRE> int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx);
 int EVP_PKEY_sign(EVP_PKEY_CTX *ctx,
                        unsigned char *sig, size_t *siglen,
                        const unsigned char *tbs, size_t tbslen);
</PRE>
<P>
<HR>
<H1><A NAME="DESCRIPTION">DESCRIPTION</A></H1>
<P>
The <CODE>EVP_PKEY_sign_init()</CODE> function initializes a public key
algorithm context using key <STRONG>pkey</STRONG> for a signing operation.

</P>
<P>
The <CODE>EVP_PKEY_sign()</CODE> function performs a public key signing
operation using <STRONG>ctx</STRONG>. The data to be signed is specified using the <STRONG>tbs</STRONG> and
<STRONG>tbslen</STRONG> parameters. If <STRONG>sig</STRONG> is <STRONG>NULL</STRONG> then the maximum size of the output buffer is written to the <STRONG>siglen</STRONG> parameter. If <STRONG>sig</STRONG> is not <STRONG>NULL</STRONG> then before the call the <STRONG>siglen</STRONG> parameter should contain the length of the
<STRONG>sig</STRONG> buffer, if the call is successful the signature is written to
<STRONG>sig</STRONG> and the amount of data written to <STRONG>siglen</STRONG>.

</P>
<P>
<HR>
<H1><A NAME="NOTES">NOTES</A></H1>
<P>
After the call to <CODE>EVP_PKEY_sign_init()</CODE> algorithm specific
control operations can be performed to set any appropriate parameters for
the operation.

</P>
<P>
The function <CODE>EVP_PKEY_sign()</CODE> can be called more than once on
the same context if several operations are performed using the same
parameters.

</P>
<P>
<HR>
<H1><A NAME="RETURN_VALUES">RETURN VALUES</A></H1>
<P>
<CODE>EVP_PKEY_sign_init()</CODE> and <CODE>EVP_PKEY_sign()</CODE> return 1
for success and 0 or a negative value for failure. In particular a return
value of -2 indicates the operation is not supported by the public key
algorithm.

</P>
<P>
<HR>
<H1><A NAME="EXAMPLE">EXAMPLE</A></H1>
<P>
Sign data using RSA with PKCS#1 padding and SHA256 digest:

</P>
<PRE> #include &lt;openssl/evp.h&gt;
 \#include &lt;openssl/rsa.h&gt;
</PRE>
<PRE> EVP_PKEY_CTX *ctx;
 unsigned char *md, *sig;
 size_t mdlen, siglen; 
 EVP_PKEY *signing_key;
 /* NB: assumes signing_key, md and mdlen are already set up
  * and that signing_key is an RSA private key
  */
 ctx = EVP_PKEY_CTX_new(signing_key);
 if (!ctx)
        /* Error occurred */
 if (EVP_PKEY_sign_init(ctx) &lt;= 0)
        /* Error */
 if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) &lt;= 0)
        /* Error */
 if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) &lt;= 0)
        /* Error */
</PRE>
<PRE> /* Determine buffer length */
 if (EVP_PKEY_sign(ctx, NULL, &amp;siglen, md, mdlen) &lt;= 0)
        /* Error */
</PRE>
<PRE> sig = OPENSSL_malloc(siglen);
</PRE>
<PRE> if (!sig)
        /* malloc failure */
 
 if (EVP_PKEY_sign(ctx, sig, &amp;siglen, md, mdlen) &lt;= 0)
        /* Error */
</PRE>
<PRE> /* Signature is siglen bytes written to buffer sig */
</PRE>
<P>
<HR>
<H1><A NAME="SEE_ALSO">SEE ALSO</A></H1>
<P>
<A HREF="../crypto/EVP_PKEY_CTX_new.html#">EVP_PKEY_CTX_new(3)</A>,
<A HREF="../crypto/EVP_PKEY_encrypt.html#">EVP_PKEY_encrypt(3)</A>,
<A HREF="../crypto/EVP_PKEY_decrypt.html#">EVP_PKEY_decrypt(3)</A>,
<A HREF="../crypto/EVP_PKEY_verify.html#">EVP_PKEY_verify(3)</A>,
<A HREF="../crypto/EVP_PKEY_verifyrecover.html#">EVP_PKEY_verifyrecover(3)</A>,
<A HREF="../crypto/EVP_PKEY_derive.html#">EVP_PKEY_derive(3)</A> 

 

</P>
<P>
<HR>
<H1><A NAME="HISTORY">HISTORY</A></H1>
<P>
These functions were first added to OpenSSL 1.0.0.

</P>
:}


