1 #include "EXTERN.h"
\r#include "perl.h"
\r#include "XSUB.h"
\r#include "des.h"
\r\r#define deschar char
\rstatic STRLEN len;
\r\rstatic int
\rnot_here(s)
\rchar *s;
\r{
\r croak("%s not implemented on this architecture", s);
\r return -1;
\r}
\r\rMODULE = DES PACKAGE = DES PREFIX = des_
\r\rchar *
\rdes_crypt(buf,salt)
\r char * buf
\r char * salt
\r\rvoid
\rdes_set_odd_parity(key)
\r des_cblock * key
\rPPCODE:
\r {
\r SV *s;
\r\r s=sv_newmortal();
\r sv_setpvn(s,(char *)key,8);
\r des_set_odd_parity((des_cblock *)SvPV(s,na));
\r PUSHs(s);
\r }
\r\rint
\rdes_is_weak_key(key)
\r des_cblock * key
\r\rdes_key_schedule
\rdes_set_key(key)
\r des_cblock * key
\rCODE:
\r des_set_key(key,RETVAL);
\rOUTPUT:
\rRETVAL
\r\rdes_cblock
\rdes_ecb_encrypt(input,ks,encrypt)
\r des_cblock * input
\r des_key_schedule * ks
\r int encrypt
\rCODE:
\r des_ecb_encrypt(input,&RETVAL,*ks,encrypt);
\rOUTPUT:
\rRETVAL
\r\rvoid
\rdes_cbc_encrypt(input,ks,ivec,encrypt)
\r char * input
\r des_key_schedule * ks
\r des_cblock * ivec
\r int encrypt
\rPPCODE:
\r {
\r SV *s;
\r STRLEN len,l;
\r char *c;
\r\r l=SvCUR(ST(0));
\r len=((((unsigned long)l)+7)/8)*8;
\r s=sv_newmortal();
\r sv_setpvn(s,"",0);
\r SvGROW(s,len);
\r SvCUR_set(s,len);
\r c=(char *)SvPV(s,na);
\r des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,
\r l,*ks,ivec,encrypt);
\r sv_setpvn(ST(2),(char *)c[len-8],8);
\r PUSHs(s);
\r }
\r\rvoid
\rdes_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)
\r char * input
\r des_key_schedule * ks1
\r des_key_schedule * ks2
\r des_cblock * ivec1
\r des_cblock * ivec2
\r int encrypt
\rPPCODE:
\r {
\r SV *s;
\r STRLEN len,l;
\r\r l=SvCUR(ST(0));
\r len=((((unsigned long)l)+7)/8)*8;
\r s=sv_newmortal();
\r sv_setpvn(s,"",0);
\r SvGROW(s,len);
\r SvCUR_set(s,len);
\r des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),
\r l,*ks1,*ks2,ivec1,ivec2,encrypt);
\r sv_setpvn(ST(3),(char *)ivec1,8);
\r sv_setpvn(ST(4),(char *)ivec2,8);
\r PUSHs(s);
\r }
\r\rvoid
\rdes_cbc_cksum(input,ks,ivec)
\r char * input
\r des_key_schedule * ks
\r des_cblock * ivec
\rPPCODE:
\r {
\r SV *s1,*s2;
\r STRLEN len,l;
\r des_cblock c;
\r unsigned long i1,i2;
\r\r s1=sv_newmortal();
\r s2=sv_newmortal();
\r l=SvCUR(ST(0));
\r des_cbc_cksum((des_cblock *)input,(des_cblock *)c,
\r l,*ks,ivec);
\r i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);
\r i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);
\r sv_setiv(s1,i1);
\r sv_setiv(s2,i2);
\r sv_setpvn(ST(2),(char *)c,8);
\r PUSHs(s1);
\r PUSHs(s2);
\r }
\r\rvoid
\rdes_cfb_encrypt(input,numbits,ks,ivec,encrypt)
\r char * input
\r int numbits
\r des_key_schedule * ks
\r des_cblock * ivec
\r int encrypt
\rPPCODE:
\r {
\r SV *s;
\r STRLEN len;
\r char *c;
\r\r len=SvCUR(ST(0));
\r s=sv_newmortal();
\r sv_setpvn(s,"",0);
\r SvGROW(s,len);
\r SvCUR_set(s,len);
\r c=(char *)SvPV(s,na);
\r des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,
\r (int)numbits,(long)len,*ks,ivec,encrypt);
\r sv_setpvn(ST(3),(char *)ivec,8);
\r PUSHs(s);
\r }
\r\rdes_cblock *
\rdes_ecb3_encrypt(input,ks1,ks2,encrypt)
\r des_cblock * input
\r des_key_schedule * ks1
\r des_key_schedule * ks2
\r int encrypt
\rCODE:
\r {
\r des_cblock c;
\r\r des_3ecb_encrypt((des_cblock *)input,(des_cblock *)&c,
\r *ks1,*ks2,encrypt);
\r RETVAL= &c;
\r }
\rOUTPUT:
\rRETVAL
\r\rvoid
\rdes_ofb_encrypt(input,numbits,ks,ivec)
\r unsigned char * input
\r int numbits
\r des_key_schedule * ks
\r des_cblock * ivec
\rPPCODE:
\r {
\r SV *s;
\r STRLEN len,l;
\r unsigned char *c;
\r\r len=SvCUR(ST(0));
\r s=sv_newmortal();
\r sv_setpvn(s,"",0);
\r SvGROW(s,len);
\r SvCUR_set(s,len);
\r c=(unsigned char *)SvPV(s,na);
\r des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,
\r numbits,len,*ks,ivec);
\r sv_setpvn(ST(3),(char *)ivec,8);
\r PUSHs(s);
\r }
\r\rvoid
\rdes_pcbc_encrypt(input,ks,ivec,encrypt)
\r char * input
\r des_key_schedule * ks
\r des_cblock * ivec
\r int encrypt
\rPPCODE:
\r {
\r SV *s;
\r STRLEN len,l;
\r char *c;
\r\r l=SvCUR(ST(0));
\r len=((((unsigned long)l)+7)/8)*8;
\r s=sv_newmortal();
\r sv_setpvn(s,"",0);
\r SvGROW(s,len);
\r SvCUR_set(s,len);
\r c=(char *)SvPV(s,na);
\r des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,
\r l,*ks,ivec,encrypt);
\r sv_setpvn(ST(2),(char *)c[len-8],8);
\r PUSHs(s);
\r }
\r\rdes_cblock *
\rdes_random_key()
\rCODE:
\r {
\r des_cblock c;
\r\r des_random_key(c);
\r RETVAL=&c;
\r }
\rOUTPUT:
\rRETVAL
\r\rdes_cblock *
\rdes_string_to_key(str)
\rchar * str
\rCODE:
\r {
\r des_cblock c;
\r\r des_string_to_key(str,&c);
\r RETVAL=&c;
\r }
\rOUTPUT:
\rRETVAL
\r\rvoid
\rdes_string_to_2keys(str)
\rchar * str
\rPPCODE:
\r {
\r des_cblock c1,c2;
\r SV *s1,*s2;
\r\r des_string_to_2keys(str,&c1,&c2);
\r EXTEND(sp,2);
\r s1=sv_newmortal();
\r sv_setpvn(s1,(char *)c1,8);
\r s2=sv_newmortal();
\r sv_setpvn(s2,(char *)c2,8);
\r PUSHs(s1);
\r PUSHs(s2);
\r }
\r