import cyrus-sasl-2.1.23
[cyrus-sasl.git] / mac / libdes / src / DES.xs
1 #include "EXTERN.h"\r#include "perl.h"\r#include "XSUB.h"\r#include "des.h"\r\r#define deschar       char\rstatic STRLEN len;\r\rstatic int\rnot_here(s)\rchar *s;\r{\r    croak("%s not implemented on this architecture", s);\r    return -1;\r}\r\rMODULE = DES      PACKAGE = DES   PREFIX = des_\r\rchar *\rdes_crypt(buf,salt)\r      char *  buf\r    char *  salt\r\rvoid\rdes_set_odd_parity(key)\r     des_cblock *    key\rPPCODE:\r    {\r      SV *s;\r\r        s=sv_newmortal();\r      sv_setpvn(s,(char *)key,8);\r    des_set_odd_parity((des_cblock *)SvPV(s,na));\r  PUSHs(s);\r      }\r\rint\rdes_is_weak_key(key)\r    des_cblock *    key\r\rdes_key_schedule\rdes_set_key(key)\r des_cblock *    key\rCODE:\r      des_set_key(key,RETVAL);\rOUTPUT:\rRETVAL\r\rdes_cblock\rdes_ecb_encrypt(input,ks,encrypt)\r  des_cblock *    input\r  des_key_schedule *      ks\r     int     encrypt\rCODE:\r  des_ecb_encrypt(input,&RETVAL,*ks,encrypt);\rOUTPUT:\rRETVAL\r\rvoid\rdes_cbc_encrypt(input,ks,ivec,encrypt)\r        char *  input\r  des_key_schedule *      ks\r     des_cblock *    ivec\r   int     encrypt\rPPCODE:\r        {\r      SV *s;\r STRLEN len,l;\r  char *c;\r\r      l=SvCUR(ST(0));\r        len=((((unsigned long)l)+7)/8)*8;\r      s=sv_newmortal();\r      sv_setpvn(s,"",0);\r     SvGROW(s,len);\r SvCUR_set(s,len);\r      c=(char *)SvPV(s,na);\r  des_cbc_encrypt((des_cblock *)input,(des_cblock *)c,\r           l,*ks,ivec,encrypt);\r   sv_setpvn(ST(2),(char *)c[len-8],8);\r   PUSHs(s);\r      }\r\rvoid\rdes_cbc3_encrypt(input,ks1,ks2,ivec1,ivec2,encrypt)\r    char *  input\r  des_key_schedule *      ks1\r    des_key_schedule *      ks2\r    des_cblock *    ivec1\r  des_cblock *    ivec2\r  int     encrypt\rPPCODE:\r        {\r      SV *s;\r STRLEN len,l;\r\r l=SvCUR(ST(0));\r        len=((((unsigned long)l)+7)/8)*8;\r      s=sv_newmortal();\r      sv_setpvn(s,"",0);\r     SvGROW(s,len);\r SvCUR_set(s,len);\r      des_3cbc_encrypt((des_cblock *)input,(des_cblock *)SvPV(s,na),\r         l,*ks1,*ks2,ivec1,ivec2,encrypt);\r      sv_setpvn(ST(3),(char *)ivec1,8);\r      sv_setpvn(ST(4),(char *)ivec2,8);\r      PUSHs(s);\r      }\r\rvoid\rdes_cbc_cksum(input,ks,ivec)\r   char *  input\r  des_key_schedule *      ks\r     des_cblock *    ivec\rPPCODE:\r   {\r      SV *s1,*s2;\r    STRLEN len,l;\r  des_cblock c;\r  unsigned long i1,i2;\r\r  s1=sv_newmortal();\r     s2=sv_newmortal();\r     l=SvCUR(ST(0));\r        des_cbc_cksum((des_cblock *)input,(des_cblock *)c,\r             l,*ks,ivec);\r   i1=c[4]|(c[5]<<8)|(c[6]<<16)|(c[7]<<24);\r       i2=c[0]|(c[1]<<8)|(c[2]<<16)|(c[3]<<24);\r       sv_setiv(s1,i1);\r       sv_setiv(s2,i2);\r       sv_setpvn(ST(2),(char *)c,8);\r  PUSHs(s1);\r     PUSHs(s2);\r     }\r\rvoid\rdes_cfb_encrypt(input,numbits,ks,ivec,encrypt)\r char *  input\r  int     numbits\r        des_key_schedule *      ks\r     des_cblock *    ivec\r   int     encrypt\rPPCODE:\r        {\r      SV *s;\r STRLEN len;\r    char *c;\r\r      len=SvCUR(ST(0));\r      s=sv_newmortal();\r      sv_setpvn(s,"",0);\r     SvGROW(s,len);\r SvCUR_set(s,len);\r      c=(char *)SvPV(s,na);\r  des_cfb_encrypt((unsigned char *)input,(unsigned char *)c,\r             (int)numbits,(long)len,*ks,ivec,encrypt);\r      sv_setpvn(ST(3),(char *)ivec,8);\r       PUSHs(s);\r      }\r\rdes_cblock *\rdes_ecb3_encrypt(input,ks1,ks2,encrypt)\r        des_cblock *    input\r  des_key_schedule *      ks1\r    des_key_schedule *      ks2\r    int     encrypt\rCODE:\r  {\r      des_cblock c;\r\r des_3ecb_encrypt((des_cblock *)input,(des_cblock *)&c,\r         *ks1,*ks2,encrypt);\r    RETVAL= &c;\r    }\rOUTPUT:\rRETVAL\r\rvoid\rdes_ofb_encrypt(input,numbits,ks,ivec)\r  unsigned char * input\r  int     numbits\r        des_key_schedule *      ks\r     des_cblock *    ivec\rPPCODE:\r   {\r      SV *s;\r STRLEN len,l;\r  unsigned char *c;\r\r     len=SvCUR(ST(0));\r      s=sv_newmortal();\r      sv_setpvn(s,"",0);\r     SvGROW(s,len);\r SvCUR_set(s,len);\r      c=(unsigned char *)SvPV(s,na);\r des_ofb_encrypt((unsigned char *)input,(unsigned char *)c,\r             numbits,len,*ks,ivec);\r sv_setpvn(ST(3),(char *)ivec,8);\r       PUSHs(s);\r      }\r\rvoid\rdes_pcbc_encrypt(input,ks,ivec,encrypt)\r        char *  input\r  des_key_schedule *      ks\r     des_cblock *    ivec\r   int     encrypt\rPPCODE:\r        {\r      SV *s;\r STRLEN len,l;\r  char *c;\r\r      l=SvCUR(ST(0));\r        len=((((unsigned long)l)+7)/8)*8;\r      s=sv_newmortal();\r      sv_setpvn(s,"",0);\r     SvGROW(s,len);\r SvCUR_set(s,len);\r      c=(char *)SvPV(s,na);\r  des_pcbc_encrypt((des_cblock *)input,(des_cblock *)c,\r          l,*ks,ivec,encrypt);\r   sv_setpvn(ST(2),(char *)c[len-8],8);\r   PUSHs(s);\r      }\r\rdes_cblock *\rdes_random_key()\rCODE:\r {\r      des_cblock c;\r\r des_random_key(c);\r     RETVAL=&c;\r     }\rOUTPUT:\rRETVAL\r\rdes_cblock *\rdes_string_to_key(str)\rchar *    str\rCODE:\r      {\r      des_cblock c;\r\r des_string_to_key(str,&c);\r     RETVAL=&c;\r     }\rOUTPUT:\rRETVAL\r\rvoid\rdes_string_to_2keys(str)\rchar *  str\rPPCODE:\r    {\r      des_cblock c1,c2;\r      SV *s1,*s2;\r\r   des_string_to_2keys(str,&c1,&c2);\r      EXTEND(sp,2);\r  s1=sv_newmortal();\r     sv_setpvn(s1,(char *)c1,8);\r    s2=sv_newmortal();\r     sv_setpvn(s2,(char *)c2,8);\r    PUSHs(s1);\r     PUSHs(s2);\r     }\r