Spec-Zone.ru › Ruby 3.4

class OpenSSL::PKey::DSA

Parent:
OpenSSL::PKey::PKey
Included modules:
OpenSSL::Marshal

DSA, the Digital Signature Algorithm, is specified in NIST’s FIPS 186-3. It is an asymmetric public key algorithm that may be used similar to e.g. RSA.

Public Class Methods

generate(size) → dsa
Source
# File ext/openssl/lib/openssl/pkey.rb, line 169
def generate(size, &blk)
  # FIPS 186-4 specifies four (L,N) pairs: (1024,160), (2048,224),
  # (2048,256), and (3072,256).
  #
  # q size is derived here with compatibility with
  # DSA_generator_parameters_ex() which previous versions of ruby/openssl
  # used to call.
  qsize = size >= 2048 ? 256 : 160
  dsaparams = OpenSSL::PKey.generate_parameters("DSA", {
    "dsa_paramgen_bits" => size,
    "dsa_paramgen_q_bits" => qsize,
  }, &blk)
  OpenSSL::PKey.generate_key(dsaparams)
end

Creates a new DSA instance by generating a private/public key pair from scratch.

See also OpenSSL::PKey.generate_parameters and OpenSSL::PKey.generate_key.

size

The desired key size in bits.

new → dsa
new(string [, pass]) → dsa
new(size) → dsa
Source
static VALUE
ossl_dsa_initialize(int argc, VALUE *argv, VALUE self)
{
    EVP_PKEY *pkey;
    DSA *dsa;
    BIO *in = NULL;
    VALUE arg, pass;
    int type;

    TypedData_Get_Struct(self, EVP_PKEY, &ossl_evp_pkey_type, pkey);
    if (pkey)
        rb_raise(rb_eTypeError, "pkey already initialized");

    /* The DSA.new(size, generator) form is handled by lib/openssl/pkey.rb */
    rb_scan_args(argc, argv, "02", &arg, &pass);
    if (argc == 0) {
        dsa = DSA_new();
        if (!dsa)
            ossl_raise(eDSAError, "DSA_new");
        goto legacy;
    }

    pass = ossl_pem_passwd_value(pass);
    arg = ossl_to_der_if_possible(arg);
    in = ossl_obj2bio(&arg);

    /* DER-encoded DSAPublicKey format isn't supported by the generic routine */
    dsa = (DSA *)PEM_ASN1_read_bio((d2i_of_void *)d2i_DSAPublicKey,
                                   PEM_STRING_DSA_PUBLIC,
                                   in, NULL, NULL, NULL);
    if (dsa)
        goto legacy;
    OSSL_BIO_reset(in);

    pkey = ossl_pkey_read_generic(in, pass);
    BIO_free(in);
    if (!pkey)
        ossl_raise(eDSAError, "Neither PUB key nor PRIV key");

    type = EVP_PKEY_base_id(pkey);
    if (type != EVP_PKEY_DSA) {
        EVP_PKEY_free(pkey);
        rb_raise(eDSAError, "incorrect pkey type: %s", OBJ_nid2sn(type));
    }
    RTYPEDDATA_DATA(self) = pkey;
    return self;

  legacy:
    BIO_free(in);
    pkey = EVP_PKEY_new();
    if (!pkey || EVP_PKEY_assign_DSA(pkey, dsa) != 1) {
        EVP_PKEY_free(pkey);
        DSA_free(dsa);
        ossl_raise(eDSAError, "EVP_PKEY_assign_DSA");
    }
    RTYPEDDATA_DATA(self) = pkey;
    return self;
}

Creates a new DSA instance by reading an existing key from string.

If called without arguments, creates a new instance with no key components set. They can be set individually by set_pqg and set_key.

If called with a String, tries to parse as DER or PEM encoding of a DSA key. See also OpenSSL::PKey.read which can parse keys of any kinds.

If called with a number, generates random parameters and a key pair. This form works as an alias of DSA.generate.

string

A String that contains a DER or PEM encoded key.

pass

A String that contains an optional password.

size

See DSA.generate.

Примеры:

p OpenSSL::PKey::DSA.new(1024)
#=> #<OpenSSL::PKey::DSA:0x000055a8d6025bf0 oid=DSA>

p OpenSSL::PKey::DSA.new(File.read('dsa.pem'))
#=> #<OpenSSL::PKey::DSA:0x000055555d6b8110 oid=DSA>

