11541Srgrimes#include "EXTERN.h" 21541Srgrimes#include "perl.h" 31541Srgrimes#include "XSUB.h" 41541Srgrimes#include "des.h" 51541Srgrimes 61541Srgrimes#define deschar char 71541Srgrimesstatic STRLEN len; 81541Srgrimes 91541Srgrimesstatic int 101541Srgrimesnot_here(s) 111541Srgrimeschar *s; 121541Srgrimes{ 131541Srgrimes croak("%s not implemented on this architecture", s); 141541Srgrimes return -1; 151541Srgrimes} 161541Srgrimes 171541SrgrimesMODULE = DES PACKAGE = DES PREFIX = des_ 181541Srgrimes 191541Srgrimeschar * 201541Srgrimesdes_crypt(buf,salt) 211541Srgrimes char * buf 221541Srgrimes char * salt 231541Srgrimes 241541Srgrimesvoid 251541Srgrimesdes_set_odd_parity(key) 261541Srgrimes des_cblock * key 271541SrgrimesPPCODE: 281541Srgrimes { 291541Srgrimes SV *s; 301541Srgrimes 311541Srgrimes s=sv_newmortal(); 321541Srgrimes sv_setpvn(s,(char *)key,8); 331541Srgrimes des_set_odd_parity((des_cblock *)SvPV(s,na)); 3412003Swollman PUSHs(s); 351541Srgrimes } 361541Srgrimes 372169Spaulint 382169Spauldes_is_weak_key(key) 392169Spaul des_cblock * key 401541Srgrimes 411541Srgrimesdes_key_schedule 421541Srgrimesdes_set_key(key) 431541Srgrimes des_cblock * key 441541SrgrimesCODE: 451541Srgrimes des_set_key(key,RETVAL); 461541SrgrimesOUTPUT: 471541SrgrimesRETVAL 481541Srgrimes 491541Srgrimesdes_cblock 501541Srgrimesdes_ecb_encrypt(input,ks,encrypt) 511541Srgrimes des_cblock * input 529209Swollman des_key_schedule * ks 531541Srgrimes int encrypt 541541SrgrimesCODE: 551541Srgrimes des_ecb_encrypt(input,&RETVAL,*ks,encrypt); 561541SrgrimesOUTPUT: 571541SrgrimesRETVAL 581541Srgrimes 592531Swollmanvoid 601541Srgrimesdes_cbc_encrypt(input,ks,ivec,encrypt) 611541Srgrimes char * input 621541Srgrimes des_key_schedule * ks 631541Srgrimes des_cblock * ivec 641541Srgrimes int encrypt 651541SrgrimesPPCODE: 661541Srgrimes { 671541Srgrimes SV *s; 681541Srgrimes STRLEN len,l; 691541Srgrimes char *c; 701541Srgrimes 711541Srgrimes l=SvCUR(ST(0)); 721541Srgrimes len=((((unsigned long)l)+7)/8)*8; 731541Srgrimes s=sv_newmortal(); 741541Srgrimes sv_setpvn(s,"",0); 751541Srgrimes SvGROW(s,len); 761541Srgrimes SvCUR_set(s,len); 771541Srgrimes c=(char *)SvPV(s,na); 781541Srgrimes des_cbc_encrypt((des_cblock *)input,(des_cblock *)c, 791541Srgrimes l,*ks,ivec,encrypt); 801541Srgrimes sv_setpvn(ST(2),(char *)c[len-8],8); 811541Srgrimes PUSHs(s); 821541Srgrimes } 831541Srgrimes 841541Srgrimesvoid 851541Srgrimesdes_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt) 861541Srgrimes char * input 871541Srgrimes des_key_schedule * ks1 881541Srgrimes des_key_schedule * ks2 891541Srgrimes des_cblock * ivec1 901541Srgrimes des_cblock * ivec2 911541Srgrimes int encrypt 921541SrgrimesPPCODE: 931541Srgrimes { 941541Srgrimes SV *s; 951541Srgrimes STRLEN len,l; 961541Srgrimes 971541Srgrimes l=SvCUR(ST(0)); 981541Srgrimes len=((((unsigned long)l)+7)/8)*8; 991541Srgrimes s=sv_newmortal(); 1001541Srgrimes sv_setpvn(s,"",0); 1011541Srgrimes SvGROW(s,len); 1021541Srgrimes SvCUR_set(s,len); 1031541Srgrimes des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na), 1041541Srgrimes l,*ks1,*ks2,ivec1,ivec2,encrypt); 1051541Srgrimes sv_setpvn(ST(3),(char *)ivec1,8); 1061541Srgrimes sv_setpvn(ST(4),(char *)ivec2,8); 1071541Srgrimes PUSHs(s); 1081541Srgrimes } 1091541Srgrimes 1101541Srgrimesvoid 1111541Srgrimesdes_cbc_cksum(input,ks,ivec) 1121541Srgrimes char * input 1131541Srgrimes des_key_schedule * ks 1141541Srgrimes des_cblock * ivec 1151541SrgrimesPPCODE: 1161541Srgrimes { 1171541Srgrimes SV *s1,*s2; 1181541Srgrimes STRLEN len,l; 1191541Srgrimes des_cblock c; 1201541Srgrimes unsigned long i1,i2; 1211541Srgrimes 1221541Srgrimes s1=sv_newmortal(); 1231541Srgrimes s2=sv_newmortal(); 1241541Srgrimes l=SvCUR(ST(0)); 1251541Srgrimes des_cbc_cksum((des_cblock *)input,(des_cblock *)c, 1261541Srgrimes l,*ks,ivec); 1271541Srgrimes i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24); 1281541Srgrimes i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24); 1291541Srgrimes sv_setiv(s1,i1); 1301541Srgrimes sv_setiv(s2,i2); 1311541Srgrimes sv_setpvn(ST(2),(char *)c,8); 1321541Srgrimes PUSHs(s1); 1331541Srgrimes PUSHs(s2); 1341541Srgrimes } 1351541Srgrimes 1361541Srgrimesvoid 1371541Srgrimesdes_cfb_encrypt(input,numbits,ks,ivec,encrypt) 1381541Srgrimes char * input 1391541Srgrimes int numbits 1401541Srgrimes des_key_schedule * ks 1411541Srgrimes des_cblock * ivec 1421541Srgrimes int encrypt 1431541SrgrimesPPCODE: 1441541Srgrimes { 1451541Srgrimes SV *s; 1461541Srgrimes STRLEN len; 1471541Srgrimes char *c; 1481541Srgrimes 1491541Srgrimes len=SvCUR(ST(0)); 1501541Srgrimes s=sv_newmortal(); 1511541Srgrimes sv_setpvn(s,"",0); 1521541Srgrimes SvGROW(s,len); 1531541Srgrimes SvCUR_set(s,len); 1541541Srgrimes c=(char *)SvPV(s,na); 1551541Srgrimes des_cfb_encrypt((unsigned char *)input,(unsigned char *)c, 1561541Srgrimes (int)numbits,(long)len,*ks,ivec,encrypt); 1571541Srgrimes sv_setpvn(ST(3),(char *)ivec,8); 1581541Srgrimes PUSHs(s); 1591541Srgrimes } 1601541Srgrimes 1611541Srgrimesdes_cblock * 1621541Srgrimesdes_ecb3_encrypt(input,ks1,ks2,encrypt) 1631541Srgrimes des_cblock * input 1641541Srgrimes des_key_schedule * ks1 1651541Srgrimes des_key_schedule * ks2 1661541Srgrimes int encrypt 1672531SwollmanCODE: 1682531Swollman { 1692531Swollman des_cblock c; 1709209Swollman 1719209Swollman des_ecb3_encrypt((des_cblock *)input,(des_cblock *)&c, 1721541Srgrimes *ks1,*ks2,encrypt); 1731541Srgrimes RETVAL= &c; 1741541Srgrimes } 1751541SrgrimesOUTPUT: 1761541SrgrimesRETVAL 1771541Srgrimes 1789209Swollmanvoid 1791541Srgrimesdes_ofb_encrypt(input,numbits,ks,ivec) 1801541Srgrimes unsigned char * input 1811541Srgrimes int numbits 1821541Srgrimes des_key_schedule * ks 1831541Srgrimes des_cblock * ivec 1841541SrgrimesPPCODE: 1851541Srgrimes { 1861541Srgrimes SV *s; 1871541Srgrimes STRLEN len,l; 1881541Srgrimes unsigned char *c; 1891541Srgrimes 1901541Srgrimes len=SvCUR(ST(0)); 1911541Srgrimes s=sv_newmortal(); 1921541Srgrimes sv_setpvn(s,"",0); 1931541Srgrimes SvGROW(s,len); 1941541Srgrimes SvCUR_set(s,len); 1951541Srgrimes c=(unsigned char *)SvPV(s,na); 1961541Srgrimes des_ofb_encrypt((unsigned char *)input,(unsigned char *)c, 1971541Srgrimes numbits,len,*ks,ivec); 1981541Srgrimes sv_setpvn(ST(3),(char *)ivec,8); 1991541Srgrimes PUSHs(s); 2001541Srgrimes } 2011541Srgrimes 2021541Srgrimesvoid 2031541Srgrimesdes_pcbc_encrypt(input,ks,ivec,encrypt) 2041541Srgrimes char * input 2051541Srgrimes des_key_schedule * ks 2061541Srgrimes des_cblock * ivec 2071541Srgrimes int encrypt 2081541SrgrimesPPCODE: 2091541Srgrimes { 2101541Srgrimes SV *s; 2111541Srgrimes STRLEN len,l; 2121541Srgrimes char *c; 2131541Srgrimes 2141541Srgrimes l=SvCUR(ST(0)); 2151541Srgrimes len=((((unsigned long)l)+7)/8)*8; 2161541Srgrimes s=sv_newmortal(); 2171541Srgrimes sv_setpvn(s,"",0); 2181541Srgrimes SvGROW(s,len); 2191541Srgrimes SvCUR_set(s,len); 2201541Srgrimes c=(char *)SvPV(s,na); 2211541Srgrimes des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c, 2221541Srgrimes l,*ks,ivec,encrypt); 2231541Srgrimes sv_setpvn(ST(2),(char *)c[len-8],8); 2241541Srgrimes PUSHs(s); 2251541Srgrimes } 2261541Srgrimes 2271541Srgrimesdes_cblock * 2281541Srgrimesdes_random_key() 2291541SrgrimesCODE: 2301541Srgrimes { 2315109Swollman des_cblock c; 2326399Swollman 2336399Swollman des_random_key(c); 2347091Swollman RETVAL=&c; 2359575Speter } 23612003SwollmanOUTPUT: 23712003SwollmanRETVAL 23812003Swollman 2391541Srgrimesdes_cblock * 2401541Srgrimesdes_string_to_key(str) 2411541Srgrimeschar * str 2421541SrgrimesCODE: 2431541Srgrimes { 2441541Srgrimes des_cblock c; 2451541Srgrimes 2465109Swollman des_string_to_key(str,&c); 2476399Swollman RETVAL=&c; 2486399Swollman } 2497091SwollmanOUTPUT: 2509575SpeterRETVAL 25112003Swollman 25212003Swollmanvoid 2531541Srgrimesdes_string_to_2keys(str) 2541541Srgrimeschar * str 2551541SrgrimesPPCODE: 2561541Srgrimes { 2577088Swollman des_cblock c1,c2; 2587088Swollman SV *s1,*s2; 2591541Srgrimes 2601541Srgrimes des_string_to_2keys(str,&c1,&c2); 2611541Srgrimes EXTEND(sp,2); 2621541Srgrimes s1=sv_newmortal(); 2631541Srgrimes sv_setpvn(s1,(char *)c1,8); 2641541Srgrimes s2=sv_newmortal(); 2657088Swollman sv_setpvn(s2,(char *)c2,8); 2661541Srgrimes PUSHs(s1); 2672169Spaul PUSHs(s2); 2682169Spaul } 2695109Swollman