การใช้งานกลไก OpenSSL RSA อย่างเหมาะสม: คำถามเกี่ยวกับ rsa_meth_st

ภาพรวม

ฉันมีคำถามเฉพาะบางประการเกี่ยวกับการใช้งาน 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

ดังนั้นสามคำถาม:

  1. เป็นไปได้หรือไม่ที่การใช้งาน OpenSSL RSA มาตรฐานจะใช้ฟังก์ชัน "การยกกำลังแบบโมดูลาร์" ของเอ็นจิ้นของฉัน โดยไม่ต้องเขียนฟังก์ชันตระกูล RSA_[public|private]_[encrypt|decrypt] ใหม่จาก /include/openssl/rsa.h
  2. หากเป็นเช่นนั้น การใช้ฟังก์ชัน 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
  1. นี่หมายความว่าถ้าฉันใช้แฟล็กนี้ในฟิลด์ "แฟล็ก" ของ RSA_METHOD ฉันไม่จำเป็นต้องใช้ rsa_pub_enc/dec และเพื่อน ๆ หรือไม่ ฉันเดาว่าฉันแค่สับสนว่าจุดใดในกระบวนการเข้ารหัส / ถอดรหัส RSA ที่ควรเรียกใช้เอ็นจิ้นของฉัน

คำพูดใด ๆ ของภูมิปัญญาจะได้รับการชื่นชมอย่างมาก


person Brett    schedule 23.08.2017    source แหล่งที่มา


คำตอบ (1)


ข้อจำกัดความรับผิดชอบ ฉันไม่เคยเขียนโมดูล/เอ็นจิ้น Openssl แต่ฉันกำลังศึกษาโค้ด RSA ของ OpenSSL ในปัจจุบัน

  1. ฉันคิดว่าคุณต้องไม่เขียนฟังก์ชันตระกูล RSA_[public|private]_[encrypt|decrypt] ใหม่ ฉันจะพยายามสร้าง struct rsa_pkcs1_ossl_meth เวอร์ชันที่แก้ไขแล้วในไฟล์ การเข้ารหัสลับ/rsa/rsa_ossl.c
  2. ฉันพบว่าวิธีการของเครื่องยนต์โหลดอยู่ที่ไหน อยู่ใน crypto/rsa/rsa_lib.c ในฟังก์ชัน RSA_new_method โดยที่ ENGINE_get_RSA(ret->engine) ถูกเรียก เริ่มต้น engine->rsa_meth ของคุณด้วยตัวชี้ไปที่ RSA_METHOD strcut คล้ายกับ rsa_pkcs1_ossl_meth
  3. ฉันไม่รู้วิธีใช้แฟล็ก RSA_FLAG_EXT_PKEY แต่ใช้ใน crypto/rsa/rsa_ossl.c เหมือนที่บอกไว้ใน /include/openssl/rsa.h

IMHO ฉันจะแก้ไขแอตทริบิวต์สองสามรายการของ rsa_pkcs1_ossl_meth เพื่อสร้างโครงสร้าง RSA_METHOD ของคุณ 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 */
};

ด้วยวิธีนี้ คุณจะนำโค้ดของกลไก OpenSSL เริ่มต้นมาใช้ซ้ำ และคุณเพียงแค่ต้องติดตั้ง my_mod_exp และตั้งค่า RSA_FLAG_EXT_PKEY

person fusiled    schedule 10.09.2017