1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "EXTERN.h"
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "perl.h"
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "XSUB.h"
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "des.h"
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define deschar	char
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic STRLEN len;
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectnot_here(s)
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *s;
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    croak("%s not implemented on this architecture", s);
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return -1;
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectMODULE = DES	PACKAGE = DES	PREFIX = des_
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_crypt(buf,salt)
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	buf
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	salt
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_set_odd_parity(key)
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	key
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,(char *)key,8);
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_set_odd_parity((des_cblock *)SvPV(s,na));
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_is_weak_key(key)
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	key
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_key_schedule
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_set_key(key)
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	key
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCODE:
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_set_key(key,RETVAL);
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOUTPUT:
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRETVAL
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cblock
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_ecb_encrypt(input,ks,encrypt)
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	input
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCODE:
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_ecb_encrypt(input,&RETVAL,*ks,encrypt);
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOUTPUT:
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRETVAL
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cbc_encrypt(input,ks,ivec,encrypt)
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	input
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len,l;
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *c;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=SvCUR(ST(0));
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=((((unsigned long)l)+7)/8)*8;
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,"",0);
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvGROW(s,len);
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvCUR_set(s,len);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=(char *)SvPV(s,na);
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l,*ks,ivec,encrypt);
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(2),(char *)c[len-8],8);
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	input
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks1
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks2
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec1
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec2
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len,l;
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=SvCUR(ST(0));
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=((((unsigned long)l)+7)/8)*8;
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,"",0);
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvGROW(s,len);
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvCUR_set(s,len);
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l,*ks1,*ks2,ivec1,ivec2,encrypt);
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(3),(char *)ivec1,8);
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(4),(char *)ivec2,8);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cbc_cksum(input,ks,ivec)
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	input
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s1,*s2;
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len,l;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock c;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned long i1,i2;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s1=sv_newmortal();
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s2=sv_newmortal();
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=SvCUR(ST(0));
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cbc_cksum((des_cblock *)input,(des_cblock *)c,
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l,*ks,ivec);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setiv(s1,i1);
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setiv(s2,i2);
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(2),(char *)c,8);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s1);
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s2);
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cfb_encrypt(input,numbits,ks,ivec,encrypt)
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	input
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	numbits
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len;
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *c;
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=SvCUR(ST(0));
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,"",0);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvGROW(s,len);
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvCUR_set(s,len);
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=(char *)SvPV(s,na);
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(int)numbits,(long)len,*ks,ivec,encrypt);
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(3),(char *)ivec,8);
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cblock *
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_ecb3_encrypt(input,ks1,ks2,encrypt)
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	input
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks1
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks2
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCODE:
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock c;
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_ecb3_encrypt((des_cblock *)input,(des_cblock *)&c,
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*ks1,*ks2,encrypt);
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RETVAL= &c;
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOUTPUT:
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRETVAL
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_ofb_encrypt(input,numbits,ks,ivec)
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *	input
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	numbits
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len,l;
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *c;
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=SvCUR(ST(0));
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,"",0);
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvGROW(s,len);
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvCUR_set(s,len);
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=(unsigned char *)SvPV(s,na);
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		numbits,len,*ks,ivec);
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(3),(char *)ivec,8);
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_pcbc_encrypt(input,ks,ivec,encrypt)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *	input
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_key_schedule *	ks
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock *	ivec
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int	encrypt
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s;
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	STRLEN len,l;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *c;
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	l=SvCUR(ST(0));
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	len=((((unsigned long)l)+7)/8)*8;
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s=sv_newmortal();
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s,"",0);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvGROW(s,len);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SvCUR_set(s,len);
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c=(char *)SvPV(s,na);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		l,*ks,ivec,encrypt);
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(ST(2),(char *)c[len-8],8);
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s);
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cblock *
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_random_key()
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCODE:
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock c;
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_random_key(c);
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RETVAL=&c;
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOUTPUT:
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRETVAL
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_cblock *
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_string_to_key(str)
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *	str
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectCODE:
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock c;
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_string_to_key(str,&c);
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	RETVAL=&c;
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectOUTPUT:
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectRETVAL
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectdes_string_to_2keys(str)
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *	str
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectPPCODE:
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_cblock c1,c2;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	SV *s1,*s2;
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_string_to_2keys(str,&c1,&c2);
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EXTEND(sp,2);
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s1=sv_newmortal();
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s1,(char *)c1,8);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	s2=sv_newmortal();
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	sv_setpvn(s2,(char *)c2,8);
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s1);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PUSHs(s2);
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
269