p OpenSSL::PKey::DSA.new(File.read('dsa.pem'), 'mypassword')
#=> #<OpenSSL::PKey::DSA:0x0000556f973c40b8 oid=DSA>

Общедоступные методы экземпляров

export([cipher, password]) → aString
Исходный код
static VALUE
ossl_dsa_export(int argc, VALUE *argv, VALUE self)
{
    OSSL_3_const DSA *dsa;

    GetDSA(self, dsa);
    if (DSA_HAS_PRIVATE(dsa))
        return ossl_pkey_export_traditional(argc, argv, self, 0);
    else
        return ossl_pkey_export_spki(self, 0);
}

Сериализует закрытый или открытый ключ в формате PEM.

Когда ключ содержит только открытые компоненты

Сериализует его в формате X.509 SubjectPublicKeyInfo. Параметры cipher и password игнорируются.

Ключ в формате PEM будет выглядеть так:

-----BEGIN PUBLIC KEY-----
[...]
-----END PUBLIC KEY-----

Рассмотрите использование public_to_pem вместо этого. Это сериализует ключ в формате X.509 SubjectPublicKeyInfo независимо от того, является ли он открытым или закрытым ключом.

Когда ключ содержит закрытые компоненты и параметры не заданы

Сериализует его в традиционном формате OpenSSL DSAPrivateKey.

Ключ в формате PEM будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
[...]
-----END DSA PRIVATE KEY-----
Когда ключ содержит закрытые компоненты, и заданы cipher и password

Сериализует его в традиционном формате OpenSSL DSAPrivateKey и шифрует его в традиционном формате шифрования PEM OpenSSL. cipher должен быть именем шифра, понятным для OpenSSL::Cipher.new, или экземпляром OpenSSL::Cipher.

Зашифрованный ключ в формате PEM будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0

[...]
-----END DSA PRIVATE KEY-----

Обратите внимание, что этот формат использует MD5 для вывода ключа шифрования и, следовательно, не будет доступен в системах, соответствующих стандарту FIPS.

Этот метод сохраняется для совместимости. Его следует использовать только в том случае, если требуется традиционный, нестандартный формат OpenSSL.

Рассмотрите использование public_to_pem (X.509 SubjectPublicKeyInfo) или private_to_pem (PKCS #8 PrivateKeyInfo или EncryptedPrivateKeyInfo) вместо этого.

Также известен как: to_pem, to_s
initialize_copy (p1)
Исходный код
HAVE_EVP_PKEY_DUP
static VALUE
ossl_dsa_initialize_copy(VALUE self, VALUE other)
{
    EVP_PKEY *pkey;
    DSA *dsa, *dsa_new;

    TypedData_Get_Struct(self, EVP_PKEY, &ossl_evp_pkey_type, pkey);
    if (pkey)
        rb_raise(rb_eTypeError, "pkey already initialized");
    GetDSA(other, dsa);

    dsa_new = (DSA *)ASN1_dup((i2d_of_void *)i2d_DSAPrivateKey,
                              (d2i_of_void *)d2i_DSAPrivateKey,
                              (char *)dsa);
    if (!dsa_new)
        ossl_raise(eDSAError, "ASN1_dup");

    pkey = EVP_PKEY_new();
    if (!pkey || EVP_PKEY_assign_DSA(pkey, dsa_new) != 1) {
        EVP_PKEY_free(pkey);
        DSA_free(dsa_new);
        ossl_raise(eDSAError, "EVP_PKEY_assign_DSA");
    }
    RTYPEDDATA_DATA(self) = pkey;

    return self;
}
params → hash
Исходный код
static VALUE
ossl_dsa_get_params(VALUE self)
{
    OSSL_3_const DSA *dsa;
    VALUE hash;
    const BIGNUM *p, *q, *g, *pub_key, *priv_key;

    GetDSA(self, dsa);
    DSA_get0_pqg(dsa, &p, &q, &g);
    DSA_get0_key(dsa, &pub_key, &priv_key);

    hash = rb_hash_new();
    rb_hash_aset(hash, rb_str_new2("p"), ossl_bn_new(p));
    rb_hash_aset(hash, rb_str_new2("q"), ossl_bn_new(q));
    rb_hash_aset(hash, rb_str_new2("g"), ossl_bn_new(g));
    rb_hash_aset(hash, rb_str_new2("pub_key"), ossl_bn_new(pub_key));
    rb_hash_aset(hash, rb_str_new2("priv_key"), ossl_bn_new(priv_key));

    return hash;
}

Хранит все параметры ключа в хэше НЕБЕЗОПАСНО: КОНФИДЕНЦИАЛЬНАЯ ИНФОРМАЦИЯ МОЖЕТ БЫТЬ РАСКРЫТА!!! Не используйте :-)) (Решать вам)

