mirror of
https://github.com/ruby/ruby.git
synced 2025-08-15 21:49:06 +02:00

* ext/openssl/ossl_ssl_session.c (ossl_ssl_session_{get,set}_time{,out}): fixed a bug introduced by backporting. (see [ruby-dev:40573]) use long in according to OpenSSL API. (SSL_SESSION_{get,set}_time{,out}) * ext/openssl/ossl_x509name.c: added X509::Name#hash_old as a wrapper for X509_NAME_hash_old in OpenSSL 1.0.0. * test/openssl/test_x509name.rb (test_hash): make test pass with OpenSSL 1.0.0. * test/openssl/test_x509*: make tests pass with OpenSSL 1.0.0b5. * PKey::PKey#verify raises an exception when a given PKey does not match with signature. * PKey::DSA#sign accepts SHA1, SHA256 other than DSS1. * backport the commit from trunk: Sun Feb 28 11:49:35 2010 NARUSE, Yui <naruse@ruby-lang.org> * openssl/ossl.c (OSSL_IMPL_SK2ARY): for OpenSSL 1.0. patched by Jeroen van Meeuwen at [ruby-core:25210] fixed by Nobuyoshi Nakada [ruby-core:25238], Hongli Lai [ruby-core:27417], and Motohiro KOSAKI [ruby-core:28063] * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab), (ossl_ssl_cipher_to_ary): constified. * ext/openssl/ossl_pkcs7.c (pkcs7_get_certs, pkcs7_get_crls): split pkcs7_get_certs_or_crls. * test/openssl/test_ec.rb: added test_dsa_sign_asn1_FIPS186_3. dgst is truncated with ec_key.group.order.size after openssl 0.9.8m for FIPS 186-3 compliance. WARNING: ruby-openssl aims to wrap an OpenSSL so when you're using openssl 0.9.8l or earlier version, EC.dsa_sign_asn1 raises OpenSSL::PKey::ECError as before and EC.dsa_verify_asn1 just returns false when you pass dgst longer than expected (no truncation performed). * ext/openssl/ossl_pkey_ec.c: rdoc typo fixed. * ext/openssl/ossl_config.c: defined own IMPLEMENT_LHASH_DOALL_ARG_FN_098 macro according to IMPLEMENT_LHASH_DOALL_ARG_FN in OpenSSL 0.9.8m. OpenSSL 1.0.0beta5 has a slightly different definiton so it could be a temporal workaround for 0.9.8 and 1.0.0 dual support. * ext/openssl/ossl_pkcs5.c (ossl_pkcs5_pbkdf2_hmac): follows function definition in OpenSSL 1.0.0beta5. PKCS5_PBKDF2_HMAC is from 1.0.0 (0.9.8 only has PKCS5_PBKDF2_HMAC_SHA1) * ext/openssl/ossl_ssl_session.c (ossl_ssl_session_eq): do not use SSL_SESSION_cmp and implement equality func by ousrself. See the comment. * ext/openssl/extconf.rb: check some functions added at OpenSSL 1.0.0. * ext/openssl/ossl_engine.c (ossl_engine_s_load): use engines which exists. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@28367 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
99 lines
2.4 KiB
C
99 lines
2.4 KiB
C
/*
|
|
* $Id$
|
|
* Copyright (C) 2007 Technorama Ltd. <oss-ruby@technorama.net>
|
|
*/
|
|
#include "ossl.h"
|
|
|
|
VALUE mPKCS5;
|
|
VALUE ePKCS5;
|
|
|
|
/*
|
|
* call-seq:
|
|
* PKCS5.pbkdf2_hmac(pass, salt, iter, keylen, digest) => string
|
|
*
|
|
* === Parameters
|
|
* * +pass+ - string
|
|
* * +salt+ - string
|
|
* * +iter+ - integer - should be greater than 1000. 2000 is better.
|
|
* * +keylen+ - integer
|
|
* * +digest+ - a string or OpenSSL::Digest object.
|
|
*
|
|
* Available in OpenSSL 0.9.9?.
|
|
*
|
|
* Digests other than SHA1 may not be supported by other cryptography libraries.
|
|
*/
|
|
static VALUE
|
|
ossl_pkcs5_pbkdf2_hmac(VALUE self, VALUE pass, VALUE salt, VALUE iter, VALUE keylen, VALUE digest)
|
|
{
|
|
#ifdef HAVE_PKCS5_PBKDF2_HMAC
|
|
VALUE str;
|
|
const EVP_MD *md;
|
|
int len = NUM2INT(keylen);
|
|
unsigned char* salt_p;
|
|
unsigned char* str_p;
|
|
|
|
StringValue(pass);
|
|
StringValue(salt);
|
|
md = GetDigestPtr(digest);
|
|
str = rb_str_new(0, len);
|
|
salt_p = (unsigned char*)RSTRING_PTR(salt);
|
|
str_p = (unsigned char*)RSTRING_PTR(str);
|
|
|
|
if (PKCS5_PBKDF2_HMAC(RSTRING_PTR(pass), RSTRING_LEN(pass), salt_p, RSTRING_LEN(salt), NUM2INT(iter), md, len, str_p) != 1)
|
|
ossl_raise(ePKCS5, "PKCS5_PBKDF2_HMAC");
|
|
|
|
return str;
|
|
#else
|
|
rb_notimplement();
|
|
#endif
|
|
}
|
|
|
|
|
|
/*
|
|
* call-seq:
|
|
* PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, keylen) => string
|
|
*
|
|
* === Parameters
|
|
* * +pass+ - string
|
|
* * +salt+ - string
|
|
* * +iter+ - integer - should be greater than 1000. 2000 is better.
|
|
* * +keylen+ - integer
|
|
*
|
|
* This method is available almost any version OpenSSL.
|
|
*
|
|
* Conforms to rfc2898.
|
|
*/
|
|
static VALUE
|
|
ossl_pkcs5_pbkdf2_hmac_sha1(VALUE self, VALUE pass, VALUE salt, VALUE iter, VALUE keylen)
|
|
{
|
|
#ifdef HAVE_PKCS5_PBKDF2_HMAC_SHA1
|
|
VALUE str;
|
|
int len = NUM2INT(keylen);
|
|
|
|
StringValue(pass);
|
|
StringValue(salt);
|
|
|
|
str = rb_str_new(0, len);
|
|
|
|
if (PKCS5_PBKDF2_HMAC_SHA1(RSTRING_PTR(pass), RSTRING_LEN(pass), RSTRING_PTR(salt), RSTRING_LEN(salt), NUM2INT(iter), len, RSTRING_PTR(str)) != 1)
|
|
ossl_raise(ePKCS5, "PKCS5_PBKDF2_HMAC_SHA1");
|
|
|
|
return str;
|
|
#else
|
|
rb_notimplement();
|
|
#endif
|
|
}
|
|
|
|
void
|
|
Init_ossl_pkcs5()
|
|
{
|
|
/*
|
|
* Password-based Encryption
|
|
*
|
|
*/
|
|
mPKCS5 = rb_define_module_under(mOSSL, "PKCS5");
|
|
ePKCS5 = rb_define_class_under(mPKCS5, "PKCS5Error", eOSSLError);
|
|
|
|
rb_define_module_function(mPKCS5, "pbkdf2_hmac", ossl_pkcs5_pbkdf2_hmac, 5);
|
|
rb_define_module_function(mPKCS5, "pbkdf2_hmac_sha1", ossl_pkcs5_pbkdf2_hmac_sha1, 4);
|
|
}
|