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