blob: 6c2287bbd6aad3bfb360f20f8bf70d1ca67a45ef [file] [log] [blame]
Dr. Stephen Henson64cee652006-07-08 11:13:01 +00001=pod
2
3=head1 NAME
4
Ben Lauriee54e1232013-01-12 12:25:30 +00005EVP_PKEY_verify_recover_init, EVP_PKEY_verify_recover - recover signature using a public key algorithm
Dr. Stephen Henson64cee652006-07-08 11:13:01 +00006
7=head1 SYNOPSIS
8
9 #include <openssl/evp.h>
10
Ben Lauriee54e1232013-01-12 12:25:30 +000011 int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx);
12 int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx,
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000013 unsigned char *rout, size_t *routlen,
14 const unsigned char *sig, size_t siglen);
15
16=head1 DESCRIPTION
17
Ben Lauriee54e1232013-01-12 12:25:30 +000018The EVP_PKEY_verify_recover_init() function initializes a public key algorithm
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000019context using key B<pkey> for a verify recover operation.
20
Ben Lauriee54e1232013-01-12 12:25:30 +000021The EVP_PKEY_verify_recover() function recovers signed data
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000022using B<ctx>. The signature is specified using the B<sig> and
23B<siglen> parameters. If B<rout> is B<NULL> then the maximum size of the output
24buffer is written to the B<routlen> parameter. If B<rout> is not B<NULL> then
25before the call the B<routlen> parameter should contain the length of the
26B<rout> buffer, if the call is successful recovered data is written to
27B<rout> and the amount of data written to B<routlen>.
28
29=head1 NOTES
30
31Normally an application is only interested in whether a signature verification
32operation is successful in those cases the EVP_verify() function should be
33used.
34
35Sometimes however it is useful to obtain the data originally signed using a
36signing operation. Only certain public key algorithms can recover a signature
37in this way (for example RSA in PKCS padding mode).
38
Ben Lauriee54e1232013-01-12 12:25:30 +000039After the call to EVP_PKEY_verify_recover_init() algorithm specific control
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000040operations can be performed to set any appropriate parameters for the
41operation.
42
Ben Lauriee54e1232013-01-12 12:25:30 +000043The function EVP_PKEY_verify_recover() can be called more than once on the same
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000044context if several operations are performed using the same parameters.
45
46=head1 RETURN VALUES
47
Ben Lauriee54e1232013-01-12 12:25:30 +000048EVP_PKEY_verify_recover_init() and EVP_PKEY_verify_recover() return 1 for success
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000049and 0 or a negative value for failure. In particular a return value of -2
50indicates the operation is not supported by the public key algorithm.
51
52=head1 EXAMPLE
53
54Recover digest originally signed using PKCS#1 and SHA256 digest:
55
Dr. Stephen Henson43636912006-07-08 12:46:51 +000056 #include <openssl/evp.h>
57 #include <openssl/rsa.h>
58
59 EVP_PKEY_CTX *ctx;
60 unsigned char *rout, *sig;
61 size_t routlen, siglen;
62 EVP_PKEY *verify_key;
63 /* NB: assumes verify_key, sig and siglen are already set up
64 * and that verify_key is an RSA public key
65 */
66 ctx = EVP_PKEY_CTX_new(verify_key);
67 if (!ctx)
68 /* Error occurred */
Ben Lauriee54e1232013-01-12 12:25:30 +000069 if (EVP_PKEY_verify_recover_init(ctx) <= 0)
Dr. Stephen Henson43636912006-07-08 12:46:51 +000070 /* Error */
71 if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING) <= 0)
72 /* Error */
73 if (EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256()) <= 0)
74 /* Error */
75
76 /* Determine buffer length */
Ben Lauriee54e1232013-01-12 12:25:30 +000077 if (EVP_PKEY_verify_recover(ctx, NULL, &routlen, sig, siglen) <= 0)
Dr. Stephen Henson43636912006-07-08 12:46:51 +000078 /* Error */
79
80 rout = OPENSSL_malloc(routlen);
81
82 if (!rout)
83 /* malloc failure */
84
Ben Lauriee54e1232013-01-12 12:25:30 +000085 if (EVP_PKEY_verify_recover(ctx, rout, &routlen, sig, siglen) <= 0)
Dr. Stephen Henson43636912006-07-08 12:46:51 +000086 /* Error */
87
88 /* Recovered data is routlen bytes written to buffer rout */
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000089
90=head1 SEE ALSO
91
Rich Salz9b869742015-08-17 15:21:33 -040092L<EVP_PKEY_CTX_new(3)>,
93L<EVP_PKEY_encrypt(3)>,
94L<EVP_PKEY_decrypt(3)>,
95L<EVP_PKEY_sign(3)>,
96L<EVP_PKEY_verify(3)>,
97L<EVP_PKEY_derive(3)>
Dr. Stephen Henson64cee652006-07-08 11:13:01 +000098
99=head1 HISTORY
100
Dr. Stephen Hensonfb552ac2009-09-30 23:43:01 +0000101These functions were first added to OpenSSL 1.0.0.
Dr. Stephen Henson64cee652006-07-08 11:13:01 +0000102
103=cut