| |
| #include "openssl.h" |
| |
| int boot_cipher() |
| { |
| SSLeay_add_all_ciphers(); |
| return(1); |
| } |
| |
| MODULE = OpenSSL::Cipher PACKAGE = OpenSSL::Cipher PREFIX = p5_EVP_C_ |
| |
| VERSIONCHECK: DISABLE |
| |
| void |
| p5_EVP_C_new(...) |
| PREINIT: |
| EVP_CIPHER_CTX *ctx; |
| EVP_CIPHER *c; |
| char *name; |
| PPCODE: |
| if ((items == 1) && SvPOK(ST(0))) |
| name=SvPV(ST(0),na); |
| else if ((items == 2) && SvPOK(ST(1))) |
| name=SvPV(ST(1),na); |
| else |
| croak("Usage: OpenSSL::Cipher::new(type)"); |
| PUSHs(sv_newmortal()); |
| c=EVP_get_cipherbyname(name); |
| if (c != NULL) |
| { |
| ctx=malloc(sizeof(EVP_CIPHER_CTX)); |
| EVP_EncryptInit(ctx,c,NULL,NULL); |
| sv_setref_pv(ST(0), "OpenSSL::Cipher", (void*)ctx); |
| } |
| |
| datum |
| p5_EVP_C_name(ctx) |
| EVP_CIPHER_CTX *ctx |
| CODE: |
| RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx)); |
| RETVAL.dsize=strlen(RETVAL.dptr); |
| OUTPUT: |
| RETVAL |
| |
| int |
| p5_EVP_C_key_length(ctx) |
| EVP_CIPHER_CTX *ctx |
| CODE: |
| RETVAL=EVP_CIPHER_CTX_key_length(ctx); |
| OUTPUT: |
| RETVAL |
| |
| int |
| p5_EVP_C_iv_length(ctx) |
| EVP_CIPHER_CTX *ctx |
| CODE: |
| RETVAL=EVP_CIPHER_CTX_iv_length(ctx); |
| OUTPUT: |
| RETVAL |
| |
| int |
| p5_EVP_C_block_size(ctx) |
| EVP_CIPHER_CTX *ctx |
| CODE: |
| RETVAL=EVP_CIPHER_CTX_block_size(ctx); |
| OUTPUT: |
| RETVAL |
| |
| void |
| p5_EVP_C_init(ctx,key,iv,enc) |
| EVP_CIPHER_CTX *ctx |
| datum key |
| datum iv |
| int enc |
| PREINIT: |
| char loc_iv[EVP_MAX_IV_LENGTH]; |
| char loc_key[EVP_MAX_KEY_LENGTH]; |
| char *ip=loc_iv,*kp=loc_key; |
| int i; |
| memset(loc_iv,0,EVP_MAX_IV_LENGTH); |
| memset(loc_key,0,EVP_MAX_KEY_LENGTH); |
| CODE: |
| i=key.dsize; |
| if (key.dsize > EVP_CIPHER_CTX_key_length(ctx)) |
| i=EVP_CIPHER_CTX_key_length(ctx); |
| if (i > 0) |
| { |
| memset(kp,0,EVP_MAX_KEY_LENGTH); |
| memcpy(kp,key.dptr,i); |
| } |
| else |
| kp=NULL; |
| i=iv.dsize; |
| if (iv.dsize > EVP_CIPHER_CTX_iv_length(ctx)) |
| i=EVP_CIPHER_CTX_iv_length(ctx); |
| if (i > 0) |
| { |
| memcpy(ip,iv.dptr,i); |
| memset(ip,0,EVP_MAX_IV_LENGTH); |
| } |
| else |
| ip=NULL; |
| EVP_CipherInit(ctx,EVP_CIPHER_CTX_cipher(ctx),kp,ip,enc); |
| memset(loc_key,0,sizeof(loc_key)); |
| memset(loc_iv,0,sizeof(loc_iv)); |
| |
| SV * |
| p5_EVP_C_cipher(ctx,in) |
| EVP_CIPHER_CTX *ctx; |
| datum in; |
| CODE: |
| RETVAL=newSVpv("",0); |
| SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1); |
| EVP_Cipher(ctx,SvPV(RETVAL,na),in.dptr,in.dsize); |
| SvCUR_set(RETVAL,in.dsize); |
| OUTPUT: |
| RETVAL |
| |
| SV * |
| p5_EVP_C_update(ctx, in) |
| EVP_CIPHER_CTX *ctx |
| datum in |
| PREINIT: |
| int i; |
| CODE: |
| RETVAL=newSVpv("",0); |
| SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1); |
| EVP_CipherUpdate(ctx,SvPV(RETVAL,na),&i,in.dptr,in.dsize); |
| SvCUR_set(RETVAL,i); |
| OUTPUT: |
| RETVAL |
| |
| SV * |
| p5_EVP_C_final(ctx) |
| EVP_CIPHER_CTX *ctx |
| PREINIT: |
| int i; |
| CODE: |
| RETVAL=newSVpv("",0); |
| SvGROW(RETVAL,EVP_CIPHER_CTX_block_size(ctx)+1); |
| if (!EVP_CipherFinal(ctx,SvPV(RETVAL,na),&i)) |
| sv_setpv(RETVAL,"BAD DECODE"); |
| else |
| SvCUR_set(RETVAL,i); |
| OUTPUT: |
| RETVAL |
| |
| void |
| p5_EVP_C_DESTROY(ctx) |
| EVP_CIPHER_CTX *ctx |
| CODE: |
| free((char *)ctx); |
| |