155714Skris#include "EXTERN.h" 255714Skris#include "perl.h" 355714Skris#include "XSUB.h" 455714Skris#include "des.h" 555714Skris 655714Skris#define deschar char 755714Skrisstatic STRLEN len; 855714Skris 955714Skrisstatic int 1055714Skrisnot_here(s) 1155714Skrischar *s; 1255714Skris{ 1355714Skris croak("%s not implemented on this architecture", s); 1455714Skris return -1; 1555714Skris} 1655714Skris 1755714SkrisMODULE = DES PACKAGE = DES PREFIX = des_ 1855714Skris 1955714Skrischar * 2055714Skrisdes_crypt(buf,salt) 2155714Skris char * buf 2255714Skris char * salt 2355714Skris 2455714Skrisvoid 2555714Skrisdes_set_odd_parity(key) 2655714Skris des_cblock * key 2755714SkrisPPCODE: 2855714Skris { 2955714Skris SV *s; 3055714Skris 3155714Skris s=sv_newmortal(); 3255714Skris sv_setpvn(s,(char *)key,8); 3355714Skris des_set_odd_parity((des_cblock *)SvPV(s,na)); 3455714Skris PUSHs(s); 3555714Skris } 3655714Skris 3755714Skrisint 3855714Skrisdes_is_weak_key(key) 3955714Skris des_cblock * key 4055714Skris 4155714Skrisdes_key_schedule 4255714Skrisdes_set_key(key) 4355714Skris des_cblock * key 4455714SkrisCODE: 4555714Skris des_set_key(key,RETVAL); 4655714SkrisOUTPUT: 4755714SkrisRETVAL 4855714Skris 4955714Skrisdes_cblock 5055714Skrisdes_ecb_encrypt(input,ks,encrypt) 5155714Skris des_cblock * input 5255714Skris des_key_schedule * ks 5355714Skris int encrypt 5455714SkrisCODE: 5555714Skris des_ecb_encrypt(input,&RETVAL,*ks,encrypt); 5655714SkrisOUTPUT: 5755714SkrisRETVAL 5855714Skris 5955714Skrisvoid 6055714Skrisdes_cbc_encrypt(input,ks,ivec,encrypt) 6155714Skris char * input 6255714Skris des_key_schedule * ks 6355714Skris des_cblock * ivec 6455714Skris int encrypt 6555714SkrisPPCODE: 6655714Skris { 6755714Skris SV *s; 6855714Skris STRLEN len,l; 6955714Skris char *c; 7055714Skris 7155714Skris l=SvCUR(ST(0)); 7255714Skris len=((((unsigned long)l)+7)/8)*8; 7355714Skris s=sv_newmortal(); 7455714Skris sv_setpvn(s,"",0); 7555714Skris SvGROW(s,len); 7655714Skris SvCUR_set(s,len); 7755714Skris c=(char *)SvPV(s,na); 7855714Skris des_cbc_encrypt((des_cblock *)input,(des_cblock *)c, 7955714Skris l,*ks,ivec,encrypt); 8055714Skris sv_setpvn(ST(2),(char *)c[len-8],8); 8155714Skris PUSHs(s); 8255714Skris } 8355714Skris 8455714Skrisvoid 8555714Skrisdes_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt) 8655714Skris char * input 8755714Skris des_key_schedule * ks1 8855714Skris des_key_schedule * ks2 8955714Skris des_cblock * ivec1 9055714Skris des_cblock * ivec2 9155714Skris int encrypt 9255714SkrisPPCODE: 9355714Skris { 9455714Skris SV *s; 9555714Skris STRLEN len,l; 9655714Skris 9755714Skris l=SvCUR(ST(0)); 9855714Skris len=((((unsigned long)l)+7)/8)*8; 9955714Skris s=sv_newmortal(); 10055714Skris sv_setpvn(s,"",0); 10155714Skris SvGROW(s,len); 10255714Skris SvCUR_set(s,len); 10355714Skris des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na), 10455714Skris l,*ks1,*ks2,ivec1,ivec2,encrypt); 10555714Skris sv_setpvn(ST(3),(char *)ivec1,8); 10655714Skris sv_setpvn(ST(4),(char *)ivec2,8); 10755714Skris PUSHs(s); 10855714Skris } 10955714Skris 11055714Skrisvoid 11155714Skrisdes_cbc_cksum(input,ks,ivec) 11255714Skris char * input 11355714Skris des_key_schedule * ks 11455714Skris des_cblock * ivec 11555714SkrisPPCODE: 11655714Skris { 11755714Skris SV *s1,*s2; 11855714Skris STRLEN len,l; 11955714Skris des_cblock c; 12055714Skris unsigned long i1,i2; 12155714Skris 12255714Skris s1=sv_newmortal(); 12355714Skris s2=sv_newmortal(); 12455714Skris l=SvCUR(ST(0)); 12555714Skris des_cbc_cksum((des_cblock *)input,(des_cblock *)c, 12655714Skris l,*ks,ivec); 12755714Skris i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24); 12855714Skris i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24); 12955714Skris sv_setiv(s1,i1); 13055714Skris sv_setiv(s2,i2); 13155714Skris sv_setpvn(ST(2),(char *)c,8); 13255714Skris PUSHs(s1); 13355714Skris PUSHs(s2); 13455714Skris } 13555714Skris 13655714Skrisvoid 13755714Skrisdes_cfb_encrypt(input,numbits,ks,ivec,encrypt) 13855714Skris char * input 13955714Skris int numbits 14055714Skris des_key_schedule * ks 14155714Skris des_cblock * ivec 14255714Skris int encrypt 14355714SkrisPPCODE: 14455714Skris { 14555714Skris SV *s; 14655714Skris STRLEN len; 14755714Skris char *c; 14855714Skris 14955714Skris len=SvCUR(ST(0)); 15055714Skris s=sv_newmortal(); 15155714Skris sv_setpvn(s,"",0); 15255714Skris SvGROW(s,len); 15355714Skris SvCUR_set(s,len); 15455714Skris c=(char *)SvPV(s,na); 15555714Skris des_cfb_encrypt((unsigned char *)input,(unsigned char *)c, 15655714Skris (int)numbits,(long)len,*ks,ivec,encrypt); 15755714Skris sv_setpvn(ST(3),(char *)ivec,8); 15855714Skris PUSHs(s); 15955714Skris } 16055714Skris 16155714Skrisdes_cblock * 16255714Skrisdes_ecb3_encrypt(input,ks1,ks2,encrypt) 16355714Skris des_cblock * input 16455714Skris des_key_schedule * ks1 16555714Skris des_key_schedule * ks2 16655714Skris int encrypt 16755714SkrisCODE: 16855714Skris { 16955714Skris des_cblock c; 17055714Skris 17155714Skris des_ecb3_encrypt((des_cblock *)input,(des_cblock *)&c, 17255714Skris *ks1,*ks2,encrypt); 17355714Skris RETVAL= &c; 17455714Skris } 17555714SkrisOUTPUT: 17655714SkrisRETVAL 17755714Skris 17855714Skrisvoid 17955714Skrisdes_ofb_encrypt(input,numbits,ks,ivec) 18055714Skris unsigned char * input 18155714Skris int numbits 18255714Skris des_key_schedule * ks 18355714Skris des_cblock * ivec 18455714SkrisPPCODE: 18555714Skris { 18655714Skris SV *s; 18755714Skris STRLEN len,l; 18855714Skris unsigned char *c; 18955714Skris 19055714Skris len=SvCUR(ST(0)); 19155714Skris s=sv_newmortal(); 19255714Skris sv_setpvn(s,"",0); 19355714Skris SvGROW(s,len); 19455714Skris SvCUR_set(s,len); 19555714Skris c=(unsigned char *)SvPV(s,na); 19655714Skris des_ofb_encrypt((unsigned char *)input,(unsigned char *)c, 19755714Skris numbits,len,*ks,ivec); 19855714Skris sv_setpvn(ST(3),(char *)ivec,8); 19955714Skris PUSHs(s); 20055714Skris } 20155714Skris 20255714Skrisvoid 20355714Skrisdes_pcbc_encrypt(input,ks,ivec,encrypt) 20455714Skris char * input 20555714Skris des_key_schedule * ks 20655714Skris des_cblock * ivec 20755714Skris int encrypt 20855714SkrisPPCODE: 20955714Skris { 21055714Skris SV *s; 21155714Skris STRLEN len,l; 21255714Skris char *c; 21355714Skris 21455714Skris l=SvCUR(ST(0)); 21555714Skris len=((((unsigned long)l)+7)/8)*8; 21655714Skris s=sv_newmortal(); 21755714Skris sv_setpvn(s,"",0); 21855714Skris SvGROW(s,len); 21955714Skris SvCUR_set(s,len); 22055714Skris c=(char *)SvPV(s,na); 22155714Skris des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c, 22255714Skris l,*ks,ivec,encrypt); 22355714Skris sv_setpvn(ST(2),(char *)c[len-8],8); 22455714Skris PUSHs(s); 22555714Skris } 22655714Skris 22755714Skrisdes_cblock * 22855714Skrisdes_random_key() 22955714SkrisCODE: 23055714Skris { 23155714Skris des_cblock c; 23255714Skris 23355714Skris des_random_key(c); 23455714Skris RETVAL=&c; 23555714Skris } 23655714SkrisOUTPUT: 23755714SkrisRETVAL 23855714Skris 23955714Skrisdes_cblock * 24055714Skrisdes_string_to_key(str) 24155714Skrischar * str 24255714SkrisCODE: 24355714Skris { 24455714Skris des_cblock c; 24555714Skris 24655714Skris des_string_to_key(str,&c); 24755714Skris RETVAL=&c; 24855714Skris } 24955714SkrisOUTPUT: 25055714SkrisRETVAL 25155714Skris 25255714Skrisvoid 25355714Skrisdes_string_to_2keys(str) 25455714Skrischar * str 25555714SkrisPPCODE: 25655714Skris { 25755714Skris des_cblock c1,c2; 25855714Skris SV *s1,*s2; 25955714Skris 26055714Skris des_string_to_2keys(str,&c1,&c2); 26155714Skris EXTEND(sp,2); 26255714Skris s1=sv_newmortal(); 26355714Skris sv_setpvn(s1,(char *)c1,8); 26455714Skris s2=sv_newmortal(); 26555714Skris sv_setpvn(s2,(char *)c2,8); 26655714Skris PUSHs(s1); 26755714Skris PUSHs(s2); 26855714Skris } 269