ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
Revision: 1.9
Committed: Tue Jun 30 01:24:43 2015 UTC (8 years, 10 months ago) by root
Branch: MAIN
CVS Tags: rel-1_02, rel-1_01, HEAD
Changes since 1.8: +1 -1 lines
Log Message:
1.01

File Contents

# User Rev Content
1 root 1.1 #include "EXTERN.h"
2     #include "perl.h"
3     #include "XSUB.h"
4    
5 root 1.8 #include "perlmulticore.h"
6    
7 root 1.1 #include "spritz/spritz.c"
8    
9     typedef spritz_state *Crypt__Spritz;
10     #if 0
11     typedef spritz_state *Crypt__Spritz__CIPHER;
12     typedef spritz_state *Crypt__Spritz__CIPHER__XOR;
13     typedef spritz_state *Crypt__Spritz__HASH;
14     typedef spritz_state *Crypt__Spritz__MAC;
15     typedef spritz_state *Crypt__Spritz__AEAD;
16     typedef spritz_state *Crypt__Spritz__AEAD__XOR;
17     #endif
18    
19     static SV *
20     alloc_pv (STRLEN len)
21     {
22     SV *r = newSV (len);
23    
24     sv_upgrade (r, SVt_PV);
25     SvCUR_set (r, len);
26     SvPOK_only (r);
27 root 1.7 *SvEND (r) = 0;
28 root 1.1
29     return r;
30     }
31    
32     static SV *
33 root 1.2 alloc_state (SV *klass)
34 root 1.1 {
35     SV *r = alloc_pv (sizeof (spritz_state));
36    
37     return sv_bless (newRV_noinc (r), gv_stashsv (klass, GV_ADD));
38     }
39    
40     static spritz_state *
41     get_state (SV *sv)
42     {
43 root 1.4 if (!sv_derived_from (sv, "Crypt::Spritz::Base"))
44     croak ("object is not of type Crypt::Spritz::Base");
45 root 1.1
46     sv = SvRV (sv);
47    
48     /* this can happen when the objhetc is serialised, which isn't officially supported */
49     if (SvUTF8 (sv))
50     sv_utf8_downgrade (sv, 0);
51    
52     return (spritz_state *)SvPVX (sv);
53     }
54    
55 root 1.5 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Base
56    
57     SV *
58     clone (SV *self)
59     CODE:
60     /* no type check... too bad */
61     self = SvRV (self);
62     RETVAL = sv_bless (newRV_noinc (newSVsv (self)), SvSTASH (self));
63     OUTPUT:
64     RETVAL
65    
66 root 1.1 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_
67    
68     PROTOTYPES: ENABLE
69    
70     SV *
71     new (SV *klass)
72     CODE:
73 root 1.2 RETVAL = alloc_state (klass);
74 root 1.1 spritz_init ((spritz_state *)SvPVX (SvRV (RETVAL)));
75     OUTPUT:
76     RETVAL
77    
78     void spritz_init (Crypt::Spritz self)
79    
80     void spritz_update (Crypt::Spritz self)
81    
82     void spritz_whip (Crypt::Spritz self, UV r)
83    
84     void spritz_crush (Crypt::Spritz self)
85    
86     void spritz_shuffle (Crypt::Spritz self)
87    
88     void spritz_absorb_stop (Crypt::Spritz self)
89    
90     void spritz_absorb (Crypt::Spritz self, SV *data)
91     ALIAS:
92 root 1.2 absorb_and_stop = 1
93 root 1.1 CODE:
94     {
95     STRLEN len; char *ptr = SvPVbyte (data, len);
96    
97 root 1.8 if (len > 400) perlinterp_release ();
98    
99 root 1.1 spritz_absorb (self, ptr, len);
100    
101     if (ix)
102     spritz_absorb_stop (self);
103 root 1.8
104     if (len > 400) perlinterp_acquire ();
105 root 1.1 }
106    
107     U8 spritz_output (Crypt::Spritz self)
108    
109     U8 spritz_drip (Crypt::Spritz self)
110    
111     SV *
112     spritz_squeeze (Crypt::Spritz self, STRLEN len)
113     CODE:
114     RETVAL = alloc_pv (len);
115     spritz_squeeze (self, SvPVX (RETVAL), len);
116     OUTPUT:
117     RETVAL
118    
119 root 1.4 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_xor_
120 root 1.1
121     SV *
122     new (SV *klass, SV *K, SV *IV = 0)
123     CODE:
124     {
125     STRLEN k_len ; char *k = SvPVbyte (K , k_len );
126 root 1.9 STRLEN iv_len = 0; char *iv = IV ? SvPVbyte (IV, iv_len) : 0;
127 root 1.2 RETVAL = alloc_state (klass);
128 root 1.1 spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len);
129     }
130     OUTPUT:
131     RETVAL
132    
133 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_
134 root 1.4
135 root 1.1 SV *
136 root 1.6 encrypt (Crypt::Spritz self, SV *I)
137     ALIAS:
138     encrypt = 0
139     decrypt = 1
140     Crypt::Spritz::Cipher::XOR::crypt = 2
141     Crypt::Spritz::AEAD::encrypt = 3
142     Crypt::Spritz::AEAD::decrypt = 4
143     Crypt::Spritz::AEAD::XOR::crypt = 5
144     CODE:
145     static void (*f[])(spritz_state *s, const void *I, void *O, size_t len) = {
146     spritz_cipher_encrypt,
147     spritz_cipher_decrypt,
148     spritz_cipher_xor_crypt,
149     spritz_aead_encrypt,
150     spritz_aead_decrypt,
151     spritz_aead_xor_crypt
152     };
153 root 1.1 {
154     STRLEN len; char *ptr = SvPVbyte (I, len);
155 root 1.8 char *retval;
156     STRLEN slow_len = ix < 3 ? 4000 : 400;
157 root 1.1 RETVAL = alloc_pv (len);
158 root 1.8 retval = SvPVX (RETVAL);
159     if (len > slow_len) perlinterp_release ();
160     f[ix](self, ptr, retval, len);
161     if (len > slow_len) perlinterp_acquire ();
162 root 1.1 }
163     OUTPUT:
164     RETVAL
165    
166 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_
167    
168     # crypt == Spritz::Cipher::crypt (xs-alias)
169    
170 root 1.1 void
171     crypt_inplace (Crypt::Spritz self, SV *I)
172     CODE:
173 root 1.3 sv_force_normal (I);
174 root 1.1 {
175     STRLEN len; char *ptr = SvPVbyte (I, len);
176 root 1.8 if (len > 4000) perlinterp_release ();
177 root 1.1 spritz_cipher_xor_crypt (self, ptr, ptr, len);
178 root 1.8 if (len > 4000) perlinterp_acquire ();
179 root 1.1 }
180    
181 root 1.2 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_
182 root 1.1
183     # new == Spritz::new (inherit)
184     # add == absorb (alias)
185    
186     SV *
187     spritz_hash_finish (Crypt::Spritz self, STRLEN len)
188     CODE:
189 root 1.8 char *retval;
190 root 1.1 RETVAL = alloc_pv (len);
191     spritz_hash_finish (self, SvPVX (RETVAL), len);
192     OUTPUT:
193     RETVAL
194    
195     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::MAC PREFIX = spritz_mac_
196    
197     SV *
198     new (SV *klass, SV *K)
199     CODE:
200     {
201     STRLEN len; char *ptr = SvPVbyte (K, len);
202 root 1.2 RETVAL = alloc_state (klass);
203 root 1.1 spritz_mac_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
204     }
205     OUTPUT:
206     RETVAL
207    
208     # add == Spritz::HASH::add (inherit)
209     # finish == Spritz::HASH::finish (inherit)
210    
211 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_
212 root 1.1
213 root 1.6 # new == Spritz::MAC::new (inherit)
214     # nonce == absorb_and_stop (alias)
215     # associated_data == absorb_and_stop (alias)
216     # encrypt == Spritz::Cipher::crypt (xs-alias)
217     # decrypt == Spritz::Cipher::crypt (xs-alias)
218     # finish == Spritz::MAC::finish (alias)
219 root 1.1
220 root 1.4 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_
221    
222     # new == Spritz::MAC::new (inherit)
223     # nonce == Spritz::AEAD::nonce (inherit)
224     # associated_data == Spritz::AEAD::associated_data (inherit)
225 root 1.6 # crypt == Spritz::Cipher::crypt (xs-alias)
226 root 1.4 # finish == Spritz::AEAD::finish (inherit)
227    
228 root 1.1 void
229     crypt_inplace (Crypt::Spritz self, SV *I)
230     CODE:
231 root 1.3 sv_force_normal (I);
232 root 1.1 {
233     STRLEN len; char *ptr = SvPVbyte (I, len);
234 root 1.8 if (len > 400) perlinterp_release ();
235 root 1.1 spritz_aead_xor_crypt (self, ptr, ptr, len);
236 root 1.8 if (len > 400) perlinterp_acquire ();
237 root 1.1 }
238    
239     MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_
240    
241     SV *
242     new (SV *klass, SV *S = 0)
243     CODE:
244     {
245     STRLEN len = 0; char *ptr = S ? SvPVbyte (S, len) : 0;
246 root 1.2 RETVAL = alloc_state (klass);
247 root 1.1 spritz_prng_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
248     }
249     OUTPUT:
250     RETVAL
251    
252     # add == absorb (alias)
253     # get == squeeze (alias)
254