00001 #ifndef RSA_CONTEXT_HH
00002 #define RSA_CONTEXT_HH
00003
00004 #include <string>
00005
00006 #include <openssl/rsa.h>
00007
00014 class rsa_context
00015 {
00016 public:
00023 rsa_context(int keylen);
00024
00033 rsa_context(const std::string &filename, const std::string &passwd);
00034
00043 rsa_context(const char *filename, const char *passwd);
00044
00045 virtual ~rsa_context();
00046
00052 int get_key_bits();
00053
00059 int max_ptext_bytes();
00060
00066 bool is_crt_available();
00067
00068 virtual void dump();
00069
00079 virtual void pub_encrypt(unsigned char *out, int *out_len,
00080 const unsigned char *in, int in_len);
00081
00091 virtual void priv_decrypt(unsigned char *out, int *out_len,
00092 const unsigned char *in, int in_len);
00093
00104 virtual void priv_decrypt_batch(unsigned char **out, int *out_len,
00105 const unsigned char **in, const int *in_len,
00106 int n);
00107
00108 float get_elapsed_ms_kernel();
00109
00110 static const int max_batch = 2048 / 2;
00111
00112 protected:
00113 void dump_bn(BIGNUM *bn, const char *name);
00114
00115
00116 int remove_padding(unsigned char *out, int *out_len, BIGNUM *bn);
00117
00118 RSA *rsa;
00119 BN_CTX *bn_ctx;
00120
00121 float elapsed_ms_kernel;
00122
00123 private:
00124 void set_crt();
00125
00126 bool crt_available;
00127 };
00128
00129 #endif