Solaris build fix for Oracle's LDAP libraries.
[exim.git] / src / src / pdkim / rsa.h
CommitLineData
80a47a2c
TK
1/**
2 * \file rsa.h
3 *
62d3e98d
TK
4 * Copyright (C) 2006-2010, Brainspark B.V.
5 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
80a47a2c 8 *
62d3e98d 9 * All rights reserved.
80a47a2c
TK
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25
67932e54 26/* $Cambridge: exim/src/src/pdkim/rsa.h,v 1.3 2009/12/07 13:05:07 tom Exp $ */
80a47a2c
TK
27
28#ifndef POLARSSL_RSA_H
29#define POLARSSL_RSA_H
30
31#include "bignum.h"
32
67932e54
TK
33/*
34 * RSA Error codes
35 */
80a47a2c
TK
36#define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x0400
37#define POLARSSL_ERR_RSA_INVALID_PADDING -0x0410
38#define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x0420
39#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x0430
40#define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x0440
41#define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x0450
42#define POLARSSL_ERR_RSA_VERIFY_FAILED -0x0460
67932e54 43#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE -0x0470
62d3e98d 44#define POLARSSL_ERR_RSA_RNG_FAILED -0x0480
80a47a2c 45
67932e54
TK
46/* *************** begin copy from x509.h ************************/
47/*
48 * ASN1 Error codes
49 *
50 * These error codes will be OR'ed to X509 error codes for
51 * higher error granularity.
52 */
53#define POLARSSL_ERR_ASN1_OUT_OF_DATA 0x0014
54#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG 0x0016
55#define POLARSSL_ERR_ASN1_INVALID_LENGTH 0x0018
56#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH 0x001A
57#define POLARSSL_ERR_ASN1_INVALID_DATA 0x001C
80a47a2c 58
67932e54
TK
59/*
60 * X509 Error codes
61 */
80a47a2c
TK
62#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE -0x0020
63#define POLARSSL_ERR_X509_CERT_INVALID_PEM -0x0040
64#define POLARSSL_ERR_X509_CERT_INVALID_FORMAT -0x0060
65#define POLARSSL_ERR_X509_CERT_INVALID_VERSION -0x0080
66#define POLARSSL_ERR_X509_CERT_INVALID_SERIAL -0x00A0
67#define POLARSSL_ERR_X509_CERT_INVALID_ALG -0x00C0
68#define POLARSSL_ERR_X509_CERT_INVALID_NAME -0x00E0
69#define POLARSSL_ERR_X509_CERT_INVALID_DATE -0x0100
70#define POLARSSL_ERR_X509_CERT_INVALID_PUBKEY -0x0120
71#define POLARSSL_ERR_X509_CERT_INVALID_SIGNATURE -0x0140
72#define POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS -0x0160
73#define POLARSSL_ERR_X509_CERT_UNKNOWN_VERSION -0x0180
74#define POLARSSL_ERR_X509_CERT_UNKNOWN_SIG_ALG -0x01A0
75#define POLARSSL_ERR_X509_CERT_UNKNOWN_PK_ALG -0x01C0
76#define POLARSSL_ERR_X509_CERT_SIG_MISMATCH -0x01E0
77#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED -0x0200
78#define POLARSSL_ERR_X509_KEY_INVALID_PEM -0x0220
79#define POLARSSL_ERR_X509_KEY_INVALID_VERSION -0x0240
80#define POLARSSL_ERR_X509_KEY_INVALID_FORMAT -0x0260
81#define POLARSSL_ERR_X509_KEY_INVALID_ENC_IV -0x0280
82#define POLARSSL_ERR_X509_KEY_UNKNOWN_ENC_ALG -0x02A0
83#define POLARSSL_ERR_X509_KEY_PASSWORD_REQUIRED -0x02C0
84#define POLARSSL_ERR_X509_KEY_PASSWORD_MISMATCH -0x02E0
85#define POLARSSL_ERR_X509_POINT_ERROR -0x0300
86#define POLARSSL_ERR_X509_VALUE_TO_LENGTH -0x0320
87
88/*
89 * DER constants
90 */
91#define ASN1_BOOLEAN 0x01
92#define ASN1_INTEGER 0x02
93#define ASN1_BIT_STRING 0x03
94#define ASN1_OCTET_STRING 0x04
95#define ASN1_NULL 0x05
96#define ASN1_OID 0x06
97#define ASN1_UTF8_STRING 0x0C
98#define ASN1_SEQUENCE 0x10
99#define ASN1_SET 0x11
100#define ASN1_PRINTABLE_STRING 0x13
101#define ASN1_T61_STRING 0x14
102#define ASN1_IA5_STRING 0x16
103#define ASN1_UTC_TIME 0x17
62d3e98d 104#define ASN1_GENERALIZED_TIME 0x18
80a47a2c
TK
105#define ASN1_UNIVERSAL_STRING 0x1C
106#define ASN1_BMP_STRING 0x1E
107#define ASN1_PRIMITIVE 0x00
108#define ASN1_CONSTRUCTED 0x20
109#define ASN1_CONTEXT_SPECIFIC 0x80
67932e54
TK
110/* *************** end copy from x509.h ************************/
111
80a47a2c
TK
112/*
113 * PKCS#1 constants
114 */
67932e54
TK
115#define SIG_RSA_RAW 0
116#define SIG_RSA_MD2 2
117#define SIG_RSA_MD4 3
118#define SIG_RSA_MD5 4
119#define SIG_RSA_SHA1 5
120#define SIG_RSA_SHA224 14
121#define SIG_RSA_SHA256 11
122#define SIG_RSA_SHA384 12
123#define SIG_RSA_SHA512 13
80a47a2c
TK
124
125#define RSA_PUBLIC 0
126#define RSA_PRIVATE 1
127
128#define RSA_PKCS_V15 0
129#define RSA_PKCS_V21 1
130
131#define RSA_SIGN 1
132#define RSA_CRYPT 2
133
67932e54
TK
134#define ASN1_STR_CONSTRUCTED_SEQUENCE "\x30"
135#define ASN1_STR_NULL "\x05"
136#define ASN1_STR_OID "\x06"
137#define ASN1_STR_OCTET_STRING "\x04"
138
139#define OID_DIGEST_ALG_MDX "\x2A\x86\x48\x86\xF7\x0D\x02\x00"
140#define OID_HASH_ALG_SHA1 "\x2b\x0e\x03\x02\x1a"
141#define OID_HASH_ALG_SHA2X "\x60\x86\x48\x01\x65\x03\x04\x02\x00"
142
143#define OID_ISO_MEMBER_BODIES "\x2a"
144#define OID_ISO_IDENTIFIED_ORG "\x2b"
145
146/*
147 * ISO Member bodies OID parts
148 */
149#define OID_COUNTRY_US "\x86\x48"
150#define OID_RSA_DATA_SECURITY "\x86\xf7\x0d"
151
152/*
153 * ISO Identified organization OID parts
154 */
155#define OID_OIW_SECSIG_SHA1 "\x0e\x03\x02\x1a"
156
80a47a2c
TK
157/*
158 * DigestInfo ::= SEQUENCE {
159 * digestAlgorithm DigestAlgorithmIdentifier,
160 * digest Digest }
161 *
162 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
163 *
164 * Digest ::= OCTET STRING
165 */
67932e54
TK
166#define ASN1_HASH_MDX \
167( \
168 ASN1_STR_CONSTRUCTED_SEQUENCE "\x20" \
169 ASN1_STR_CONSTRUCTED_SEQUENCE "\x0C" \
170 ASN1_STR_OID "\x08" \
171 OID_DIGEST_ALG_MDX \
172 ASN1_STR_NULL "\x00" \
173 ASN1_STR_OCTET_STRING "\x10" \
174)
175
176#define ASN1_HASH_SHA1 \
177 ASN1_STR_CONSTRUCTED_SEQUENCE "\x21" \
178 ASN1_STR_CONSTRUCTED_SEQUENCE "\x09" \
179 ASN1_STR_OID "\x05" \
180 OID_HASH_ALG_SHA1 \
181 ASN1_STR_NULL "\x00" \
182 ASN1_STR_OCTET_STRING "\x14"
183
184#define ASN1_HASH_SHA2X \
185 ASN1_STR_CONSTRUCTED_SEQUENCE "\x11" \
186 ASN1_STR_CONSTRUCTED_SEQUENCE "\x0d" \
187 ASN1_STR_OID "\x09" \
188 OID_HASH_ALG_SHA2X \
189 ASN1_STR_NULL "\x00" \
190 ASN1_STR_OCTET_STRING "\x00"
80a47a2c
TK
191
192/**
193 * \brief RSA context structure
194 */
195typedef struct
196{
197 int ver; /*!< always 0 */
198 int len; /*!< size(N) in chars */
199
200 mpi N; /*!< public modulus */
201 mpi E; /*!< public exponent */
202
203 mpi D; /*!< private exponent */
204 mpi P; /*!< 1st prime factor */
205 mpi Q; /*!< 2nd prime factor */
206 mpi DP; /*!< D % (P - 1) */
207 mpi DQ; /*!< D % (Q - 1) */
208 mpi QP; /*!< 1 / (Q % P) */
209
210 mpi RN; /*!< cached R^2 mod N */
211 mpi RP; /*!< cached R^2 mod P */
212 mpi RQ; /*!< cached R^2 mod Q */
213
214 int padding; /*!< 1.5 or OAEP/PSS */
215 int hash_id; /*!< hash identifier */
80a47a2c
TK
216}
217rsa_context;
218
219#ifdef __cplusplus
220extern "C" {
221#endif
222
223/**
224 * \brief Initialize an RSA context
225 *
226 * \param ctx RSA context to be initialized
227 * \param padding RSA_PKCS_V15 or RSA_PKCS_V21
228 * \param hash_id RSA_PKCS_V21 hash identifier
80a47a2c
TK
229 *
230 * \note The hash_id parameter is actually ignored
231 * when using RSA_PKCS_V15 padding.
232 *
62d3e98d 233 * \note Currently, RSA_PKCS_V21 padding
80a47a2c
TK
234 * is not supported.
235 */
236void rsa_init( rsa_context *ctx,
237 int padding,
62d3e98d 238 int hash_id);
80a47a2c
TK
239
240/**
241 * \brief Generate an RSA keypair
242 *
243 * \param ctx RSA context that will hold the key
62d3e98d
TK
244 * \param f_rng RNG function
245 * \param p_rng RNG parameter
80a47a2c
TK
246 * \param nbits size of the public key in bits
247 * \param exponent public exponent (e.g., 65537)
248 *
249 * \note rsa_init() must be called beforehand to setup
62d3e98d 250 * the RSA context.
80a47a2c
TK
251 *
252 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
253 */
62d3e98d
TK
254int rsa_gen_key( rsa_context *ctx,
255 int (*f_rng)(void *),
256 void *p_rng,
257 int nbits, int exponent );
80a47a2c
TK
258
259/**
260 * \brief Check a public RSA key
261 *
262 * \param ctx RSA context to be checked
263 *
264 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
265 */
62d3e98d 266int rsa_check_pubkey( const rsa_context *ctx );
80a47a2c
TK
267
268/**
269 * \brief Check a private RSA key
270 *
271 * \param ctx RSA context to be checked
272 *
273 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
274 */
62d3e98d 275int rsa_check_privkey( const rsa_context *ctx );
80a47a2c
TK
276
277/**
278 * \brief Do an RSA public key operation
279 *
280 * \param ctx RSA context
281 * \param input input buffer
282 * \param output output buffer
283 *
284 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
285 *
286 * \note This function does NOT take care of message
67932e54
TK
287 * padding. Also, be sure to set input[0] = 0 or assure that
288 * input is smaller than N.
80a47a2c
TK
289 *
290 * \note The input and output buffers must be large
291 * enough (eg. 128 bytes if RSA-1024 is used).
292 */
293int rsa_public( rsa_context *ctx,
62d3e98d 294 const unsigned char *input,
80a47a2c
TK
295 unsigned char *output );
296
297/**
298 * \brief Do an RSA private key operation
299 *
300 * \param ctx RSA context
301 * \param input input buffer
302 * \param output output buffer
303 *
304 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
305 *
306 * \note The input and output buffers must be large
307 * enough (eg. 128 bytes if RSA-1024 is used).
308 */
309int rsa_private( rsa_context *ctx,
62d3e98d 310 const unsigned char *input,
80a47a2c
TK
311 unsigned char *output );
312
313/**
314 * \brief Add the message padding, then do an RSA operation
315 *
316 * \param ctx RSA context
62d3e98d
TK
317 * \param f_rng RNG function
318 * \param p_rng RNG parameter
80a47a2c 319 * \param mode RSA_PUBLIC or RSA_PRIVATE
67932e54 320 * \param ilen contains the plaintext length
80a47a2c
TK
321 * \param input buffer holding the data to be encrypted
322 * \param output buffer that will hold the ciphertext
323 *
324 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
325 *
326 * \note The output buffer must be as large as the size
327 * of ctx->N (eg. 128 bytes if RSA-1024 is used).
328 */
329int rsa_pkcs1_encrypt( rsa_context *ctx,
62d3e98d
TK
330 int (*f_rng)(void *),
331 void *p_rng,
80a47a2c 332 int mode, int ilen,
62d3e98d 333 const unsigned char *input,
80a47a2c
TK
334 unsigned char *output );
335
336/**
337 * \brief Do an RSA operation, then remove the message padding
338 *
339 * \param ctx RSA context
340 * \param mode RSA_PUBLIC or RSA_PRIVATE
341 * \param input buffer holding the encrypted data
342 * \param output buffer that will hold the plaintext
343 * \param olen will contain the plaintext length
67932e54 344 * \param output_max_len maximum length of the output buffer
80a47a2c
TK
345 *
346 * \return 0 if successful, or an POLARSSL_ERR_RSA_XXX error code
347 *
348 * \note The output buffer must be as large as the size
349 * of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise
350 * an error is thrown.
351 */
352int rsa_pkcs1_decrypt( rsa_context *ctx,
353 int mode, int *olen,
62d3e98d 354 const unsigned char *input,
80a47a2c 355 unsigned char *output,
67932e54 356 int output_max_len );
80a47a2c
TK
357
358/**
359 * \brief Do a private RSA to sign a message digest
360 *
361 * \param ctx RSA context
362 * \param mode RSA_PUBLIC or RSA_PRIVATE
67932e54
TK
363 * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512}
364 * \param hashlen message digest length (for SIG_RSA_RAW only)
80a47a2c
TK
365 * \param hash buffer holding the message digest
366 * \param sig buffer that will hold the ciphertext
367 *
368 * \return 0 if the signing operation was successful,
369 * or an POLARSSL_ERR_RSA_XXX error code
370 *
371 * \note The "sig" buffer must be as large as the size
372 * of ctx->N (eg. 128 bytes if RSA-1024 is used).
373 */
374int rsa_pkcs1_sign( rsa_context *ctx,
375 int mode,
376 int hash_id,
377 int hashlen,
62d3e98d 378 const unsigned char *hash,
80a47a2c
TK
379 unsigned char *sig );
380
381/**
382 * \brief Do a public RSA and check the message digest
383 *
384 * \param ctx points to an RSA public key
385 * \param mode RSA_PUBLIC or RSA_PRIVATE
62d3e98d 386 * \param hash_id SIG_RSA_RAW, SIG_RSA_MD{2,4,5} or SIG_RSA_SHA{1,224,256,384,512}
67932e54 387 * \param hashlen message digest length (for SIG_RSA_RAW only)
80a47a2c
TK
388 * \param hash buffer holding the message digest
389 * \param sig buffer holding the ciphertext
390 *
391 * \return 0 if the verify operation was successful,
392 * or an POLARSSL_ERR_RSA_XXX error code
393 *
394 * \note The "sig" buffer must be as large as the size
395 * of ctx->N (eg. 128 bytes if RSA-1024 is used).
396 */
397int rsa_pkcs1_verify( rsa_context *ctx,
398 int mode,
399 int hash_id,
400 int hashlen,
62d3e98d 401 const unsigned char *hash,
80a47a2c
TK
402 unsigned char *sig );
403
404/**
405 * \brief Free the components of an RSA key
67932e54
TK
406 *
407 * \param ctx RSA Context to free
80a47a2c
TK
408 */
409void rsa_free( rsa_context *ctx );
410
62d3e98d 411/* PDKIM declarations (not part of polarssl) */
80a47a2c 412int rsa_parse_public_key( rsa_context *rsa, unsigned char *buf, int buflen );
80a47a2c
TK
413int rsa_parse_key( rsa_context *rsa, unsigned char *buf, int buflen,
414 unsigned char *pwd, int pwdlen );
415
62d3e98d 416
80a47a2c
TK
417#ifdef __cplusplus
418}
419#endif
420
421#endif /* rsa.h */