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:
- 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? - 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
- 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.