6 SSLeay_add_all_ciphers();
10 MODULE = OpenSSL::Cipher PACKAGE = OpenSSL::Cipher PREFIX = p5_EVP_C_
22 if ((items == 1) && SvPOK(ST(0)))
23 name=SvPV_nolen(ST(0));
24 else if ((items == 2) && SvPOK(ST(1)))
25 name=SvPV_nolen(ST(1));
27 croak("Usage: OpenSSL::Cipher::new(type)");
28 PUSHs(sv_newmortal());
29 c=EVP_get_cipherbyname(name);
32 ctx=malloc(sizeof(EVP_CIPHER_CTX));
33 EVP_EncryptInit(ctx,c,NULL,NULL);
34 sv_setref_pv(ST(0), "OpenSSL::Cipher", (void*)ctx);
41 RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx));
42 RETVAL.dsize=strlen(RETVAL.dptr);
47 p5_EVP_C_key_length(ctx)
50 RETVAL=EVP_CIPHER_CTX_key_length(ctx);
55 p5_EVP_C_iv_length(ctx)
58 RETVAL=EVP_CIPHER_CTX_iv_length(ctx);
63 p5_EVP_C_block_size(ctx)
66 RETVAL=EVP_CIPHER_CTX_block_size(ctx);
71 p5_EVP_C_init(ctx,key,iv,enc)
77 char loc_iv[EVP_MAX_IV_LENGTH];
78 char loc_key[EVP_MAX_KEY_LENGTH];
79 char *ip=loc_iv,*kp=loc_key;
81 memset(loc_iv,0,EVP_MAX_IV_LENGTH);
82 memset(loc_key,0,EVP_MAX_KEY_LENGTH);
85 if (key.dsize > EVP_CIPHER_CTX_key_length(ctx))
86 i=EVP_CIPHER_CTX_key_length(ctx);
89 memset(kp,0,EVP_MAX_KEY_LENGTH);
90 memcpy(kp,key.dptr,i);
95 if (iv.dsize > EVP_CIPHER_CTX_iv_length(ctx))
96 i=EVP_CIPHER_CTX_iv_length(ctx);
100 memset(ip,0,EVP_MAX_IV_LENGTH);
104 EVP_CipherInit(ctx,EVP_CIPHER_CTX_cipher(ctx),kp,ip,enc);
105 memset(loc_key,0,sizeof(loc_key));
106 memset(loc_iv,0,sizeof(loc_iv));
109 p5_EVP_C_cipher(ctx,in)
113 RETVAL=newSVpv("",0);
114 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
115 EVP_Cipher(ctx,SvPV_nolen(RETVAL),in.dptr,in.dsize);
116 SvCUR_set(RETVAL,in.dsize);
121 p5_EVP_C_update(ctx, in)
127 RETVAL=newSVpv("",0);
128 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
129 EVP_CipherUpdate(ctx,SvPV_nolen(RETVAL),&i,in.dptr,in.dsize);
140 RETVAL=newSVpv("",0);
141 SvGROW(RETVAL,EVP_CIPHER_CTX_block_size(ctx)+1);
142 if (!EVP_CipherFinal(ctx,SvPV_nolen(RETVAL),&i))
143 sv_setpv(RETVAL,"BAD DECODE");
150 p5_EVP_C_DESTROY(ctx)