ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
Revision: 1.1
Committed: Sat Jan 10 03:15:59 2015 UTC (9 years, 4 months ago) by root
Branch: MAIN
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include "EXTERN.h"
2     #include "perl.h"
3     #include "XSUB.h"
4    
5     #include "spritz/spritz.c"
6    
7     typedef spritz_state *Crypt__Spritz;
8     #if 0
9     typedef spritz_state *Crypt__Spritz__CIPHER;
10     typedef spritz_state *Crypt__Spritz__CIPHER__XOR;
11     typedef spritz_state *Crypt__Spritz__HASH;
12     typedef spritz_state *Crypt__Spritz__MAC;
13     typedef spritz_state *Crypt__Spritz__AEAD;
14     typedef spritz_state *Crypt__Spritz__AEAD__XOR;
15     #endif
16    
17     static SV *
18     alloc_pv (STRLEN len)
19     {
20     SV *r = newSV (len);
21    
22     sv_upgrade (r, SVt_PV);
23     SvCUR_set (r, len);
24     SvPOK_only (r);
25     SvEND (r)[-1] = 0;
26    
27     return r;
28     }
29    
30     static SV *
31     alloc_spritz(SV *klass)
32     {
33     SV *r = alloc_pv (sizeof (spritz_state));
34    
35     return sv_bless (newRV_noinc (r), gv_stashsv (klass, GV_ADD));
36     }
37    
38     static spritz_state *
39     get_state (SV *sv)
40     {
41     if (!sv_derived_from (sv, "Crypt::Spritz"))
42     croak ("object is not of type Crypt::Spritz");
43    
44     sv = SvRV (sv);
45    
46     /* this can happen when the objhetc is serialised, which isn't officially supported */
47     if (SvUTF8 (sv))
48     sv_utf8_downgrade (sv, 0);
49    
50     return (spritz_state *)SvPVX (sv);
51     }
52    
53     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_
54    
55     PROTOTYPES: ENABLE
56    
57     SV *
58     new (SV *klass)
59     CODE:
60     RETVAL = alloc_spritz (klass);
61     spritz_init ((spritz_state *)SvPVX (SvRV (RETVAL)));
62     OUTPUT:
63     RETVAL
64    
65     void spritz_init (Crypt::Spritz self)
66    
67     void spritz_update (Crypt::Spritz self)
68    
69     void spritz_whip (Crypt::Spritz self, UV r)
70    
71     void spritz_crush (Crypt::Spritz self)
72    
73     void spritz_shuffle (Crypt::Spritz self)
74    
75     void spritz_absorb_stop (Crypt::Spritz self)
76    
77     void spritz_absorb (Crypt::Spritz self, SV *data)
78     ALIAS:
79     spritz_absorb = 0
80     spritz_absorb_and_stop = 1
81     CODE:
82     {
83     STRLEN len; char *ptr = SvPVbyte (data, len);
84    
85     spritz_absorb (self, ptr, len);
86    
87     if (ix)
88     spritz_absorb_stop (self);
89     }
90    
91     U8 spritz_output (Crypt::Spritz self)
92    
93     U8 spritz_drip (Crypt::Spritz self)
94    
95     SV *
96     spritz_squeeze (Crypt::Spritz self, STRLEN len)
97     CODE:
98     RETVAL = alloc_pv (len);
99     spritz_squeeze (self, SvPVX (RETVAL), len);
100     OUTPUT:
101     RETVAL
102    
103     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::CIPHER::XOR PREFIX = spritz_cipher_xor_
104    
105     SV *
106     new (SV *klass, SV *K, SV *IV = 0)
107     CODE:
108     {
109     STRLEN k_len ; char *k = SvPVbyte (K , k_len );
110     STRLEN iv_len = 0; char *iv = iv ? SvPVbyte (IV, iv_len) : 0;
111     RETVAL = alloc_spritz (klass);
112     spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len);
113     }
114     OUTPUT:
115     RETVAL
116    
117     SV *
118     crypt (Crypt::Spritz self, SV *I)
119     CODE:
120     {
121     STRLEN len; char *ptr = SvPVbyte (I, len);
122     RETVAL = alloc_pv (len);
123     spritz_cipher_xor_crypt (self, ptr, SvPVX (RETVAL), len);
124     }
125     OUTPUT:
126     RETVAL
127    
128     void
129     crypt_inplace (Crypt::Spritz self, SV *I)
130     CODE:
131     {
132     STRLEN len; char *ptr = SvPVbyte (I, len);
133     spritz_cipher_xor_crypt (self, ptr, ptr, len);
134     }
135    
136     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::HASH PREFIX = spritz_hash_
137    
138     # new == Spritz::new (inherit)
139     # add == absorb (alias)
140    
141     SV *
142     spritz_hash_finish (Crypt::Spritz self, STRLEN len)
143     CODE:
144     RETVAL = alloc_pv (len);
145     spritz_hash_finish (self, SvPVX (RETVAL), len);
146     OUTPUT:
147     RETVAL
148    
149     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::MAC PREFIX = spritz_mac_
150    
151     SV *
152     new (SV *klass, SV *K)
153     CODE:
154     {
155     STRLEN len; char *ptr = SvPVbyte (K, len);
156     RETVAL = alloc_spritz (klass);
157     spritz_mac_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
158     }
159     OUTPUT:
160     RETVAL
161    
162     # add == Spritz::HASH::add (inherit)
163     # finish == Spritz::HASH::finish (inherit)
164    
165     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_
166    
167     # new == Spritz::MAC::new (inherit)
168     # nonce == absorb_and_stop (alias)
169     # associated_data == absorb_and_stop (alias)
170     # finish == Spritz::MAC::finish (alias)
171    
172     SV *
173     crypt (Crypt::Spritz self, SV *I)
174     CODE:
175     {
176     STRLEN len; char *ptr = SvPVbyte (I, len);
177     RETVAL = alloc_pv (len);
178     spritz_aead_xor_crypt (self, ptr, SvPVX (RETVAL), len);
179     }
180     OUTPUT:
181     RETVAL
182    
183     void
184     crypt_inplace (Crypt::Spritz self, SV *I)
185     CODE:
186     {
187     STRLEN len; char *ptr = SvPVbyte (I, len);
188     spritz_aead_xor_crypt (self, ptr, ptr, len);
189     }
190    
191     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_
192    
193     SV *
194     new (SV *klass, SV *S = 0)
195     CODE:
196     {
197     STRLEN len = 0; char *ptr = S ? SvPVbyte (S, len) : 0;
198     RETVAL = alloc_spritz (klass);
199     spritz_prng_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
200     }
201     OUTPUT:
202     RETVAL
203    
204     # add == absorb (alias)
205     # get == squeeze (alias)
206