You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			269 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
			
		
		
	
	
			269 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
#include "EXTERN.h"
 | 
						|
#include "perl.h"
 | 
						|
#include "XSUB.h"
 | 
						|
#include "des.h"
 | 
						|
 | 
						|
#define deschar	char
 | 
						|
static STRLEN len;
 | 
						|
 | 
						|
static int
 | 
						|
not_here(s)
 | 
						|
char *s;
 | 
						|
{
 | 
						|
    croak("%s not implemented on this architecture", s);
 | 
						|
    return -1;
 | 
						|
}
 | 
						|
 | 
						|
MODULE = DES	PACKAGE = DES	PREFIX = des_
 | 
						|
 | 
						|
char *
 | 
						|
des_crypt(buf,salt)
 | 
						|
	char *	buf
 | 
						|
	char *	salt
 | 
						|
 | 
						|
void
 | 
						|
des_set_odd_parity(key)
 | 
						|
	des_cblock *	key
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,(char *)key,8);
 | 
						|
	des_set_odd_parity((des_cblock *)SvPV(s,na));
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
int
 | 
						|
des_is_weak_key(key)
 | 
						|
	des_cblock *	key
 | 
						|
 | 
						|
des_key_schedule
 | 
						|
des_set_key(key)
 | 
						|
	des_cblock *	key
 | 
						|
CODE:
 | 
						|
	des_set_key(key,RETVAL);
 | 
						|
OUTPUT:
 | 
						|
RETVAL
 | 
						|
 | 
						|
des_cblock
 | 
						|
des_ecb_encrypt(input,ks,encrypt)
 | 
						|
	des_cblock *	input
 | 
						|
	des_key_schedule *	ks
 | 
						|
	int	encrypt
 | 
						|
CODE:
 | 
						|
	des_ecb_encrypt(input,&RETVAL,*ks,encrypt);
 | 
						|
OUTPUT:
 | 
						|
RETVAL
 | 
						|
 | 
						|
void
 | 
						|
des_cbc_encrypt(input,ks,ivec,encrypt)
 | 
						|
	char *	input
 | 
						|
	des_key_schedule *	ks
 | 
						|
	des_cblock *	ivec
 | 
						|
	int	encrypt
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
	STRLEN len,l;
 | 
						|
	char *c;
 | 
						|
 | 
						|
	l=SvCUR(ST(0));
 | 
						|
	len=((((unsigned long)l)+7)/8)*8;
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,"",0);
 | 
						|
	SvGROW(s,len);
 | 
						|
	SvCUR_set(s,len);
 | 
						|
	c=(char *)SvPV(s,na);
 | 
						|
	des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,
 | 
						|
		l,*ks,ivec,encrypt);
 | 
						|
	sv_setpvn(ST(2),(char *)c[len-8],8);
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
void
 | 
						|
des_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)
 | 
						|
	char *	input
 | 
						|
	des_key_schedule *	ks1
 | 
						|
	des_key_schedule *	ks2
 | 
						|
	des_cblock *	ivec1
 | 
						|
	des_cblock *	ivec2
 | 
						|
	int	encrypt
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
	STRLEN len,l;
 | 
						|
 | 
						|
	l=SvCUR(ST(0));
 | 
						|
	len=((((unsigned long)l)+7)/8)*8;
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,"",0);
 | 
						|
	SvGROW(s,len);
 | 
						|
	SvCUR_set(s,len);
 | 
						|
	des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),
 | 
						|
		l,*ks1,*ks2,ivec1,ivec2,encrypt);
 | 
						|
	sv_setpvn(ST(3),(char *)ivec1,8);
 | 
						|
	sv_setpvn(ST(4),(char *)ivec2,8);
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
void
 | 
						|
des_cbc_cksum(input,ks,ivec)
 | 
						|
	char *	input
 | 
						|
	des_key_schedule *	ks
 | 
						|
	des_cblock *	ivec
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s1,*s2;
 | 
						|
	STRLEN len,l;
 | 
						|
	des_cblock c;
 | 
						|
	unsigned long i1,i2;
 | 
						|
 | 
						|
	s1=sv_newmortal();
 | 
						|
	s2=sv_newmortal();
 | 
						|
	l=SvCUR(ST(0));
 | 
						|
	des_cbc_cksum((des_cblock *)input,(des_cblock *)c,
 | 
						|
		l,*ks,ivec);
 | 
						|
	i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);
 | 
						|
	i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);
 | 
						|
	sv_setiv(s1,i1);
 | 
						|
	sv_setiv(s2,i2);
 | 
						|
	sv_setpvn(ST(2),(char *)c,8);
 | 
						|
	PUSHs(s1);
 | 
						|
	PUSHs(s2);
 | 
						|
	}
 | 
						|
 | 
						|
void
 | 
						|
