diff options
author | technorama <technorama@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-08 15:02:04 +0000 |
---|---|---|
committer | technorama <technorama@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-08 15:02:04 +0000 |
commit | 18342ff8e00ebe27584786276a68d99767a2c38d (patch) | |
tree | 9e7f4f09dace24fe7af05763aa9dbb6ae67550b8 /ext/openssl/ossl_pkey_rsa.c | |
parent | f5be4ddc8d2d76f8d3543c5ecfd852199b20b7d2 (diff) |
import OpenSSL from trunk
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12496 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/openssl/ossl_pkey_rsa.c')
-rw-r--r-- | ext/openssl/ossl_pkey_rsa.c | 117 |
1 files changed, 97 insertions, 20 deletions
diff --git a/ext/openssl/ossl_pkey_rsa.c b/ext/openssl/ossl_pkey_rsa.c index 0afdcf8d01..4a690a7cb5 100644 --- a/ext/openssl/ossl_pkey_rsa.c +++ b/ext/openssl/ossl_pkey_rsa.c @@ -84,9 +84,19 @@ rsa_generate(int size, int exp) NULL); } +/* + * call-seq: + * RSA.generate(size [, exponent]) -> rsa + * + * === Parameters + * * +size+ is an integer representing the desired key size. Keys smaller than 1024 should be considered insecure. + * * +exponent+ is an odd number normally 3, 17, or 65537. + * + */ static VALUE ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass) { +/* why does this method exist? why can't initialize take an optional exponent? */ RSA *rsa; VALUE size, exp; VALUE obj; @@ -104,6 +114,20 @@ ossl_rsa_s_generate(int argc, VALUE *argv, VALUE klass) return obj; } +/* + * call-seq: + * RSA.new([size | encoded_key] [, pass]) -> rsa + * + * === Parameters + * * +size+ is an integer representing the desired key size. + * * +encoded_key+ is a string containing PEM or DER encoded key. + * * +pass+ is an optional string with the password to decrypt the encoded key. + * + * === Examples + * * RSA.new(2048) -> rsa + * * RSA.new(File.read("rsa.pem")) -> rsa + * * RSA.new(File.read("rsa.pem"), "mypassword") -> rsa + */ static VALUE ossl_rsa_initialize(int argc, VALUE *argv, VALUE self) { @@ -157,6 +181,13 @@ ossl_rsa_initialize(int argc, VALUE *argv, VALUE self) return self; } +/* + * call-seq: + * rsa.public? -> true + * + * The return value is always true since every private key is also a public key. + * + */ static VALUE ossl_rsa_is_public(VALUE self) { @@ -164,12 +195,16 @@ ossl_rsa_is_public(VALUE self) GetPKeyRSA(self, pkey); /* - * SURPRISE! :-)) - * Every key is public at the same time! + * This method should check for n and e. BUG. */ return Qtrue; } +/* + * call-seq: + * rsa.private? -> true | false + * + */ static VALUE ossl_rsa_is_private(VALUE self) { @@ -180,6 +215,18 @@ ossl_rsa_is_private(VALUE self) return (RSA_PRIVATE(self, pkey->pkey.rsa)) ? Qtrue : Qfalse; } +/* + * call-seq: + * rsa.to_pem([cipher, pass]) -> aString + * + * === Parameters + * * +cipher+ is a Cipher object. + * * +pass+ is a string. + * + * === Examples + * * rsa.to_pem -> aString + * * rsa.to_pem(cipher, pass) -> aString + */ static VALUE ossl_rsa_export(int argc, VALUE *argv, VALUE self) { @@ -219,6 +266,11 @@ ossl_rsa_export(int argc, VALUE *argv, VALUE self) return str; } +/* + * call-seq: + * rsa.to_der -> aString + * + */ static VALUE ossl_rsa_to_der(VALUE self) { @@ -236,7 +288,7 @@ ossl_rsa_to_der(VALUE self) if((len = i2d_func(pkey->pkey.rsa, NULL)) <= 0) ossl_raise(eRSAError, NULL); str = rb_str_new(0, len); - p = RSTRING(str)->ptr; + p = RSTRING_PTR(str); if(i2d_func(pkey->pkey.rsa, &p) < 0) ossl_raise(eRSAError, NULL); ossl_str_adjust(str, p); @@ -246,6 +298,11 @@ ossl_rsa_to_der(VALUE self) #define ossl_rsa_buf_size(pkey) (RSA_size((pkey)->pkey.rsa)+16) +/* + * call-seq: + * rsa.public_encrypt(string [, padding]) -> aString + * + */ static VALUE ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self) { @@ -258,16 +315,20 @@ ossl_rsa_public_encrypt(int argc, VALUE *argv, VALUE self) 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, + buf_len = RSA_public_encrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer), + RSTRING_PTR(str), pkey->pkey.rsa, pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); - RSTRING(str)->len = buf_len; - RSTRING(str)->ptr[buf_len] = 0; + rb_str_set_len(str, buf_len); return str; } +/* + * call-seq: + * rsa.public_decrypt(string [, padding]) -> aString + * + */ static VALUE ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self) { @@ -280,16 +341,20 @@ ossl_rsa_public_decrypt(int argc, VALUE *argv, VALUE self) 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, + buf_len = RSA_public_decrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer), + RSTRING_PTR(str), pkey->pkey.rsa, pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); - RSTRING(str)->len = buf_len; - RSTRING(str)->ptr[buf_len] = 0; + rb_str_set_len(str, buf_len); return str; } +/* + * call-seq: + * rsa.private_encrypt(string [, padding]) -> aString + * + */ static VALUE ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self) { @@ -305,16 +370,21 @@ ossl_rsa_private_encrypt(int argc, VALUE *argv, VALUE self) 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, + buf_len = RSA_private_encrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer), + RSTRING_PTR(str), pkey->pkey.rsa, pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); - RSTRING(str)->len = buf_len; - RSTRING(str)->ptr[buf_len] = 0; + rb_str_set_len(str, buf_len); return str; } + +/* + * call-seq: + * rsa.private_decrypt(string [, padding]) -> aString + * + */ static VALUE ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) { @@ -330,17 +400,19 @@ ossl_rsa_private_decrypt(int argc, VALUE *argv, VALUE self) 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, + buf_len = RSA_private_decrypt(RSTRING_LEN(buffer), RSTRING_PTR(buffer), + RSTRING_PTR(str), pkey->pkey.rsa, pad); if (buf_len < 0) ossl_raise(eRSAError, NULL); - RSTRING(str)->len = buf_len; - RSTRING(str)->ptr[buf_len] = 0; + rb_str_set_len(str, buf_len); return str; } /* + * call-seq: + * rsa.params -> hash + * * Stores all parameters of key to the hash * INSECURE: PRIVATE INFORMATIONS CAN LEAK OUT!!! * Don't use :-)) (I's up to you) @@ -368,6 +440,9 @@ ossl_rsa_get_params(VALUE self) } /* + * call-seq: + * rsa.to_text -> aString + * * Prints all parameters of key to buffer * INSECURE: PRIVATE INFORMATIONS CAN LEAK OUT!!! * Don't use :-)) (It's up to you) @@ -393,6 +468,9 @@ ossl_rsa_to_text(VALUE self) } /* + * call-seq: + * rsa.public_key -> aRSA + * * Makes new instance RSA PUBLIC_KEY from PRIVATE_KEY */ static VALUE @@ -415,7 +493,6 @@ ossl_rsa_to_public_key(VALUE self) /* * TODO: Test me -extern BN_CTX *ossl_bn_ctx; static VALUE ossl_rsa_blinding_on(VALUE self) |