--- OpenSSL/OpenSSL.xs 2001/10/28 03:29:11 1.17 +++ OpenSSL/OpenSSL.xs 2001/10/29 05:38:03 1.18 @@ -42,6 +42,7 @@ typedef RSA *OpenSSL__RSA; typedef EVP_MD_CTX *OpenSSL__Digest; typedef EVP_CIPHER_CTX *OpenSSL__Cipher; +typedef BIGNUM *OpenSSL__BN; static inline SV* output_ASN1_INTEGER(ASN1_INTEGER *ai, SV *sv) { @@ -500,7 +501,7 @@ XSRETURN_NO; -BIGNUM * +OpenSSL::BN n(key) OpenSSL::RSA key; ALIAS: @@ -511,26 +512,24 @@ dmp1 = 5 dmq1 = 6 iqmp = 7 - PREINIT: - BIGNUM *bn = 0; CODE: + RETVAL = 0; if(!key) croak("invalid key"); switch(ix) { - case 0: bn = key->n; break; - case 1: bn = key->e; break; - case 2: bn = key->d; break; - case 3: bn = key->p; break; - case 4: bn = key->q; break; - case 5: bn = key->dmp1; break; - case 6: bn = key->dmq1; break; - case 7: bn = key->iqmp; break; + case 0: RETVAL = key->n; break; + case 1: RETVAL = key->e; break; + case 2: RETVAL = key->d; break; + case 3: RETVAL = key->p; break; + case 4: RETVAL = key->q; break; + case 5: RETVAL = key->dmp1; break; + case 6: RETVAL = key->dmq1; break; + case 7: RETVAL = key->iqmp; break; default: croak("huch"); } - if(!bn) + if(!RETVAL) croak("bignum not defined (maybe pubkey ?)"); - RETVAL = bn; OUTPUT: RETVAL @@ -1647,3 +1646,195 @@ OUTPUT: RETVAL +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include + + +MODULE = OpenSSL PACKAGE = OpenSSL::BN + +OpenSSL::BN +new(class,...) + SV *class + CODE: + unsigned char *p; + RETVAL = BN_new(); + BN_init(RETVAL); + if(items == 2) { + p = SvPV(ST(1), PL_na); + BN_dec2bn(&RETVAL, p); + } else { + BN_zero(RETVAL); + } + OUTPUT: + RETVAL + +OpenSSL::BN +clone(bn) + OpenSSL::BN bn + CODE: + RETVAL = BN_dup(bn); + OUTPUT: + RETVAL + +OpenSSL::BN +add(bn1,bn2) + OpenSSL::BN bn1 + OpenSSL::BN bn2 + ALIAS: + sub = 1 + CODE: + RETVAL = BN_new(); + BN_init(RETVAL); + switch(ix) { + case 0: + BN_add(RETVAL, bn1, bn2); + break; + case 1: + BN_sub(RETVAL, bn1, bn2); + break; + } + OUTPUT: + RETVAL + +OpenSSL::BN +mul(bn1,bn2) + OpenSSL::BN bn1 + OpenSSL::BN bn2 + ALIAS: + div = 1 + mod = 2 + exp = 3 + CODE: + BN_CTX *ctx; + ctx = BN_CTX_new(); + BN_CTX_init(ctx); + RETVAL = BN_new(); + BN_init(RETVAL); + switch(ix) { + case 0: + BN_mul(RETVAL, bn1, bn2, ctx); + break; + case 1: + { + BIGNUM *tmp = BN_new(); + BN_init(tmp); + if(BN_is_zero(bn2)) { + BN_clear_free(tmp); + croak("Illegal division by zero"); + } + BN_div(RETVAL, tmp, bn1, bn2, ctx); + BN_clear_free(tmp); + } + break; + case 2: + { + BIGNUM *tmp = BN_new(); + BN_init(tmp); + if(BN_is_zero(bn2)) { + BN_clear_free(tmp); + croak("Illegal modulus zero"); + } + BN_div(tmp, RETVAL, bn1, bn2, ctx); + BN_clear_free(tmp); + } + break; + case 3: + { + BN_exp(RETVAL, bn1, bn2, ctx); + } + break; + } + BN_CTX_free(ctx); + OUTPUT: + RETVAL + +IV +icmp(bn1,bn2) + OpenSSL::BN bn1 + OpenSSL::BN bn2 + CODE: + RETVAL = BN_cmp(bn1,bn2); + OUTPUT: + RETVAL + +void +inc(bn) + OpenSSL::BN bn + ALIAS: + dec = 1 + CODE: + ((ix) ? BN_sub_word : BN_add_word)(bn, 1); + + +SV * +stringify(bn) + OpenSSL::BN bn + CODE: + char *p; + p = BN_bn2dec(bn); + RETVAL = newSVpv(p,0); + free(p); + OUTPUT: + RETVAL + +OpenSSL::BN +lshift(bn,cnt) + OpenSSL::BN bn + IV cnt + ALIAS: + rshift = 1 + CODE: + RETVAL = BN_new(); + BN_init(RETVAL); + if(ix) + BN_rshift(RETVAL,bn,cnt); + else + BN_lshift(RETVAL, bn, cnt); + OUTPUT: + RETVAL + +OpenSSL::BN +sqr(bn) + OpenSSL::BN bn + CODE: + BN_CTX *ctx; + ctx = BN_CTX_new(); + BN_CTX_init(ctx); + RETVAL = BN_new(); + BN_init(RETVAL); + BN_sqr(RETVAL, bn, ctx); + BN_CTX_free(ctx); + OUTPUT: + RETVAL + +bool +bnbool(bn) + OpenSSL::BN bn + CODE: + RETVAL = !BN_is_zero(bn); + OUTPUT: + RETVAL + +bool +isprime(bn) + OpenSSL::BN bn + CODE: + BN_CTX *ctx; + ctx = BN_CTX_new(); + BN_CTX_init(ctx); + RETVAL = BN_is_prime(bn, 30, 0, ctx, 0); + OUTPUT: + RETVAL + + +void +DESTROY(bn) + OpenSSL::BN bn + CODE: + BN_clear_free(bn); + + +