1 /*
2  * Copyright 2001 Abhijit Menon-Sen <ams@toroid.org>
3  */
4 
5 #include "EXTERN.h"
6 #include "perl.h"
7 #include "XSUB.h"
8 #include "ppport.h"
9 
10 #include "tea.h"
11 
12 typedef struct tea * Crypt__TEA;
13 
14 MODULE = Crypt::TEA     PACKAGE = Crypt::TEA    PREFIX = tea_
15 PROTOTYPES: DISABLE
16 
17 Crypt::TEA
tea_setup(key,rounds)18 tea_setup(key, rounds)
19     char *  key    = NO_INIT
20     int     rounds
21     STRLEN  keylen = NO_INIT
22     CODE:
23     {
24         key = SvPV(ST(0), keylen);
25         if (keylen != 16)
26             croak("key must be 16 bytes long");
27 
28         RETVAL = tea_setup((unsigned char *)key, rounds);
29     }
30     OUTPUT:
31         RETVAL
32 
33 void
34 tea_DESTROY(self)
35     Crypt::TEA self
36     CODE:
37         tea_free(self);
38 
39 void
tea_crypt(self,input,output,decrypt)40 tea_crypt(self, input, output, decrypt)
41     Crypt::TEA self
42     char *  input  = NO_INIT
43     SV *    output
44     int     decrypt
45     STRLEN  inlen  = NO_INIT
46     STRLEN  outlen = NO_INIT
47     CODE:
48     {
49         input = SvPV(ST(1), inlen);
50         if (inlen != 8)
51             croak("input must be 8 bytes long");
52 
53         if (output == &PL_sv_undef)
54             output = sv_newmortal();
55         outlen = 8;
56 
57         if (SvREADONLY(output))
58             SvUPGRADE(output, SVt_PV);
59 
60         tea_crypt(self,
61                   (unsigned char *)input,
62                   (unsigned char *)SvGROW(output, outlen),
63                   decrypt);
64 
65         SvCUR_set(output, outlen);
66         *SvEND(output) = '\0';
67         SvPOK_only(output);
68         SvTAINT(output);
69         ST(0) = output;
70     }
71