diff options
author | gotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-05 16:36:26 +0000 |
---|---|---|
committer | gotoyuzo <gotoyuzo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-12-05 16:36:26 +0000 |
commit | dd92742ce1e27971c268c0b433884733014448ab (patch) | |
tree | a6285d0f41aba3a1ae154b522911ba7c57514dfb /ext/openssl/ossl_pkey_rsa.c | |
parent | af3da7d124e67a195e761d2b8e82f80320f57387 (diff) |
* ext/openssl/ossl_pkey_rsa.c (ossl_rsa_public_encrypt,
ossl_rsa_public_decrypt, ossl_rsa_private_encrypt,
ossl_rsa_private_decrypt): should take an optional argument
to specify padding mode. [ruby-talk:122539]
* ext/openssl/ossl_pkey_rsa.c (Init_ossl_rsa): add new constants
PKCS1_PADDING, SSLV23_PADDING, NO_PADDING and PKCS1_OAEP_PADDING
under OpenSSL::PKey::RSA.
* test/openssl/test_pkey_rsa.rb: new file.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7465 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/openssl/ossl_pkey_rsa.c')
-rw-r--r-- | ext/openssl/ossl_pkey_rsa.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/ext/openssl/ossl_pkey_rsa.c b/ext/openssl/ossl_pkey_rsa.c index f8b3ae1387..75b02d23ec 100644 --- a/ext/openssl/ossl_pkey_rsa.c +++ b/ext/openssl/ossl_pkey_rsa.c @@ -252,18 +252,20 @@ ossl_rsa_to_der(VALUE self) #define ossl_rsa_buf_size(pkey) (RSA_size((pkey)->pkey.rsa)+16) static VALUE -ossl_rsa_public_encrypt(VALUE self, VALUE buffer) +ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self) { EVP_PKEY *pkey; - int buf_len; - VALUE str; - + int buf_len, pad; + VALUE str, buffer, padding; + GetPKeyRSA(self, pkey); + rb_scan_args(argc, argv, "11", &buffer, &padding); + pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding); StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_public_encrypt(RSTRING(buffer)->len, RSTRING(buffer)->ptr, RSTRING(str)->ptr, pkey->pkey.rsa, - RSA_PKCS1_PADDING); + pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); RSTRING(str)->len = buf_len; RSTRING(str)->ptr[buf_len] = 0; @@ -272,19 +274,21 @@ ossl_rsa_public_encrypt(VALUE self, VALUE buffer) } static VALUE -ossl_rsa_public_decrypt(VALUE self, VALUE buffer) +ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self) { EVP_PKEY *pkey; - int buf_len; - VALUE str; + int buf_len, pad; + VALUE str, buffer, padding; GetPKeyRSA(self, pkey); + rb_scan_args(argc, argv, "11", &buffer, &padding); + pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding); StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_public_decrypt(RSTRING(buffer)->len, RSTRING(buffer)->ptr, RSTRING(str)->ptr, pkey->pkey.rsa, - RSA_PKCS1_PADDING); - if(buf_len < 0) ossl_raise(eRSAError, NULL); + pad); + if (buf_len < 0) ossl_raise(eRSAError, NULL); RSTRING(str)->len = buf_len; RSTRING(str)->ptr[buf_len] = 0; @@ -292,21 +296,23 @@ ossl_rsa_public_decrypt(VALUE self, VALUE buffer) } static VALUE -ossl_rsa_private_encrypt(VALUE self, VALUE buffer) +ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self) { EVP_PKEY *pkey; - int buf_len; - VALUE str; - + int buf_len, pad; + VALUE str, buffer, padding; + GetPKeyRSA(self, pkey); if (!RSA_PRIVATE(pkey->pkey.rsa)) { - ossl_raise(eRSAError, "PRIVATE key needed for this operation!"); + ossl_raise(eRSAError, "private key needed."); } + rb_scan_args(argc, argv, "11", &buffer, &padding); + pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding); StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_private_encrypt(RSTRING(buffer)->len, RSTRING(buffer)->ptr, RSTRING(str)->ptr, pkey->pkey.rsa, - RSA_PKCS1_PADDING); + pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); RSTRING(str)->len = buf_len; RSTRING(str)->ptr[buf_len] = 0; @@ -315,21 +321,23 @@ ossl_rsa_private_encrypt(VALUE self, VALUE buffer) } static VALUE -ossl_rsa_private_decrypt(VALUE self, VALUE buffer) +ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) { EVP_PKEY *pkey; - int buf_len; - VALUE str; + int buf_len, pad; + VALUE str, buffer, padding; GetPKeyRSA(self, pkey); if (!RSA_PRIVATE(pkey->pkey.rsa)) { - ossl_raise(eRSAError, "Private RSA key needed!"); + ossl_raise(eRSAError, "private key needed."); } + rb_scan_args(argc, argv, "11", &buffer, &padding); + pad = (argc == 1) ? RSA_PKCS1_PADDING : NUM2INT(padding); StringValue(buffer); str = rb_str_new(0, ossl_rsa_buf_size(pkey)); buf_len = RSA_private_decrypt(RSTRING(buffer)->len, RSTRING(buffer)->ptr, RSTRING(str)->ptr, pkey->pkey.rsa, - RSA_PKCS1_PADDING); + pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); RSTRING(str)->len = buf_len; RSTRING(str)->ptr[buf_len] = 0; @@ -451,6 +459,8 @@ OSSL_PKEY_BN(rsa, iqmp); /* * INIT */ +#define DefRSAConst(x) rb_define_const(cRSA, #x,INT2FIX(RSA_##x)) + void Init_ossl_rsa() { @@ -469,10 +479,10 @@ Init_ossl_rsa() rb_define_alias(cRSA, "to_s", "export"); rb_define_method(cRSA, "to_der", ossl_rsa_to_der, 0); rb_define_method(cRSA, "public_key", ossl_rsa_to_public_key, 0); - rb_define_method(cRSA, "public_encrypt", ossl_rsa_public_encrypt, 1); - rb_define_method(cRSA, "public_decrypt", ossl_rsa_public_decrypt, 1); - rb_define_method(cRSA, "private_encrypt", ossl_rsa_private_encrypt, 1); - rb_define_method(cRSA, "private_decrypt", ossl_rsa_private_decrypt, 1); + rb_define_method(cRSA, "public_encrypt", ossl_rsa_public_encrypt, -1); + rb_define_method(cRSA, "public_decrypt", ossl_rsa_public_decrypt, -1); + rb_define_method(cRSA, "private_encrypt", ossl_rsa_private_encrypt, -1); + rb_define_method(cRSA, "private_decrypt", ossl_rsa_private_decrypt, -1); DEF_OSSL_PKEY_BN(cRSA, rsa, n); DEF_OSSL_PKEY_BN(cRSA, rsa, e); @@ -485,6 +495,11 @@ Init_ossl_rsa() rb_define_method(cRSA, "params", ossl_rsa_get_params, 0); + DefRSAConst(PKCS1_PADDING); + DefRSAConst(SSLV23_PADDING); + DefRSAConst(NO_PADDING); + DefRSAConst(PKCS1_OAEP_PADDING); + /* * TODO: Test it rb_define_method(cRSA, "blinding_on!", ossl_rsa_blinding_on, 0); |