6 SSLeay_add_all_ciphers();
10 MODULE = OpenSSL::Cipher PACKAGE = OpenSSL::Cipher PREFIX = p5_EVP_C_
21 if ((items == 1) && SvPOK(ST(0)))
23 else if ((items == 2) && SvPOK(ST(1)))
26 croak("Usage: OpenSSL::Cipher::new(type)");
27 PUSHs(sv_newmortal());
28 c=EVP_get_cipherbyname(name);
31 ctx=malloc(sizeof(EVP_CIPHER_CTX));
32 EVP_EncryptInit(ctx,c,NULL,NULL);
33 sv_setref_pv(ST(0), "OpenSSL::Cipher", (void*)ctx);
40 RETVAL.dptr=OBJ_nid2ln(EVP_CIPHER_CTX_nid(ctx));
41 RETVAL.dsize=strlen(RETVAL.dptr);
46 p5_EVP_C_key_length(ctx)
49 RETVAL=EVP_CIPHER_CTX_key_length(ctx);
54 p5_EVP_C_iv_length(ctx)
57 RETVAL=EVP_CIPHER_CTX_iv_length(ctx);
62 p5_EVP_C_block_size(ctx)
65 RETVAL=EVP_CIPHER_CTX_block_size(ctx);
70 p5_EVP_C_init(ctx,key,iv,enc)
76 char loc_iv[EVP_MAX_IV_LENGTH];
77 char loc_key[EVP_MAX_KEY_LENGTH];
78 char *ip=loc_iv,*kp=loc_key;
80 memset(loc_iv,0,EVP_MAX_IV_LENGTH);
81 memset(loc_key,0,EVP_MAX_KEY_LENGTH);
84 if (key.dsize > EVP_CIPHER_CTX_key_length(ctx))
85 i=EVP_CIPHER_CTX_key_length(ctx);
88 memset(kp,0,EVP_MAX_KEY_LENGTH);
89 memcpy(kp,key.dptr,i);
94 if (iv.dsize > EVP_CIPHER_CTX_iv_length(ctx))
95 i=EVP_CIPHER_CTX_iv_length(ctx);
99 memset(ip,0,EVP_MAX_IV_LENGTH);
103 EVP_CipherInit(ctx,EVP_CIPHER_CTX_cipher(ctx),kp,ip,enc);
104 memset(loc_key,0,sizeof(loc_key));
105 memset(loc_iv,0,sizeof(loc_iv));
108 p5_EVP_C_cipher(ctx,in)
112 RETVAL=newSVpv("",0);
113 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
114 EVP_Cipher(ctx,SvPV(RETVAL,na),in.dptr,in.dsize);
115 SvCUR_set(RETVAL,in.dsize);
120 p5_EVP_C_update(ctx, in)
126 RETVAL=newSVpv("",0);
127 SvGROW(RETVAL,in.dsize+EVP_CIPHER_CTX_block_size(ctx)+1);
128 EVP_CipherUpdate(ctx,SvPV(RETVAL,na),&i,in.dptr,in.dsize);
139 RETVAL=newSVpv("",0);
140 SvGROW(RETVAL,EVP_CIPHER_CTX_block_size(ctx)+1);
141 if (!EVP_CipherFinal(ctx,SvPV(RETVAL,na),&i))
142 sv_setpv(RETVAL,"BAD DECODE");
149 p5_EVP_C_DESTROY(ctx)