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