PolarSSL v1.1.4
rsa.h
Go to the documentation of this file.
1 
27 #ifndef POLARSSL_RSA_H
28 #define POLARSSL_RSA_H
29 
30 #include "bignum.h"
31 
32 /*
33  * RSA Error codes
34  */
35 #define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x4080
36 #define POLARSSL_ERR_RSA_INVALID_PADDING -0x4100
37 #define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x4180
38 #define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x4200
39 #define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x4280
40 #define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x4300
41 #define POLARSSL_ERR_RSA_VERIFY_FAILED -0x4380
42 #define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE -0x4400
43 #define POLARSSL_ERR_RSA_RNG_FAILED -0x4480
45 /*
46  * PKCS#1 constants
47  */
48 #define SIG_RSA_RAW 0
49 #define SIG_RSA_MD2 2
50 #define SIG_RSA_MD4 3
51 #define SIG_RSA_MD5 4
52 #define SIG_RSA_SHA1 5
53 #define SIG_RSA_SHA224 14
54 #define SIG_RSA_SHA256 11
55 #define SIG_RSA_SHA384 12
56 #define SIG_RSA_SHA512 13
57 
58 #define RSA_PUBLIC 0
59 #define RSA_PRIVATE 1
60 
61 #define RSA_PKCS_V15 0
62 #define RSA_PKCS_V21 1
63 
64 #define RSA_SIGN 1
65 #define RSA_CRYPT 2
66 
67 #define ASN1_STR_CONSTRUCTED_SEQUENCE "\x30"
68 #define ASN1_STR_NULL "\x05"
69 #define ASN1_STR_OID "\x06"
70 #define ASN1_STR_OCTET_STRING "\x04"
71 
72 #define OID_DIGEST_ALG_MDX "\x2A\x86\x48\x86\xF7\x0D\x02\x00"
73 #define OID_HASH_ALG_SHA1 "\x2b\x0e\x03\x02\x1a"
74 #define OID_HASH_ALG_SHA2X "\x60\x86\x48\x01\x65\x03\x04\x02\x00"
75 
76 #define OID_ISO_MEMBER_BODIES "\x2a"
77 #define OID_ISO_IDENTIFIED_ORG "\x2b"
78 
79 /*
80  * ISO Member bodies OID parts
81  */
82 #define OID_COUNTRY_US "\x86\x48"
83 #define OID_RSA_DATA_SECURITY "\x86\xf7\x0d"
84 
85 /*
86  * ISO Identified organization OID parts
87  */
88 #define OID_OIW_SECSIG_SHA1 "\x0e\x03\x02\x1a"
89 
90 /*
91  * DigestInfo ::= SEQUENCE {
92  * digestAlgorithm DigestAlgorithmIdentifier,
93  * digest Digest }
94  *
95  * DigestAlgorithmIdentifier ::= AlgorithmIdentifier
96  *
97  * Digest ::= OCTET STRING
98  */
99 #define ASN1_HASH_MDX \
100 ( \
101  ASN1_STR_CONSTRUCTED_SEQUENCE "\x20" \
102  ASN1_STR_CONSTRUCTED_SEQUENCE "\x0C" \
103  ASN1_STR_OID "\x08" \
104  OID_DIGEST_ALG_MDX \
105  ASN1_STR_NULL "\x00" \
106  ASN1_STR_OCTET_STRING "\x10" \
107 )
108 
109 #define ASN1_HASH_SHA1 \
110  ASN1_STR_CONSTRUCTED_SEQUENCE "\x21" \
111  ASN1_STR_CONSTRUCTED_SEQUENCE "\x09" \
112  ASN1_STR_OID "\x05" \
113  OID_HASH_ALG_SHA1 \
114  ASN1_STR_NULL "\x00" \
115  ASN1_STR_OCTET_STRING "\x14"
116 
117 #define ASN1_HASH_SHA2X \
118  ASN1_STR_CONSTRUCTED_SEQUENCE "\x11" \
119  ASN1_STR_CONSTRUCTED_SEQUENCE "\x0d" \
120  ASN1_STR_OID "\x09" \
121  OID_HASH_ALG_SHA2X \
122  ASN1_STR_NULL "\x00" \
123  ASN1_STR_OCTET_STRING "\x00"
124 
128 typedef struct
129 {
130  int ver;
131  size_t len;
133  mpi N;
134  mpi E;
136  mpi D;
137  mpi P;
138  mpi Q;
139  mpi DP;
140  mpi DQ;
141  mpi QP;
143  mpi RN;
144  mpi RP;
145  mpi RQ;
147  int padding;
149  int hash_id;
153 }
155 
156 #ifdef __cplusplus
157 extern "C" {
158 #endif
159 
170 void rsa_init( rsa_context *ctx,
171  int padding,
172  int hash_id);
173 
188 int rsa_gen_key( rsa_context *ctx,
189  int (*f_rng)(void *, unsigned char *, size_t),
190  void *p_rng,
191  unsigned int nbits, int exponent );
192 
200 int rsa_check_pubkey( const rsa_context *ctx );
201 
209 int rsa_check_privkey( const rsa_context *ctx );
210 
227 int rsa_public( rsa_context *ctx,
228  const unsigned char *input,
229  unsigned char *output );
230 
243 int rsa_private( rsa_context *ctx,
244  const unsigned char *input,
245  unsigned char *output );
246 
264  int (*f_rng)(void *, unsigned char *, size_t),
265  void *p_rng,
266  int mode, size_t ilen,
267  const unsigned char *input,
268  unsigned char *output );
269 
287  int mode, size_t *olen,
288  const unsigned char *input,
289  unsigned char *output,
290  size_t output_max_len );
291 
316 int rsa_pkcs1_sign( rsa_context *ctx,
317  int (*f_rng)(void *, unsigned char *, size_t),
318  void *p_rng,
319  int mode,
320  int hash_id,
321  unsigned int hashlen,
322  const unsigned char *hash,
323  unsigned char *sig );
324 
347 int rsa_pkcs1_verify( rsa_context *ctx,
348  int mode,
349  int hash_id,
350  unsigned int hashlen,
351  const unsigned char *hash,
352  unsigned char *sig );
353 
359 void rsa_free( rsa_context *ctx );
360 
366 int rsa_self_test( int verbose );
367 
368 #ifdef __cplusplus
369 }
370 #endif
371 
372 #endif /* rsa.h */