Spec-Zone.ru › Ruby 2.3

класс OpenSSL::PKey::PKey

Родитель:
Объект

Абстрактный класс, который объединяет создание подписей (PKey#sign) и проверку подписей (PKey#verify), общий для всех реализаций, кроме OpenSSL::PKey::DH.

  • OpenSSL::PKey::RSA

  • OpenSSL::PKey::DSA

  • OpenSSL::PKey::EC

Публичные методы класса

new → self Показать исходный код
static VALUE
ossl_pkey_initialize(VALUE self)
{
    if (rb_obj_is_instance_of(self, cPKey)) {
        ossl_raise(rb_eNotImpError, "OpenSSL::PKey::PKey is an abstract class.");
    }
    return self;
}

Поскольку PKey — абстрактный класс, явное вызов этого метода вызовет NotImplementedError.

Публичные методы экземпляра

sign(digest, data) → Строка Показать исходный код
static VALUE
ossl_pkey_sign(VALUE self, VALUE digest, VALUE data)
{
    EVP_PKEY *pkey;
    EVP_MD_CTX ctx;
    unsigned int buf_len;
    VALUE str;
    int result;

    if (rb_funcallv(self, id_private_q, 0, NULL) != Qtrue) {
        ossl_raise(rb_eArgError, "Private key is needed.");
    }
    GetPKey(self, pkey);
    EVP_SignInit(&ctx, GetDigestPtr(digest));
    StringValue(data);
    EVP_SignUpdate(&ctx, RSTRING_PTR(data), RSTRING_LEN(data));
    str = rb_str_new(0, EVP_PKEY_size(pkey)+16);
    result = EVP_SignFinal(&ctx, (unsigned char *)RSTRING_PTR(str), &buf_len, pkey);
    EVP_MD_CTX_cleanup(&ctx);
    if (!result)
        ossl_raise(ePKeyError, NULL);
    assert((long)buf_len <= RSTRING_LEN(str));
    rb_str_set_len(str, buf_len);

    return str;
}

Для подписания String data, digest, необходимо предоставить экземпляр OpenSSL::Digest. Значение возврата — снова String , содержащее подпись. При возникновении ошибок генерируется PKeyError. Любое предыдущее состояние экземпляра Digest не имеет отношения к результату подписи; экземпляр digest сбрасывается до первоначального состояния во время операции.

Пример

data = 'Sign me!'
digest = OpenSSL::Digest::SHA256.new
pkey = OpenSSL::PKey::RSA.new(2048)
signature = pkey.sign(digest, data)
verify(digest, signature, data) → Строка Показать исходный код
static VALUE
ossl_pkey_verify(VALUE self, VALUE digest, VALUE sig, VALUE data)
{
    EVP_PKEY *pkey;
    EVP_MD_CTX ctx;
    int result;

    GetPKey(self, pkey);
    StringValue(sig);
    StringValue(data);
    EVP_VerifyInit(&ctx, GetDigestPtr(digest));
    EVP_VerifyUpdate(&ctx, RSTRING_PTR(data), RSTRING_LEN(data));
    result = EVP_VerifyFinal(&ctx, (unsigned char *)RSTRING_PTR(sig), RSTRING_LENINT(sig), pkey);
    EVP_MD_CTX_cleanup(&ctx);
    switch (result) {
    case 0:
        return Qfalse;
    case 1:
        return Qtrue;
    default:
        ossl_raise(ePKeyError, NULL);
    }
    return Qnil; /* dummy */
}

Для проверки подписи String signature, digest, необходимо предоставить экземпляр OpenSSL::Digest для повторного вычисления хэш-суммы исходного data, также String. Возвращаемое значение — true, если подпись действительна, false — в противном случае. При возникновении ошибок генерируется PKeyError. Любое предыдущее состояние экземпляра Digest не имеет отношения к результату проверки; экземпляр digest сбрасывается до первоначального состояния во время операции.

Пример

data = 'Sign me!'
digest = OpenSSL::Digest::SHA256.new
pkey = OpenSSL::PKey::RSA.new(2048)
signature = pkey.sign(digest, data)
pub_key = pkey.public_key
puts pub_key.verify(digest, signature, data) # => true

Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API