[ruby/openssl] pkey/dsa: refactor DSA#sys{sign,verify} with PKey#{sign,verify}_raw
With the newly added OpenSSL::PKey::PKey#{sign,verify}_raw, OpenSSL::PKey::DSA's low level signing operation methods can be implemented in Ruby. The definitions are now in lib/openssl/pkey.rb. https://github.com/ruby/openssl/commit/ce805adf0c
This commit is contained in:
parent
0c23e4a7aa
commit
5fc2912e60
@ -158,6 +158,60 @@ module OpenSSL::PKey
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# :call-seq:
|
||||
# dsa.syssign(string) -> string
|
||||
#
|
||||
# Computes and returns the \DSA signature of +string+, where +string+ is
|
||||
# expected to be an already-computed message digest of the original input
|
||||
# data. The signature is issued using the private key of this DSA instance.
|
||||
#
|
||||
# <b>Deprecated in version 3.0</b>.
|
||||
# Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
|
||||
#
|
||||
# +string+::
|
||||
# A message digest of the original input data to be signed.
|
||||
#
|
||||
# Example:
|
||||
# dsa = OpenSSL::PKey::DSA.new(2048)
|
||||
# doc = "Sign me"
|
||||
# digest = OpenSSL::Digest.digest('SHA1', doc)
|
||||
#
|
||||
# # With legacy #syssign and #sysverify:
|
||||
# sig = dsa.syssign(digest)
|
||||
# p dsa.sysverify(digest, sig) #=> true
|
||||
#
|
||||
# # With #sign_raw and #verify_raw:
|
||||
# sig = dsa.sign_raw(nil, digest)
|
||||
# p dsa.verify_raw(nil, sig, digest) #=> true
|
||||
def syssign(string)
|
||||
q or raise OpenSSL::PKey::DSAError, "incomplete DSA"
|
||||
private? or raise OpenSSL::PKey::DSAError, "Private DSA key needed!"
|
||||
begin
|
||||
sign_raw(nil, string)
|
||||
rescue OpenSSL::PKey::PKeyError
|
||||
raise OpenSSL::PKey::DSAError, $!.message
|
||||
end
|
||||
end
|
||||
|
||||
# :call-seq:
|
||||
# dsa.sysverify(digest, sig) -> true | false
|
||||
#
|
||||
# Verifies whether the signature is valid given the message digest input.
|
||||
# It does so by validating +sig+ using the public key of this DSA instance.
|
||||
#
|
||||
# <b>Deprecated in version 3.0</b>.
|
||||
# Consider using PKey::PKey#sign_raw and PKey::PKey#verify_raw instead.
|
||||
#
|
||||
# +digest+::
|
||||
# A message digest of the original input data to be signed.
|
||||
# +sig+::
|
||||
# A \DSA signature value.
|
||||
def sysverify(digest, sig)
|
||||
verify_raw(nil, sig, digest)
|
||||
rescue OpenSSL::PKey::PKeyError
|
||||
raise OpenSSL::PKey::DSAError, $!.message
|
||||
end
|
||||
end
|
||||
|
||||
if defined?(EC)
|
||||
|
@ -264,92 +264,6 @@ ossl_dsa_get_params(VALUE self)
|
||||
return hash;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* dsa.syssign(string) -> aString
|
||||
*
|
||||
* Computes and returns the DSA signature of _string_, where _string_ is
|
||||
* expected to be an already-computed message digest of the original input
|
||||
* data. The signature is issued using the private key of this DSA instance.
|
||||
*
|
||||
* === Parameters
|
||||
* * _string_ is a message digest of the original input data to be signed.
|
||||
*
|
||||
* === Example
|
||||
* dsa = OpenSSL::PKey::DSA.new(2048)
|
||||
* doc = "Sign me"
|
||||
* digest = OpenSSL::Digest.digest('SHA1', doc)
|
||||
* sig = dsa.syssign(digest)
|
||||
*
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_dsa_sign(VALUE self, VALUE data)
|
||||
{
|
||||
DSA *dsa;
|
||||
const BIGNUM *dsa_q;
|
||||
unsigned int buf_len;
|
||||
VALUE str;
|
||||
|
||||
GetDSA(self, dsa);
|
||||
DSA_get0_pqg(dsa, NULL, &dsa_q, NULL);
|
||||
if (!dsa_q)
|
||||
ossl_raise(eDSAError, "incomplete DSA");
|
||||
if (!DSA_PRIVATE(self, dsa))
|
||||
ossl_raise(eDSAError, "Private DSA key needed!");
|
||||
StringValue(data);
|
||||
str = rb_str_new(0, DSA_size(dsa));
|
||||
if (!DSA_sign(0, (unsigned char *)RSTRING_PTR(data), RSTRING_LENINT(data),
|
||||
(unsigned char *)RSTRING_PTR(str),
|
||||
&buf_len, dsa)) { /* type is ignored (0) */
|
||||
ossl_raise(eDSAError, NULL);
|
||||
}
|
||||
rb_str_set_len(str, buf_len);
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* dsa.sysverify(digest, sig) -> true | false
|
||||
*
|
||||
* Verifies whether the signature is valid given the message digest input. It
|
||||
* does so by validating _sig_ using the public key of this DSA instance.
|
||||
*
|
||||
* === Parameters
|
||||
* * _digest_ is a message digest of the original input data to be signed
|
||||
* * _sig_ is a DSA signature value
|
||||
*
|
||||
* === Example
|
||||
* dsa = OpenSSL::PKey::DSA.new(2048)
|
||||
* doc = "Sign me"
|
||||
* digest = OpenSSL::Digest.digest('SHA1', doc)
|
||||
* sig = dsa.syssign(digest)
|
||||
* puts dsa.sysverify(digest, sig) # => true
|
||||
*
|
||||
*/
|
||||
static VALUE
|
||||
ossl_dsa_verify(VALUE self, VALUE digest, VALUE sig)
|
||||
{
|
||||
DSA *dsa;
|
||||
int ret;
|
||||
|
||||
GetDSA(self, dsa);
|
||||
StringValue(digest);
|
||||
StringValue(sig);
|
||||
/* type is ignored (0) */
|
||||
ret = DSA_verify(0, (unsigned char *)RSTRING_PTR(digest), RSTRING_LENINT(digest),
|
||||
(unsigned char *)RSTRING_PTR(sig), RSTRING_LENINT(sig), dsa);
|
||||
if (ret < 0) {
|
||||
ossl_raise(eDSAError, NULL);
|
||||
}
|
||||
else if (ret == 1) {
|
||||
return Qtrue;
|
||||
}
|
||||
|
||||
return Qfalse;
|
||||
}
|
||||
|
||||
/*
|
||||
* Document-method: OpenSSL::PKey::DSA#set_pqg
|
||||
* call-seq:
|
||||
@ -404,8 +318,6 @@ Init_ossl_dsa(void)
|
||||
rb_define_alias(cDSA, "to_pem", "export");
|
||||
rb_define_alias(cDSA, "to_s", "export");
|
||||
rb_define_method(cDSA, "to_der", ossl_dsa_to_der, 0);
|
||||
rb_define_method(cDSA, "syssign", ossl_dsa_sign, 1);
|
||||
rb_define_method(cDSA, "sysverify", ossl_dsa_verify, 2);
|
||||
|
||||
DEF_OSSL_PKEY_BN(cDSA, dsa, p);
|
||||
DEF_OSSL_PKEY_BN(cDSA, dsa, q);
|
||||
|
Loading…
x
Reference in New Issue
Block a user