Implementasi yang tepat dari mesin OpenSSL RSA: pertanyaan tentang rsa_meth_st

Ringkasan

Saya memiliki beberapa pertanyaan spesifik mengenai implementasi rsa_meth_st (alias RSA_METHOD) di openSSL, namun saya juga biasanya bingung di mana tepatnya mesin saya (atau seharusnya) "terkait" oleh pengguna, ketika melakukan operasi RSA standar.

Latar belakang

Saya mencoba mengembangkan mesin untuk akselerator perangkat keras RSA khusus, dan memiliki beberapa pertanyaan tentang implementasi struktur RSA_METHOD.

Beberapa konteks: untuk enkripsi, akselerator saya mengambil basis, eksponen publik, dan modulus sebagai input, dan mengembalikan teks sandi yang dihasilkan. Untuk dekripsi, dibutuhkan input basis, dan modulus. Ini tidak memerlukan kunci pribadi, karena disimpan dalam perangkat keras, dan hanya dapat dikonfigurasi melalui saluran out-of-band. Saya sudah memiliki modul kernel yang memaparkan API ke program ruang pengguna untuk menggunakan akselerator. Sekarang saya hanya perlu mengintegrasikannya ke openSSL.

Saya sudah membuat mesin serupa untuk AES dan SHA256, namun saya kesulitan dengan RSA. Idealnya, saya tidak perlu khawatir tentang apa pun selain sekadar melakukan eksponensial modular pada potongan data yang telah diisi dan disiapkan sebelumnya. Untuk SHA dan AES, ini mudah saja: semua itu tadi ditangani oleh antarmuka EVP, jadi yang perlu saya khawatirkan hanyalah mendapatkan data ke dan dari akselerator saya. Namun tampaknya tidak sesederhana itu untuk RSA (tolong koreksi saya jika saya salah).

Pertanyaan Khusus Saya

Saya bingung dengan penunjuk fungsi RSA_METHOD mana yang perlu diimplementasikan oleh mesin saya. Saya menunjukkan struktur di bawah ini untuk referensi:

struct rsa_meth_st {
    char *name;
    int (*rsa_pub_enc) (int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);
    int (*rsa_pub_dec) (int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);
    int (*rsa_priv_enc) (int flen, const unsigned char *from,
                         unsigned char *to, RSA *rsa, int padding);
    int (*rsa_priv_dec) (int flen, const unsigned char *from,
                         unsigned char *to, RSA *rsa, int padding);

    int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);

    int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
                       const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
    /* ....stuff.... */
    int flags;
    /* .... stuff ... */
};  // TYPEDEF'ED TO RSA_METHOD in include/ossl_typ.h

Jadi, tiga pertanyaan:

  1. Apakah implementasi OpenSSL RSA standar dapat menggunakan fungsi "eksponensial modular" mesin saya, tanpa harus menulis ulang rangkaian fungsi RSA_[public|private]_[encrypt|decrypt] dari /include/openssl/rsa.h?
  2. Jika ya, apakah cukup mengimplementasikan fungsi rsa_mod_exp saja? Atau haruskah saya mengimplementasikan fungsi public_enc/dec dan private_enc/dec juga? Saya bertanya, karena kode sumber untuk mesin Intel RSAX melakukan ini, tapi saya bisa' Saya tidak tahu bagaimana dan kapan dalam "aliran RSA" fungsi mesin dipanggil.

Di /include/openssl/rsa.h, saya melihat makro berikut untuk bidang bendera RSA_METHOD (baris 61):

/*
 * This flag means the private key operations will be handled by rsa_mod_exp
 * and that they do not depend on the private key components being present:
 * for example a key stored in external hardware. Without this flag
 * bn_mod_exp gets called when private key components are absent.
 */
# define RSA_FLAG_EXT_PKEY               0x0020
  1. Apakah ini berarti jika saya menggunakan tanda ini di bidang "bendera" RSA_METHOD, saya TIDAK perlu mengimplementasikan rsa_pub_enc/dec dan teman-teman? Saya kira saya hanya bingung pada titik mana dalam proses enkripsi/dekripsi RSA mesin saya harus dipanggil.

Kata-kata bijak apa pun akan sangat dihargai.


person Brett    schedule 23.08.2017    source sumber


Jawaban (1)


Penafian Saya belum pernah menulis modul/mesin Openssl, tetapi saya sedang mempelajari kode RSA OpenSSL akhir-akhir ini.

  1. Saya pikir Anda tidak boleh menulis ulang rangkaian fungsi RSA_[public|private]_[encrypt|decrypt]. Saya akan mencoba membuat versi modifikasi dari struct rsa_pkcs1_ossl_meth di file crypto/rsa/rsa_ossl.c
  2. Saya menemukan di mana metode mesin dimuat. Ada di crypto/rsa/rsa_lib.c dalam fungsi RSA_new_method di mana ENGINE_get_RSA(ret->engine) dipanggil. Init engine->rsa_meth Anda dengan penunjuk ke strcut RSA_METHOD yang mirip dengan rsa_pkcs1_ossl_meth.
  3. Saya tidak tahu cara menggunakan tanda RSA_FLAG_EXT_PKEY, tetapi tanda ini digunakan di crypto/rsa/rsa_ossl.c seperti yang diceritakan di /include/openssl/rsa.h

IMHO, saya hanya akan memodifikasi beberapa atribut rsa_pkcs1_ossl_meth untuk membuat struct RSA_METHOD Anda ENGINE:

static RSA_METHOD rsa_pkcs1_ossl_meth = {
    "my_RSA",
    rsa_ossl_public_encrypt,
    rsa_ossl_public_decrypt,     /* signature verification */
    rsa_ossl_private_encrypt,    /* signing */
    rsa_ossl_private_decrypt,
    my_mod_exp,                  //<------- YOUR mod_exp_function
    NULL,
    rsa_ossl_init,
    rsa_ossl_finish,
    RSA_FLAG_FIPS_METHOD | RSA_FLAG_EXT_PKEY,       //<--- flags
                // RSA_FLAG_EXT_PKEY tells to use hardware */
    NULL,
    0,                          /* rsa_sign */
    0,                          /* rsa_verify */
    NULL                        /* rsa_keygen */
};

Dengan cara ini Anda menggunakan kembali kode mesin OpenSSL default dan Anda hanya perlu mengimplementasikan my_mod_exp dan mengatur RSA_FLAG_EXT_PKEY.

person fusiled    schedule 10.09.2017