ภาพรวม
ฉันมีคำถามเฉพาะบางประการเกี่ยวกับการใช้งาน rsa_meth_st
(หรือที่เรียกว่า RSA_METHOD) ใน openSSL แต่โดยทั่วไปฉันก็สับสนเช่นกันว่ากลไกของฉันอยู่ที่ไหน (หรือควร) "ติด" โดยผู้ใช้ เมื่อดำเนินการ RSA มาตรฐาน
พื้นหลัง
ฉันกำลังพยายามพัฒนากลไกสำหรับตัวเร่งฮาร์ดแวร์ RSA แบบกำหนดเอง และมีคำถามสองสามข้อเกี่ยวกับการนำโครงสร้าง RSA_METHOD ไปใช้งาน
บริบทบางส่วน: สำหรับการเข้ารหัส ตัวเร่งความเร็วของฉันจะใช้เป็นอินพุตฐาน เลขชี้กำลังสาธารณะ และโมดูลัส และส่งกลับข้อความไซเฟอร์เท็กซ์ที่เป็นผลลัพธ์ สำหรับการถอดรหัส จะใช้อินพุตฐานและโมดูลัส ไม่จำเป็นต้องมีคีย์ส่วนตัว เนื่องจากคีย์นี้จัดเก็บไว้ในฮาร์ดแวร์ และสามารถกำหนดค่าได้ผ่านช่องทางนอกแบนด์เท่านั้น ฉันมีโมดูลเคอร์เนลที่แสดง API ให้กับโปรแกรมพื้นที่ผู้ใช้เพื่อใช้ตัวเร่งความเร็ว ตอนนี้ฉันแค่ต้องรวมมันเข้ากับ openSSL
ฉันได้สร้างกลไกที่คล้ายกันสำหรับ AES และ SHA256 แล้ว แต่ฉันกำลังประสบปัญหากับ RSA ตามหลักการแล้ว ฉันไม่ต้องการกังวลเกี่ยวกับสิ่งอื่นใดนอกจากเพียงดำเนินการยกกำลังแบบโมดูลาร์บนก้อนข้อมูลที่เตรียมไว้ล่วงหน้าและเตรียมไว้ สำหรับ SHA และ AES สิ่งนี้ตรงไปตรงมา: ทั้งหมดที่กล่าวมา ได้รับการดูแลโดยอินเทอร์เฟซ EVP ดังนั้นสิ่งที่ฉันต้องกังวลก็คือการรับข้อมูลเข้าและออกจากตัวเร่งความเร็วของฉัน แต่ดูเหมือนจะไม่ง่ายสำหรับ RSA (โปรดแก้ไขฉันด้วยหากฉันผิด)
คำถามเฉพาะของฉัน
ฉันสับสนว่าตัวชี้ฟังก์ชัน RSA_METHOD ใดที่เอ็นจิ้นของฉันจำเป็นต้องใช้ ฉันแสดงโครงสร้างด้านล่างเพื่อใช้อ้างอิง:
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
ดังนั้นสามคำถาม:
- เป็นไปได้หรือไม่ที่การใช้งาน OpenSSL RSA มาตรฐานจะใช้ฟังก์ชัน "การยกกำลังแบบโมดูลาร์" ของเอ็นจิ้นของฉัน โดยไม่ต้องเขียนฟังก์ชันตระกูล
RSA_[public|private]_[encrypt|decrypt]
ใหม่จาก /include/openssl/rsa.h - หากเป็นเช่นนั้น การใช้ฟังก์ชัน rsa_mod_exp เท่านั้นเพียงพอหรือไม่ หรือฉันต้องใช้ทั้งฟังก์ชัน public_enc/dec และ private_enc/dec ด้วย ฉันถามเพราะซอร์สโค้ดสำหรับ กลไก Intel RSAX รุ่นเก่าทำได้ แต่ฉันทำได้ ไม่ทราบว่าฟังก์ชันของเครื่องยนต์ถูกเรียกใช้อย่างไรและเมื่อใดใน "โฟลว์ RSA"
ใน /include/openssl/rsa.h ฉันเห็นมาโครต่อไปนี้สำหรับฟิลด์การตั้งค่าสถานะ RSA_METHOD (บรรทัด 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
- นี่หมายความว่าถ้าฉันใช้แฟล็กนี้ในฟิลด์ "แฟล็ก" ของ RSA_METHOD ฉันไม่จำเป็นต้องใช้ rsa_pub_enc/dec และเพื่อน ๆ หรือไม่ ฉันเดาว่าฉันแค่สับสนว่าจุดใดในกระบวนการเข้ารหัส / ถอดรหัส RSA ที่ควรเรียกใช้เอ็นจิ้นของฉัน
คำพูดใด ๆ ของภูมิปัญญาจะได้รับการชื่นชมอย่างมาก