des_cfb_encrypt(input,numbits,ks,ivec,encrypt)
 | 
						|
	char *	input
 | 
						|
	int	numbits
 | 
						|
	des_key_schedule *	ks
 | 
						|
	des_cblock *	ivec
 | 
						|
	int	encrypt
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
	STRLEN len;
 | 
						|
	char *c;
 | 
						|
 | 
						|
	len=SvCUR(ST(0));
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,"",0);
 | 
						|
	SvGROW(s,len);
 | 
						|
	SvCUR_set(s,len);
 | 
						|
	c=(char *)SvPV(s,na);
 | 
						|
	des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,
 | 
						|
		(int)numbits,(long)len,*ks,ivec,encrypt);
 | 
						|
	sv_setpvn(ST(3),(char *)ivec,8);
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
des_cblock *
 | 
						|
des_ecb3_encrypt(input,ks1,ks2,encrypt)
 | 
						|
	des_cblock *	input
 | 
						|
	des_key_schedule *	ks1
 | 
						|
	des_key_schedule *	ks2
 | 
						|
	int	encrypt
 | 
						|
CODE:
 | 
						|
	{
 | 
						|
	des_cblock c;
 | 
						|
 | 
						|
	des_ecb3_encrypt((des_cblock *)input,(des_cblock *)&c,
 | 
						|
		*ks1,*ks2,encrypt);
 | 
						|
	RETVAL= &c;
 | 
						|
	}
 | 
						|
OUTPUT:
 | 
						|
RETVAL
 | 
						|
 | 
						|
void
 | 
						|
des_ofb_encrypt(input,numbits,ks,ivec)
 | 
						|
	unsigned char *	input
 | 
						|
	int	numbits
 | 
						|
	des_key_schedule *	ks
 | 
						|
	des_cblock *	ivec
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
	STRLEN len,l;
 | 
						|
	unsigned char *c;
 | 
						|
 | 
						|
	len=SvCUR(ST(0));
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,"",0);
 | 
						|
	SvGROW(s,len);
 | 
						|
	SvCUR_set(s,len);
 | 
						|
	c=(unsigned char *)SvPV(s,na);
 | 
						|
	des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,
 | 
						|
		numbits,len,*ks,ivec);
 | 
						|
	sv_setpvn(ST(3),(char *)ivec,8);
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
void
 | 
						|
des_pcbc_encrypt(input,ks,ivec,encrypt)
 | 
						|
	char *	input
 | 
						|
	des_key_schedule *	ks
 | 
						|
	des_cblock *	ivec
 | 
						|
	int	encrypt
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	SV *s;
 | 
						|
	STRLEN len,l;
 | 
						|
	char *c;
 | 
						|
 | 
						|
	l=SvCUR(ST(0));
 | 
						|
	len=((((unsigned long)l)+7)/8)*8;
 | 
						|
	s=sv_newmortal();
 | 
						|
	sv_setpvn(s,"",0);
 | 
						|
	SvGROW(s,len);
 | 
						|
	SvCUR_set(s,len);
 | 
						|
	c=(char *)SvPV(s,na);
 | 
						|
	des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,
 | 
						|
		l,*ks,ivec,encrypt);
 | 
						|
	sv_setpvn(ST(2),(char *)c[len-8],8);
 | 
						|
	PUSHs(s);
 | 
						|
	}
 | 
						|
 | 
						|
des_cblock *
 | 
						|
des_random_key()
 | 
						|
CODE:
 | 
						|
	{
 | 
						|
	des_cblock c;
 | 
						|
 | 
						|
	des_random_key(c);
 | 
						|
	RETVAL=&c;
 | 
						|
	}
 | 
						|
OUTPUT:
 | 
						|
RETVAL
 | 
						|
 | 
						|
des_cblock *
 | 
						|
des_string_to_key(str)
 | 
						|
char *	str
 | 
						|
CODE:
 | 
						|
	{
 | 
						|
	des_cblock c;
 | 
						|
 | 
						|
	des_string_to_key(str,&c);
 | 
						|
	RETVAL=&c;
 | 
						|
	}
 | 
						|
OUTPUT:
 | 
						|
RETVAL
 | 
						|
 | 
						|
void
 | 
						|
des_string_to_2keys(str)
 | 
						|
char *	str
 | 
						|
PPCODE:
 | 
						|
	{
 | 
						|
	des_cblock c1,c2;
 | 
						|
	SV *s1,*s2;
 | 
						|
 | 
						|
	des_string_to_2keys(str,&c1,&c2);
 | 
						|
	EXTEND(sp,2);
 | 
						|
	s1=sv_newmortal();
 | 
						|
	sv_setpvn(s1,(char *)c1,8);
 | 
						|
	s2=sv_newmortal();
 | 
						|
	sv_setpvn(s2,(char *)c2,8);
 | 
						|
	PUSHs(s1);
 | 
						|
	PUSHs(s2);
 | 
						|
	}
 |