private? → true | false
Исходный код
static VALUE
ossl_dsa_is_private(VALUE self)
{
    OSSL_3_const DSA *dsa;

    GetDSA(self, dsa);

    return DSA_PRIVATE(self, dsa) ? Qtrue : Qfalse;
}

Указывает, имеет ли этот экземпляр DSA связанный с ним закрытый ключ или нет. Закрытый ключ можно получить с помощью DSA#private_key.

END_OF_DOCUMENT_MARKER
to_pem([cipher, password]) → aString

Сериализует закрытый или открытый ключ в кодировку PEM.

Когда ключ содержит только открытые компоненты

Сериализует его в X.509 SubjectPublicKeyInfo. Параметры cipher и password игнорируются.

PEM-кодированный ключ будет выглядеть так:

-----BEGIN PUBLIC KEY-----
[...]
-----END PUBLIC KEY-----

Вместо этого рассмотрите использование public_to_pem. Это сериализует ключ в X.509 SubjectPublicKeyInfo независимо от того, является ли он открытым или закрытым ключом.

Когда ключ содержит закрытые компоненты и параметры не заданы

Сериализует его в традиционный OpenSSL DSAPrivateKey.

PEM-кодированный ключ будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
[...]
-----END DSA PRIVATE KEY-----
Когда ключ содержит закрытые компоненты, и заданы cipher и password

Сериализует его в традиционный OpenSSL DSAPrivateKey и шифрует его в традиционном формате шифрования PEM OpenSSL. cipher должен быть именем шифра, понятным OpenSSL::Cipher.new или экземпляром OpenSSL::Cipher.

Зашифрованный PEM-кодированный ключ будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0

[...]
-----END DSA PRIVATE KEY-----

Обратите внимание, что этот формат использует MD5 для вывода ключа шифрования и, следовательно, не будет доступен на системах, совместимых с FIPS.

Этот метод сохраняется для совместимости. Его следует использовать только в том случае, если требуется традиционный, нестандартный формат OpenSSL.

Вместо этого рассмотрите использование public_to_pem (X.509 SubjectPublicKeyInfo) или private_to_pem (PKCS #8 PrivateKeyInfo или EncryptedPrivateKeyInfo).

Псевдоним для: export
to_s([cipher, password]) → aString

Сериализует закрытый или открытый ключ в кодировку PEM.

Когда ключ содержит только открытые компоненты

Сериализует его в X.509 SubjectPublicKeyInfo. Параметры cipher и password игнорируются.

PEM-кодированный ключ будет выглядеть так:

-----BEGIN PUBLIC KEY-----
[...]
-----END PUBLIC KEY-----

Вместо этого рассмотрите использование public_to_pem. Это сериализует ключ в X.509 SubjectPublicKeyInfo независимо от того, является ли он открытым или закрытым ключом.

Когда ключ содержит закрытые компоненты и параметры не заданы

Сериализует его в традиционный OpenSSL DSAPrivateKey.

PEM-кодированный ключ будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
[...]
-----END DSA PRIVATE KEY-----
Когда ключ содержит закрытые компоненты, и заданы cipher и password

Сериализует его в традиционный OpenSSL DSAPrivateKey и шифрует его в традиционном формате шифрования PEM OpenSSL. cipher должен быть именем шифра, понятным OpenSSL::Cipher.new или экземпляром OpenSSL::Cipher.

Зашифрованный PEM-кодированный ключ будет выглядеть так:

-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,733F5302505B34701FC41F5C0746E4C0

[...]
-----END DSA PRIVATE KEY-----

Обратите внимание, что этот формат использует MD5 для вывода ключа шифрования и, следовательно, не будет доступен на системах, совместимых с FIPS.

Этот метод сохраняется для совместимости. Его следует использовать только в том случае, если требуется традиционный, нестандартный формат OpenSSL.

Вместо этого рассмотрите использование public_to_pem (X.509 SubjectPublicKeyInfo) или private_to_pem (PKCS #8 PrivateKeyInfo или EncryptedPrivateKeyInfo).

Псевдоним для: export

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

Spec-Zone.ru

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