00001 00004 #ifndef XYSSL_RSA_H 00005 #define XYSSL_RSA_H 00006 00007 #include "bignum.h" 00008 00009 #define XYSSL_ERR_RSA_BAD_INPUT_DATA -0x0400 00010 #define XYSSL_ERR_RSA_INVALID_PADDING -0x0410 00011 #define XYSSL_ERR_RSA_KEY_GEN_FAILED -0x0420 00012 #define XYSSL_ERR_RSA_KEY_CHECK_FAILED -0x0430 00013 #define XYSSL_ERR_RSA_PUBLIC_FAILED -0x0440 00014 #define XYSSL_ERR_RSA_PRIVATE_FAILED -0x0450 00015 #define XYSSL_ERR_RSA_VERIFY_FAILED -0x0460 00016 00017 /* 00018 * PKCS#1 constants 00019 */ 00020 #define RSA_RAW 0 00021 #define RSA_MD2 2 00022 #define RSA_MD4 3 00023 #define RSA_MD5 4 00024 #define RSA_SHA1 5 00025 #define RSA_SHA256 6 00026 00027 #define RSA_PUBLIC 0 00028 #define RSA_PRIVATE 1 00029 00030 #define RSA_PKCS_V15 0 00031 #define RSA_PKCS_V21 1 00032 00033 #define RSA_SIGN 1 00034 #define RSA_CRYPT 2 00035 00036 /* 00037 * DigestInfo ::= SEQUENCE { 00038 * digestAlgorithm DigestAlgorithmIdentifier, 00039 * digest Digest } 00040 * 00041 * DigestAlgorithmIdentifier ::= AlgorithmIdentifier 00042 * 00043 * Digest ::= OCTET STRING 00044 */ 00045 #define ASN1_HASH_MDX \ 00046 "\x30\x20\x30\x0C\x06\x08\x2A\x86\x48" \ 00047 "\x86\xF7\x0D\x02\x00\x05\x00\x04\x10" 00048 00049 #define ASN1_HASH_SHA1 \ 00050 "\x30\x21\x30\x09\x06\x05\x2B\x0E\x03" \ 00051 "\x02\x1A\x05\x00\x04\x14" 00052 00056 typedef struct 00057 { 00058 int ver; 00059 int len; 00061 mpi N; 00062 mpi E; 00064 mpi D; 00065 mpi P; 00066 mpi Q; 00067 mpi DP; 00068 mpi DQ; 00069 mpi QP; 00071 mpi RN; 00072 mpi RP; 00073 mpi RQ; 00075 int padding; 00076 int hash_id; 00077 int (*f_rng)(void *); 00078 void *p_rng; 00079 } 00080 rsa_context; 00081 00082 #ifdef __cplusplus 00083 extern "C" { 00084 #endif 00085 00101 void rsa_init( rsa_context *ctx, 00102 int padding, 00103 int hash_id, 00104 int (*f_rng)(void *), 00105 void *p_rng ); 00106 00119 int rsa_gen_key( rsa_context *ctx, int nbits, int exponent ); 00120 00128 int rsa_check_pubkey( rsa_context *ctx ); 00129 00137 int rsa_check_privkey( rsa_context *ctx ); 00138 00154 int rsa_public( rsa_context *ctx, 00155 unsigned char *input, 00156 unsigned char *output ); 00157 00170 int rsa_private( rsa_context *ctx, 00171 unsigned char *input, 00172 unsigned char *output ); 00173 00188 int rsa_pkcs1_encrypt( rsa_context *ctx, 00189 int mode, int ilen, 00190 unsigned char *input, 00191 unsigned char *output ); 00192 00207 int rsa_pkcs1_decrypt( rsa_context *ctx, 00208 int mode, int *olen, 00209 unsigned char *input, 00210 unsigned char *output ); 00211 00228 int rsa_pkcs1_sign( rsa_context *ctx, 00229 int mode, 00230 int hash_id, 00231 int hashlen, 00232 unsigned char *hash, 00233 unsigned char *sig ); 00234 00251 int rsa_pkcs1_verify( rsa_context *ctx, 00252 int mode, 00253 int hash_id, 00254 int hashlen, 00255 unsigned char *hash, 00256 unsigned char *sig ); 00257 00261 void rsa_free( rsa_context *ctx ); 00262 00268 int rsa_self_test( int verbose ); 00269 00270 #ifdef __cplusplus 00271 } 00272 #endif 00273 00274 #endif /* rsa.h */