diff options
Diffstat (limited to 'src/lib/libcrypto/des/DES.xs')
-rw-r--r-- | src/lib/libcrypto/des/DES.xs | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/src/lib/libcrypto/des/DES.xs b/src/lib/libcrypto/des/DES.xs new file mode 100644 index 0000000000..b8050b9edf --- /dev/null +++ b/src/lib/libcrypto/des/DES.xs | |||
@@ -0,0 +1,268 @@ | |||
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 | } | ||