Option to set current cert to server certificate.
[openssl.git] / crypto / des / DES.xs
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         }