]>
Commit | Line | Data |
---|---|---|
d02b48c6 RE |
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 | } |