00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_OSSL_PKEY_H_)
00012 #define _OSSL_PKEY_H_
00013
00014 extern VALUE mPKey;
00015 extern VALUE cPKey;
00016 extern VALUE ePKeyError;
00017 extern ID id_private_q;
00018
00019 #define OSSL_PKEY_SET_PRIVATE(obj) rb_iv_set((obj), "private", Qtrue)
00020 #define OSSL_PKEY_SET_PUBLIC(obj) rb_iv_set((obj), "private", Qfalse)
00021 #define OSSL_PKEY_IS_PRIVATE(obj) (rb_iv_get((obj), "private") == Qtrue)
00022
00023 #define WrapPKey(klass, obj, pkey) do { \
00024 if (!(pkey)) { \
00025 rb_raise(rb_eRuntimeError, "PKEY wasn't initialized!"); \
00026 } \
00027 (obj) = Data_Wrap_Struct((klass), 0, EVP_PKEY_free, (pkey)); \
00028 OSSL_PKEY_SET_PUBLIC(obj); \
00029 } while (0)
00030 #define GetPKey(obj, pkey) do {\
00031 Data_Get_Struct((obj), EVP_PKEY, (pkey));\
00032 if (!(pkey)) { \
00033 rb_raise(rb_eRuntimeError, "PKEY wasn't initialized!");\
00034 } \
00035 } while (0)
00036 #define SafeGetPKey(obj, pkey) do { \
00037 OSSL_Check_Kind((obj), cPKey); \
00038 GetPKey((obj), (pkey)); \
00039 } while (0)
00040
00041 void ossl_generate_cb(int, int, void *);
00042 #define HAVE_BN_GENCB defined(HAVE_RSA_GENERATE_KEY_EX) || defined(HAVE_DH_GENERATE_PARAMETERS_EX) || defined(HAVE_DSA_GENERATE_PARAMETERS_EX)
00043 #if HAVE_BN_GENCB
00044 struct ossl_generate_cb_arg {
00045 int yield;
00046 int stop;
00047 int state;
00048 };
00049 int ossl_generate_cb_2(int p, int n, BN_GENCB *cb);
00050 void ossl_generate_cb_stop(void *ptr);
00051 #endif
00052
00053 VALUE ossl_pkey_new(EVP_PKEY *);
00054 VALUE ossl_pkey_new_from_file(VALUE);
00055 EVP_PKEY *GetPKeyPtr(VALUE);
00056 EVP_PKEY *DupPKeyPtr(VALUE);
00057 EVP_PKEY *GetPrivPKeyPtr(VALUE);
00058 EVP_PKEY *DupPrivPKeyPtr(VALUE);
00059 void Init_ossl_pkey(void);
00060
00061
00062
00063
00064 extern VALUE cRSA;
00065 extern VALUE eRSAError;
00066
00067 VALUE ossl_rsa_new(EVP_PKEY *);
00068 void Init_ossl_rsa(void);
00069
00070
00071
00072
00073 extern VALUE cDSA;
00074 extern VALUE eDSAError;
00075
00076 VALUE ossl_dsa_new(EVP_PKEY *);
00077 void Init_ossl_dsa(void);
00078
00079
00080
00081
00082 extern VALUE cDH;
00083 extern VALUE eDHError;
00084 extern DH *OSSL_DEFAULT_DH_512;
00085 extern DH *OSSL_DEFAULT_DH_1024;
00086
00087 VALUE ossl_dh_new(EVP_PKEY *);
00088 void Init_ossl_dh(void);
00089
00090
00091
00092
00093 extern VALUE cEC;
00094 extern VALUE eECError;
00095 extern VALUE cEC_GROUP;
00096 extern VALUE eEC_GROUP;
00097 extern VALUE cEC_POINT;
00098 extern VALUE eEC_POINT;
00099 VALUE ossl_ec_new(EVP_PKEY *);
00100 void Init_ossl_ec(void);
00101
00102
00103 #define OSSL_PKEY_BN(keytype, name) \
00104
00105
00106
00107 \
00108 static VALUE ossl_##keytype##_get_##name(VALUE self) \
00109 { \
00110 EVP_PKEY *pkey; \
00111 BIGNUM *bn; \
00112 \
00113 GetPKey(self, pkey); \
00114 bn = pkey->pkey.keytype->name; \
00115 if (bn == NULL) \
00116 return Qnil; \
00117 return ossl_bn_new(bn); \
00118 } \
00119
00120
00121
00122 \
00123 static VALUE ossl_##keytype##_set_##name(VALUE self, VALUE bignum) \
00124 { \
00125 EVP_PKEY *pkey; \
00126 BIGNUM *bn; \
00127 \
00128 GetPKey(self, pkey); \
00129 if (NIL_P(bignum)) { \
00130 BN_clear_free(pkey->pkey.keytype->name); \
00131 pkey->pkey.keytype->name = NULL; \
00132 return Qnil; \
00133 } \
00134 \
00135 bn = GetBNPtr(bignum); \
00136 if (pkey->pkey.keytype->name == NULL) \
00137 pkey->pkey.keytype->name = BN_new(); \
00138 if (pkey->pkey.keytype->name == NULL) \
00139 ossl_raise(eBNError, NULL); \
00140 if (BN_copy(pkey->pkey.keytype->name, bn) == NULL) \
00141 ossl_raise(eBNError, NULL); \
00142 return bignum; \
00143 }
00144
00145 #define DEF_OSSL_PKEY_BN(class, keytype, name) \
00146 do { \
00147 rb_define_method((class), #name, ossl_##keytype##_get_##name, 0); \
00148 rb_define_method((class), #name "=", ossl_##keytype##_set_##name, 1);\
00149 } while (0)
00150
00151 #endif
00152