From: <iro...@us...> - 2004-02-16 04:50:13
|
Update of /cvsroot/perl-openssl/Crypt/OpenSSL/RSA In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9294 Modified Files: RSA.xs Log Message: stop using a hash table to store values, and just use a C struct Index: RSA.xs =================================================================== RCS file: /cvsroot/perl-openssl/Crypt/OpenSSL/RSA/RSA.xs,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** RSA.xs 16 Feb 2004 03:39:19 -0000 1.36 --- RSA.xs 16 Feb 2004 04:42:24 -0000 1.37 *************** *** 6,9 **** --- 6,16 ---- #include <openssl/bn.h> + typedef struct + { + RSA* rsa; + int padding; + int hashMode; + } rsaData; + /* Key names for the rsa hash structure */ *************** *** 18,55 **** __FILE__, __LINE__, ERR_reason_error_string(ERR_get_error())); - /* convenience hv routines - I'm lazy */ - - void hvStore(HV* hv, char* key, SV* value) - { - hv_delete(hv, key, strlen(key), G_DISCARD); - - if (hv_store(hv, key, strlen(key), value, 0) != NULL) - { - SvREFCNT_inc(value); - } - } - - SV** hvFetch(HV* hv, char* key) - { - return hv_fetch(hv, key, strlen(key), 0); - } - /* Free the RSA key, if there is one */ ! void free_RSA_key(HV* rsa_HV) { ! SV** rsa_ptr_SV_ptr; ! if ((rsa_ptr_SV_ptr = hvFetch(rsa_HV, KEY_KEY)) != NULL) { ! RSA_free((RSA*) SvIV(*rsa_ptr_SV_ptr)); ! hv_delete(rsa_HV, KEY_KEY, strlen(KEY_KEY), G_DISCARD); } } ! RSA* get_RSA_key(HV* rsa_HV) { ! SV** rsa_ptr_SV_ptr; ! if ((rsa_ptr_SV_ptr = hvFetch(rsa_HV, KEY_KEY)) == NULL) { croak("There is no key set"); --- 25,46 ---- __FILE__, __LINE__, ERR_reason_error_string(ERR_get_error())); /* Free the RSA key, if there is one */ ! void free_RSA_key(SV* p_rsa) { ! rsaData* rsa; ! rsa = (rsaData*) SvIV(p_rsa); ! if (rsa->rsa) { ! RSA_free(rsa->rsa); } } ! RSA* get_RSA_key(SV* p_rsa) { ! rsaData* rsa; ! rsa = (rsaData*) (SvIV(SvRV(p_rsa))); ! if (!rsa->rsa) { croak("There is no key set"); *************** *** 57,109 **** else { ! return (RSA*) SvIV(*rsa_ptr_SV_ptr); } } ! void set_RSA_key(HV* rsa_HV, RSA* rsa) ! { ! hvStore(rsa_HV, KEY_KEY, sv_2mortal(newSViv((IV)rsa))); ! } ! ! int get_padding(HV* rsa_HV) { ! SV** padding; ! ! padding = hvFetch(rsa_HV, PADDING_KEY); ! return padding == NULL ? -1 : SvIV(*padding); } ! void set_padding(HV* rsa_HV, int padding) { ! hvStore(rsa_HV, PADDING_KEY, sv_2mortal(newSViv((IV) padding))); } ! int get_hash(HV* rsa_HV) { ! SV** hash; ! ! hash = hvFetch(rsa_HV, HASH_KEY); ! return hash == NULL ? -1 : SvIV(*hash); } ! void set_hash(HV* rsa_HV, int hash) { ! hvStore(rsa_HV, HASH_KEY, sv_2mortal(newSViv((IV) hash))); } ! char is_private(HV* rsa_HV) { ! return(get_RSA_key(rsa_HV)->d != NULL); } SV* make_rsa_obj(SV* p_proto, RSA* p_rsa) { ! HV* rsa_HV; ! rsa_HV = newHV(); ! hvStore(rsa_HV, KEY_KEY, sv_2mortal(newSViv((IV) p_rsa ))); ! set_hash(rsa_HV, NID_sha1); ! set_padding(rsa_HV, RSA_PKCS1_OAEP_PADDING); return sv_bless( ! newRV_noinc((SV*) rsa_HV), (SvROK(p_proto) ? SvSTASH(SvRV(p_proto)) : gv_stashsv(p_proto, 1))); } --- 48,95 ---- else { ! return rsa->rsa; } } ! int get_padding(SV* p_rsa) { ! return ((rsaData*) SvIV(SvRV(p_rsa)))->padding; } ! void set_padding(SV* p_rsa, int p_padding) { ! ((rsaData*) SvIV(SvRV(p_rsa)))->padding = p_padding; } ! int get_hash(SV* p_rsa) { ! return ((rsaData*) SvIV(SvRV(p_rsa)))->hashMode; } ! void set_hash(SV* p_rsa, int p_hashMode) { ! ((rsaData*) SvIV(SvRV(p_rsa)))->hashMode = p_hashMode; } ! char is_private(SV* p_rsa) { ! return(get_RSA_key(p_rsa)->d != NULL); } SV* make_rsa_obj(SV* p_proto, RSA* p_rsa) { ! rsaData* rsa; ! SV* rsaSv; ! SV* rsaSvRef; ! ! if (New(0, rsa, 1, rsaData) == NULL) ! { ! croak("unable to allocate memory"); ! } ! rsa->rsa = p_rsa; ! rsa->hashMode = NID_sha1; ! rsa->padding = RSA_PKCS1_OAEP_PADDING; return sv_bless( ! newRV_inc(newSViv((IV) rsa)), (SvROK(p_proto) ? SvSTASH(SvRV(p_proto)) : gv_stashsv(p_proto, 1))); } *************** *** 259,270 **** void ! _free_RSA_key(rsa_HV) ! HV* rsa_HV; CODE: ! free_RSA_key(rsa_HV); SV* ! get_private_key_string(rsa_HV) ! HV* rsa_HV; PREINIT: BIO* stringBIO; --- 245,256 ---- void ! _free_RSA_key(p_rsa) ! SV* p_rsa; CODE: ! free_RSA_key(p_rsa); SV* ! get_private_key_string(p_rsa) ! SV* p_rsa; PREINIT: BIO* stringBIO; *************** *** 272,276 **** CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) PEM_write_bio_RSAPrivateKey( ! stringBIO, get_RSA_key(rsa_HV), NULL, NULL, 0, NULL, NULL); RETVAL = extractBioString(stringBIO); --- 258,262 ---- CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) PEM_write_bio_RSAPrivateKey( ! stringBIO, get_RSA_key(p_rsa), NULL, NULL, 0, NULL, NULL); RETVAL = extractBioString(stringBIO); *************** *** 279,289 **** SV* ! get_public_key_string(rsa_HV) ! HV* rsa_HV; PREINIT: BIO* stringBIO; CODE: CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) ! PEM_write_bio_RSAPublicKey(stringBIO, get_RSA_key(rsa_HV)); RETVAL = extractBioString(stringBIO); --- 265,275 ---- SV* ! get_public_key_string(p_rsa) ! SV* p_rsa; PREINIT: BIO* stringBIO; CODE: CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) ! PEM_write_bio_RSAPublicKey(stringBIO, get_RSA_key(p_rsa)); RETVAL = extractBioString(stringBIO); *************** *** 292,302 **** SV* ! get_public_key_x509_string(rsa_HV) ! HV* rsa_HV; PREINIT: BIO* stringBIO; CODE: CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) ! PEM_write_bio_RSA_PUBKEY(stringBIO, get_RSA_key(rsa_HV)); RETVAL = extractBioString(stringBIO); --- 278,288 ---- SV* ! get_public_key_x509_string(p_rsa) ! SV* p_rsa; PREINIT: BIO* stringBIO; CODE: CHECK_OPEN_SSL(stringBIO = BIO_new(BIO_s_mem())) ! PEM_write_bio_RSA_PUBKEY(stringBIO, get_RSA_key(p_rsa)); RETVAL = extractBioString(stringBIO); *************** *** 408,417 **** void ! _get_key_parameters(rsa_HV) ! HV* rsa_HV; PPCODE: { RSA* rsa; ! rsa = get_RSA_key(rsa_HV); XPUSHs(bn2sv(rsa->n)); XPUSHs(bn2sv(rsa->e)); --- 394,403 ---- void ! _get_key_parameters(p_rsa) ! SV* p_rsa; PPCODE: { RSA* rsa; ! rsa = get_RSA_key(p_rsa); XPUSHs(bn2sv(rsa->n)); XPUSHs(bn2sv(rsa->e)); *************** *** 427,432 **** SV* ! encrypt(rsa_HV, plaintext_SV, ...) ! HV* rsa_HV; SV* plaintext_SV; PREINIT: --- 413,418 ---- SV* ! encrypt(p_rsa, plaintext_SV, ...) ! SV* p_rsa; SV* plaintext_SV; PREINIT: *************** *** 440,444 **** plaintext = SvPV(plaintext_SV, plaintext_length); ! rsa = get_RSA_key(rsa_HV); size = RSA_size(rsa); --- 426,430 ---- plaintext = SvPV(plaintext_SV, plaintext_length); ! rsa = get_RSA_key(p_rsa); size = RSA_size(rsa); *************** *** 450,454 **** ciphertext_length = RSA_public_encrypt( ! plaintext_length, plaintext, ciphertext, rsa, get_padding(rsa_HV)); if (ciphertext_length < 0) --- 436,440 ---- ciphertext_length = RSA_public_encrypt( ! plaintext_length, plaintext, ciphertext, rsa, get_padding(p_rsa)); if (ciphertext_length < 0) *************** *** 465,470 **** # Decrypt cipher text into plain text. Returns the plain text SV* ! decrypt(rsa_HV, ciphertext_SV) ! HV* rsa_HV; SV* ciphertext_SV; PREINIT: --- 451,456 ---- # Decrypt cipher text into plain text. Returns the plain text SV* ! decrypt(p_rsa, ciphertext_SV) ! SV* p_rsa; SV* ciphertext_SV; PREINIT: *************** *** 477,481 **** CODE: { ! if (! is_private(rsa_HV)) { croak("Public keys cannot decrypt messages."); --- 463,467 ---- CODE: { ! if (! is_private(p_rsa)) { croak("Public keys cannot decrypt messages."); *************** *** 484,488 **** ciphertext = SvPV(ciphertext_SV, ciphertext_length); ! rsa = get_RSA_key(rsa_HV); size = RSA_size(rsa); if (New(0, plaintext, size, char) == NULL) --- 470,474 ---- ciphertext = SvPV(ciphertext_SV, ciphertext_length); ! rsa = get_RSA_key(p_rsa); size = RSA_size(rsa); if (New(0, plaintext, size, char) == NULL) *************** *** 493,497 **** plaintext_length = RSA_private_decrypt( ! size, ciphertext, plaintext, rsa, get_padding(rsa_HV)); if (plaintext_length < 0) --- 479,483 ---- plaintext_length = RSA_private_decrypt( ! size, ciphertext, plaintext, rsa, get_padding(p_rsa)); if (plaintext_length < 0) *************** *** 508,523 **** int ! size(rsa_HV) ! HV* rsa_HV; CODE: ! RETVAL = RSA_size(get_RSA_key(rsa_HV)); OUTPUT: RETVAL int ! check_key(rsa_HV) ! HV* rsa_HV; CODE: ! RETVAL = RSA_check_key(get_RSA_key(rsa_HV)); OUTPUT: RETVAL --- 494,509 ---- int ! size(p_rsa) ! SV* p_rsa; CODE: ! RETVAL = RSA_size(get_RSA_key(p_rsa)); OUTPUT: RETVAL int ! check_key(p_rsa) ! SV* p_rsa; CODE: ! RETVAL = RSA_check_key(get_RSA_key(p_rsa)); OUTPUT: RETVAL *************** *** 551,598 **** void ! use_md5_hash(rsa_HV) ! HV* rsa_HV; CODE: ! set_hash(rsa_HV, NID_md5); void ! use_sha1_hash(rsa_HV) ! HV* rsa_HV; CODE: ! set_hash(rsa_HV, NID_sha1); void ! use_ripemd160_hash(rsa_HV) ! HV* rsa_HV; CODE: ! set_hash(rsa_HV, NID_ripemd160); void ! use_no_padding(rsa_HV) ! HV* rsa_HV; CODE: ! set_padding(rsa_HV, RSA_NO_PADDING); void ! use_pkcs1_padding(rsa_HV) ! HV* rsa_HV; CODE: ! set_padding(rsa_HV, RSA_PKCS1_PADDING); void ! use_pkcs1_oaep_padding(rsa_HV) ! HV* rsa_HV; CODE: ! set_padding(rsa_HV, RSA_PKCS1_OAEP_PADDING); void ! use_sslv23_padding(rsa_HV) ! HV* rsa_HV; CODE: ! set_padding(rsa_HV, RSA_SSLV23_PADDING); SV* ! sign(rsa_HV, text_SV, ...) ! HV* rsa_HV; SV* text_SV; PREINIT: --- 537,584 ---- void ! use_md5_hash(p_rsa) ! SV* p_rsa; CODE: ! set_hash(p_rsa, NID_md5); void ! use_sha1_hash(p_rsa) ! SV* p_rsa; CODE: ! set_hash(p_rsa, NID_sha1); void ! use_ripemd160_hash(p_rsa) ! SV* p_rsa; CODE: ! set_hash(p_rsa, NID_ripemd160); void ! use_no_padding(p_rsa) ! SV* p_rsa; CODE: ! set_padding(p_rsa, RSA_NO_PADDING); void ! use_pkcs1_padding(p_rsa) ! SV* p_rsa; CODE: ! set_padding(p_rsa, RSA_PKCS1_PADDING); void ! use_pkcs1_oaep_padding(p_rsa) ! SV* p_rsa; CODE: ! set_padding(p_rsa, RSA_PKCS1_OAEP_PADDING); void ! use_sslv23_padding(p_rsa) ! SV* p_rsa; CODE: ! set_padding(p_rsa, RSA_SSLV23_PADDING); SV* ! sign(p_rsa, text_SV, ...) ! SV* p_rsa; SV* text_SV; PREINIT: *************** *** 603,612 **** RSA* rsa; CODE: ! if (! is_private(rsa_HV)) { croak("Public keys cannot sign messages."); } ! rsa = get_RSA_key(rsa_HV); if (New(0, signature, RSA_size(rsa), char) == NULL) --- 589,598 ---- RSA* rsa; CODE: ! if (! is_private(p_rsa)) { croak("Public keys cannot sign messages."); } ! rsa = get_RSA_key(p_rsa); if (New(0, signature, RSA_size(rsa), char) == NULL) *************** *** 616,620 **** } ! hash = get_hash(rsa_HV); digest = get_message_digest(text_SV, hash); if (! RSA_sign(hash, --- 602,606 ---- } ! hash = get_hash(p_rsa); digest = get_message_digest(text_SV, hash); if (! RSA_sign(hash, *************** *** 636,641 **** void ! verify(rsa_HV, text_SV, sig_SV, ...) ! HV* rsa_HV; SV* text_SV; SV* sig_SV; --- 622,627 ---- void ! verify(p_rsa, text_SV, sig_SV, ...) ! SV* p_rsa; SV* text_SV; SV* sig_SV; *************** *** 649,653 **** int result; ! if (is_private(rsa_HV)) { croak("Secret keys should not check signatures."); --- 635,639 ---- int result; ! if (is_private(p_rsa)) { croak("Secret keys should not check signatures."); *************** *** 655,659 **** sig = SvPV(sig_SV, sig_length); ! rsa = get_RSA_key(rsa_HV); if (RSA_size(rsa) < sig_length) { --- 641,645 ---- sig = SvPV(sig_SV, sig_length); ! rsa = get_RSA_key(p_rsa); if (RSA_size(rsa) < sig_length) { *************** *** 661,665 **** } ! hash = get_hash(rsa_HV); digest = get_message_digest(text_SV, hash); result = RSA_verify( --- 647,651 ---- } ! hash = get_hash(p_rsa); digest = get_message_digest(text_SV, hash); result = RSA_verify( |