5 SSLeay_add_all_ciphers();
9 MODULE = SSLeay::Cipher PACKAGE = SSLeay::Cipher PREFIX = p5_EVP_C_
20 if ((items == 1) && SvPOK(ST(0)))
22 else if ((items == 2) && SvPOK(ST(1)))
25 croak("Usage: SSLeay::Cipher::new(type)");
26 PUSHs(sv_newmortal());
27 c=EVP_get_cipherbyname(name);
30 ctx=malloc(sizeof(EVP_CIPHER_CTX));
31 EVP_EncryptInit(ctx,c,NULL,NULL);
32 sv_setref_pv(ST(0), "SSLeay::Cipher", (void*)ctx);
39 RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx));
40 RETVAL.dsize=strlen(RETVAL.dptr);
45 p5_EVP_C_key_length(ctx)
48 RETVAL=EVP_CIPHER_CTX_key_length(ctx);
53 p5_EVP_C_iv_length(ctx)
56 RETVAL=EVP_CIPHER_CTX_iv_length(ctx);
61 p5_EVP_C_block_size(ctx)
64 RETVAL=EVP_CIPHER_CTX_block_size(ctx);
69 p5_EVP_C_init(ctx,key,iv,enc)
75 char loc_iv[EVP_MAX_IV_LENGTH];
76 char loc_key[EVP_MAX_KEY_LENGTH];
77 char *ip=loc_iv,*kp=loc_key;
79 memset(loc_iv,0,EVP_MAX_IV_LENGTH);
80 memset(loc_key,0,EVP_MAX_KEY_LENGTH);
83 if (key.dsize > EVP_CIPHER_CTX_key_length(ctx))
84 i=EVP_CIPHER_CTX_key_length(ctx);
87 memset(kp,0,EVP_MAX_KEY_LENGTH);
88 memcpy(kp,key.dptr,i);
93 if (iv.dsize > EVP_CIPHER_CTX_iv_length(ctx))
94 i=EVP_CIPHER_CTX_iv_length(ctx);
98 memset(ip,0,EVP_MAX_IV_LENGTH);
102 EVP_CipherInit(ctx,EVP_CIPHER_CTX_cipher(ctx),kp,ip,enc);
103 memset(loc_key,0,sizeof(loc_key));
104 memset(loc_iv,0,sizeof(loc_iv));
107 p5_EVP_C_cipher(ctx,in)
111 RETVAL=newSVpv("",0);
112 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
113 EVP_Cipher(ctx,SvPV(RETVAL,na),in.dptr,in.dsize);
114 SvCUR_set(RETVAL,in.dsize);
119 p5_EVP_C_update(ctx, in)
125 RETVAL=newSVpv("",0);
126 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
127 EVP_CipherUpdate(ctx,SvPV(RETVAL,na),&i,in.dptr,in.dsize);
138 RETVAL=newSVpv("",0);
139 SvGROW(RETVAL,EVP_CIPHER_CTX_block_size(ctx)+1);
140 if (!EVP_CipherFinal(ctx,SvPV(RETVAL,na),&i))
141 sv_setpv(RETVAL,"BAD DECODE");
148 p5_EVP_C_DESTROY(ctx)