00001
00023 #ifndef POLARSSL_RSA_H
00024 #define POLARSSL_RSA_H
00025
00026 #include "polarssl/bignum.h"
00027
00028
00029
00030
00031 #define POLARSSL_ERR_RSA_BAD_INPUT_DATA -0x0400
00032 #define POLARSSL_ERR_RSA_INVALID_PADDING -0x0410
00033 #define POLARSSL_ERR_RSA_KEY_GEN_FAILED -0x0420
00034 #define POLARSSL_ERR_RSA_KEY_CHECK_FAILED -0x0430
00035 #define POLARSSL_ERR_RSA_PUBLIC_FAILED -0x0440
00036 #define POLARSSL_ERR_RSA_PRIVATE_FAILED -0x0450
00037 #define POLARSSL_ERR_RSA_VERIFY_FAILED -0x0460
00038 #define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE -0x0470
00039
00040
00041
00042
00043 #define SIG_RSA_RAW 0
00044 #define SIG_RSA_MD2 2
00045 #define SIG_RSA_MD4 3
00046 #define SIG_RSA_MD5 4
00047 #define SIG_RSA_SHA1 5
00048 #define SIG_RSA_SHA224 14
00049 #define SIG_RSA_SHA256 11
00050 #define SIG_RSA_SHA384 12
00051 #define SIG_RSA_SHA512 13
00052
00053 #define RSA_PUBLIC 0
00054 #define RSA_PRIVATE 1
00055
00056 #define RSA_PKCS_V15 0
00057 #define RSA_PKCS_V21 1
00058
00059 #define RSA_SIGN 1
00060 #define RSA_CRYPT 2
00061
00062 #define ASN1_STR_CONSTRUCTED_SEQUENCE "\x30"
00063 #define ASN1_STR_NULL "\x05"
00064 #define ASN1_STR_OID "\x06"
00065 #define ASN1_STR_OCTET_STRING "\x04"
00066
00067 #define OID_DIGEST_ALG_MDX "\x2A\x86\x48\x86\xF7\x0D\x02\x00"
00068 #define OID_HASH_ALG_SHA1 "\x2b\x0e\x03\x02\x1a"
00069 #define OID_HASH_ALG_SHA2X "\x60\x86\x48\x01\x65\x03\x04\x02\x00"
00070
00071 #define OID_ISO_MEMBER_BODIES "\x2a"
00072 #define OID_ISO_IDENTIFIED_ORG "\x2b"
00073
00074
00075
00076
00077 #define OID_COUNTRY_US "\x86\x48"
00078 #define OID_RSA_DATA_SECURITY "\x86\xf7\x0d"
00079
00080
00081
00082
00083 #define OID_OIW_SECSIG_SHA1 "\x0e\x03\x02\x1a"
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094 #define ASN1_HASH_MDX \
00095 ( \
00096 ASN1_STR_CONSTRUCTED_SEQUENCE "\x20" \
00097 ASN1_STR_CONSTRUCTED_SEQUENCE "\x0C" \
00098 ASN1_STR_OID "\x08" \
00099 OID_DIGEST_ALG_MDX \
00100 ASN1_STR_NULL "\x00" \
00101 ASN1_STR_OCTET_STRING "\x10" \
00102 )
00103
00104 #define ASN1_HASH_SHA1 \
00105 ASN1_STR_CONSTRUCTED_SEQUENCE "\x21" \
00106 ASN1_STR_CONSTRUCTED_SEQUENCE "\x09" \
00107 ASN1_STR_OID "\x05" \
00108 OID_HASH_ALG_SHA1 \
00109 ASN1_STR_NULL "\x00" \
00110 ASN1_STR_OCTET_STRING "\x14"
00111
00112 #define ASN1_HASH_SHA2X \
00113 ASN1_STR_CONSTRUCTED_SEQUENCE "\x11" \
00114 ASN1_STR_CONSTRUCTED_SEQUENCE "\x0d" \
00115 ASN1_STR_OID "\x09" \
00116 OID_HASH_ALG_SHA2X \
00117 ASN1_STR_NULL "\x00" \
00118 ASN1_STR_OCTET_STRING "\x00"
00119
00123 typedef struct
00124 {
00125 int ver;
00126 int len;
00128 mpi N;
00129 mpi E;
00131 mpi D;
00132 mpi P;
00133 mpi Q;
00134 mpi DP;
00135 mpi DQ;
00136 mpi QP;
00138 mpi RN;
00139 mpi RP;
00140 mpi RQ;
00142 int padding;
00143 int hash_id;
00144 int (*f_rng)(void *);
00145 void *p_rng;
00146 }
00147 rsa_context;
00148
00149 #ifdef __cplusplus
00150 extern "C" {
00151 #endif
00152
00168 void rsa_init( rsa_context *ctx,
00169 int padding,
00170 int hash_id,
00171 int (*f_rng)(void *),
00172 void *p_rng );
00173
00186 int rsa_gen_key( rsa_context *ctx, int nbits, int exponent );
00187
00195 int rsa_check_pubkey( rsa_context *ctx );
00196
00204 int rsa_check_privkey( rsa_context *ctx );
00205
00222 int rsa_public( rsa_context *ctx,
00223 unsigned char *input,
00224 unsigned char *output );
00225
00238 int rsa_private( rsa_context *ctx,
00239 unsigned char *input,
00240 unsigned char *output );
00241
00256 int rsa_pkcs1_encrypt( rsa_context *ctx,
00257 int mode, int ilen,
00258 unsigned char *input,
00259 unsigned char *output );
00260
00277 int rsa_pkcs1_decrypt( rsa_context *ctx,
00278 int mode, int *olen,
00279 unsigned char *input,
00280 unsigned char *output,
00281 int output_max_len );
00282
00299 int rsa_pkcs1_sign( rsa_context *ctx,
00300 int mode,
00301 int hash_id,
00302 int hashlen,
00303 unsigned char *hash,
00304 unsigned char *sig );
00305
00322 int rsa_pkcs1_verify( rsa_context *ctx,
00323 int mode,
00324 int hash_id,
00325 int hashlen,
00326 unsigned char *hash,
00327 unsigned char *sig );
00328
00334 void rsa_free( rsa_context *ctx );
00335
00341 int rsa_self_test( int verbose );
00342
00343 #ifdef __cplusplus
00344 }
00345 #endif
00346
00347 #endif