Home | History | Annotate | Download | only in des
      1 #include "EXTERN.h"
      2 #include "perl.h"
      3 #include "XSUB.h"
      4 #include "des.h"
      5 
      6 #define deschar	char
      7 static STRLEN len;
      8 
      9 static int
     10 not_here(s)
     11 char *s;
     12 {
     13     croak("%s not implemented on this architecture", s);
     14     return -1;
     15 }
     16 
     17 MODULE = DES	PACKAGE = DES	PREFIX = des_
     18 
     19 char *
     20 des_crypt(buf,salt)
     21 	char *	buf
     22 	char *	salt
     23 
     24 void
     25 des_set_odd_parity(key)
     26 	des_cblock *	key
     27 PPCODE:
     28 	{
     29 	SV *s;
     30 
     31 	s=sv_newmortal();
     32 	sv_setpvn(s,(char *)key,8);
     33 	des_set_odd_parity((des_cblock *)SvPV(s,na));
     34 	PUSHs(s);
     35 	}
     36 
     37 int
     38 des_is_weak_key(key)
     39 	des_cblock *	key
     40 
     41 des_key_schedule
     42 des_set_key(key)
     43 	des_cblock *	key
     44 CODE:
     45 	des_set_key(key,RETVAL);
     46 OUTPUT:
     47 RETVAL
     48 
     49 des_cblock
     50 des_ecb_encrypt(input,ks,encrypt)
     51 	des_cblock *	input
     52 	des_key_schedule *	ks
     53 	int	encrypt
     54 CODE:
     55 	des_ecb_encrypt(input,&RETVAL,*ks,encrypt);
     56 OUTPUT:
     57 RETVAL
     58 
     59 void
     60 des_cbc_encrypt(input,ks,ivec,encrypt)
     61 	char *	input
     62 	des_key_schedule *	ks
     63 	des_cblock *	ivec
     64 	int	encrypt
     65 PPCODE:
     66 	{
     67 	SV *s;
     68 	STRLEN len,l;
     69 	char *c;
     70 
     71 	l=SvCUR(ST(0));
     72 	len=((((unsigned long)l)+7)/8)*8;
     73 	s=sv_newmortal();
     74 	sv_setpvn(s,"",0);
     75 	SvGROW(s,len);
     76 	SvCUR_set(s,len);
     77 	c=(char *)SvPV(s,na);
     78 	des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,
     79 		l,*ks,ivec,encrypt);
     80 	sv_setpvn(ST(2),(char *)c[len-8],8);
     81 	PUSHs(s);
     82 	}
     83 
     84 void
     85 des_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)
     86 	char *	input
     87 	des_key_schedule *	ks1
     88 	des_key_schedule *	ks2
     89 	des_cblock *	ivec1
     90 	des_cblock *	ivec2
     91 	int	encrypt
     92 PPCODE:
     93 	{
     94 	SV *s;
     95 	STRLEN len,l;
     96 
     97 	l=SvCUR(ST(0));
     98 	len=((((unsigned long)l)+7)/8)*8;
     99 	s=sv_newmortal();
    100 	sv_setpvn(s,"",0);
    101 	SvGROW(s,len);
    102 	SvCUR_set(s,len);
    103 	des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),
    104 		l,*ks1,*ks2,ivec1,ivec2,encrypt);
    105 	sv_setpvn(ST(3),(char *)ivec1,8);
    106 	sv_setpvn(ST(4),(char *)ivec2,8);
    107 	PUSHs(s);
    108 	}
    109 
    110 void
    111 des_cbc_cksum(input,ks,ivec)
    112 	char *	input
    113 	des_key_schedule *	ks
    114 	des_cblock *	ivec
    115 PPCODE:
    116 	{
    117 	SV *s1,*s2;
    118 	STRLEN len,l;
    119 	des_cblock c;
    120 	unsigned long i1,i2;
    121 
    122 	s1=sv_newmortal();
    123 	s2=sv_newmortal();
    124 	l=SvCUR(ST(0));
    125 	des_cbc_cksum((des_cblock *)input,(des_cblock *)c,
    126 		l,*ks,ivec);
    127 	i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);
    128 	i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);
    129 	sv_setiv(s1,i1);
    130 	sv_setiv(s2,i2);
    131 	sv_setpvn(ST(2),(char *)c,8);
    132 	PUSHs(s1);
    133 	PUSHs(s2);
    134 	}
    135 
    136 void
    137 des_cfb_encrypt(input,numbits,ks,ivec,encrypt)
    138 	char *	input
    139 	int	numbits
    140 	des_key_schedule *	ks
    141 	des_cblock *	ivec
    142 	int	encrypt
    143 PPCODE:
    144 	{
    145 	SV *s;
    146 	STRLEN len;
    147 	char *c;
    148 
    149 	len=SvCUR(ST(0));
    150 	s=sv_newmortal();
    151 	sv_setpvn(s,"",0);
    152 	SvGROW(s,len);
    153 	SvCUR_set(s,len);
    154 	c=(char *)SvPV(s,na);
    155 	des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,
    156 		(int)numbits,(long)len,*ks,ivec,encrypt);
    157 	sv_setpvn(ST(3),(char *)ivec,8);
    158 	PUSHs(s);
    159 	}
    160 
    161 des_cblock *
    162 des_ecb3_encrypt(input,ks1,ks2,encrypt)
    163 	des_cblock *	input
    164 	des_key_schedule *	ks1
    165 	des_key_schedule *	ks2
    166 	int	encrypt
    167 CODE:
    168 	{
    169 	des_cblock c;
    170 
    171 	des_ecb3_encrypt((des_cblock *)input,(des_cblock *)&c,
    172 		*ks1,*ks2,encrypt);
    173 	RETVAL= &c;
    174 	}
    175 OUTPUT:
    176 RETVAL
    177 
    178 void
    179 des_ofb_encrypt(input,numbits,ks,ivec)
    180 	unsigned char *	input
    181 	int	numbits
    182 	des_key_schedule *	ks
    183 	des_cblock *	ivec
    184 PPCODE:
    185 	{
    186 	SV *s;
    187 	STRLEN len,l;
    188 	unsigned char *c;
    189 
    190 	len=SvCUR(ST(0));
    191 	s=sv_newmortal();
    192 	sv_setpvn(s,"",0);
    193 	SvGROW(s,len);
    194 	SvCUR_set(s,len);
    195 	c=(unsigned char *)SvPV(s,na);
    196 	des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,
    197 		numbits,len,*ks,ivec);
    198 	sv_setpvn(ST(3),(char *)ivec,8);
    199 	PUSHs(s);
    200 	}
    201 
    202 void
    203 des_pcbc_encrypt(input,ks,ivec,encrypt)
    204 	char *	input
    205 	des_key_schedule *	ks
    206 	des_cblock *	ivec
    207 	int	encrypt
    208 PPCODE:
    209 	{
    210 	SV *s;
    211 	STRLEN len,l;
    212 	char *c;
    213 
    214 	l=SvCUR(ST(0));
    215 	len=((((unsigned long)l)+7)/8)*8;
    216 	s=sv_newmortal();
    217 	sv_setpvn(s,"",0);
    218 	SvGROW(s,len);
    219 	SvCUR_set(s,len);
    220 	c=(char *)SvPV(s,na);
    221 	des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,
    222 		l,*ks,ivec,encrypt);
    223 	sv_setpvn(ST(2),(char *)c[len-8],8);
    224 	PUSHs(s);
    225 	}
    226 
    227 des_cblock *
    228 des_random_key()
    229 CODE:
    230 	{
    231 	des_cblock c;
    232 
    233 	des_random_key(c);
    234 	RETVAL=&c;
    235 	}
    236 OUTPUT:
    237 RETVAL
    238 
    239 des_cblock *
    240 des_string_to_key(str)
    241 char *	str
    242 CODE:
    243 	{
    244 	des_cblock c;
    245 
    246 	des_string_to_key(str,&c);
    247 	RETVAL=&c;
    248 	}
    249 OUTPUT:
    250 RETVAL
    251 
    252 void
    253 des_string_to_2keys(str)
    254 char *	str
    255 PPCODE:
    256 	{
    257 	des_cblock c1,c2;
    258 	SV *s1,*s2;
    259 
    260 	des_string_to_2keys(str,&c1,&c2);
    261 	EXTEND(sp,2);
    262 	s1=sv_newmortal();
    263 	sv_setpvn(s1,(char *)c1,8);
    264 	s2=sv_newmortal();
    265 	sv_setpvn(s2,(char *)c2,8);
    266 	PUSHs(s1);
    267 	PUSHs(s2);
    268 	}
    269