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 } 269