1 | #include "EXTERN.h" |
1 | #include "EXTERN.h" |
2 | #include "perl.h" |
2 | #include "perl.h" |
3 | #include "XSUB.h" |
3 | #include "XSUB.h" |
|
|
4 | |
|
|
5 | #include "perlmulticore.h" |
4 | |
6 | |
5 | #include "spritz/spritz.c" |
7 | #include "spritz/spritz.c" |
6 | |
8 | |
7 | typedef spritz_state *Crypt__Spritz; |
9 | typedef spritz_state *Crypt__Spritz; |
8 | #if 0 |
10 | #if 0 |
… | |
… | |
20 | SV *r = newSV (len); |
22 | SV *r = newSV (len); |
21 | |
23 | |
22 | sv_upgrade (r, SVt_PV); |
24 | sv_upgrade (r, SVt_PV); |
23 | SvCUR_set (r, len); |
25 | SvCUR_set (r, len); |
24 | SvPOK_only (r); |
26 | SvPOK_only (r); |
25 | SvEND (r)[-1] = 0; |
27 | *SvEND (r) = 0; |
26 | |
28 | |
27 | return r; |
29 | return r; |
28 | } |
30 | } |
29 | |
31 | |
30 | static SV * |
32 | static SV * |
… | |
… | |
48 | sv_utf8_downgrade (sv, 0); |
50 | sv_utf8_downgrade (sv, 0); |
49 | |
51 | |
50 | return (spritz_state *)SvPVX (sv); |
52 | return (spritz_state *)SvPVX (sv); |
51 | } |
53 | } |
52 | |
54 | |
|
|
55 | 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 | |
53 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_ |
66 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_ |
54 | |
67 | |
55 | PROTOTYPES: ENABLE |
68 | PROTOTYPES: ENABLE |
56 | |
69 | |
57 | SV * |
70 | SV * |
… | |
… | |
79 | absorb_and_stop = 1 |
92 | absorb_and_stop = 1 |
80 | CODE: |
93 | CODE: |
81 | { |
94 | { |
82 | STRLEN len; char *ptr = SvPVbyte (data, len); |
95 | STRLEN len; char *ptr = SvPVbyte (data, len); |
83 | |
96 | |
|
|
97 | if (len > 400) perlinterp_release (); |
|
|
98 | |
84 | spritz_absorb (self, ptr, len); |
99 | spritz_absorb (self, ptr, len); |
85 | |
100 | |
86 | if (ix) |
101 | if (ix) |
87 | spritz_absorb_stop (self); |
102 | spritz_absorb_stop (self); |
|
|
103 | |
|
|
104 | if (len > 400) perlinterp_acquire (); |
88 | } |
105 | } |
89 | |
106 | |
90 | U8 spritz_output (Crypt::Spritz self) |
107 | U8 spritz_output (Crypt::Spritz self) |
91 | |
108 | |
92 | U8 spritz_drip (Crypt::Spritz self) |
109 | U8 spritz_drip (Crypt::Spritz self) |
… | |
… | |
104 | SV * |
121 | SV * |
105 | new (SV *klass, SV *K, SV *IV = 0) |
122 | new (SV *klass, SV *K, SV *IV = 0) |
106 | CODE: |
123 | CODE: |
107 | { |
124 | { |
108 | STRLEN k_len ; char *k = SvPVbyte (K , k_len ); |
125 | STRLEN k_len ; char *k = SvPVbyte (K , k_len ); |
109 | STRLEN iv_len = 0; char *iv = iv ? SvPVbyte (IV, iv_len) : 0; |
126 | STRLEN iv_len = 0; char *iv = IV ? SvPVbyte (IV, iv_len) : 0; |
110 | RETVAL = alloc_state (klass); |
127 | RETVAL = alloc_state (klass); |
111 | spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len); |
128 | spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len); |
112 | } |
129 | } |
113 | OUTPUT: |
130 | OUTPUT: |
114 | RETVAL |
131 | RETVAL |
115 | |
132 | |
|
|
133 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_ |
|
|
134 | |
|
|
135 | SV * |
|
|
136 | 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 | { |
|
|
154 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
155 | char *retval; |
|
|
156 | STRLEN slow_len = ix < 3 ? 4000 : 400; |
|
|
157 | RETVAL = alloc_pv (len); |
|
|
158 | 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 | } |
|
|
163 | OUTPUT: |
|
|
164 | RETVAL |
|
|
165 | |
116 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_ |
166 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_ |
117 | |
167 | |
118 | SV * |
168 | # crypt == Spritz::Cipher::crypt (xs-alias) |
119 | crypt (Crypt::Spritz self, SV *I) |
|
|
120 | CODE: |
|
|
121 | { |
|
|
122 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
123 | RETVAL = alloc_pv (len); |
|
|
124 | spritz_cipher_xor_crypt (self, ptr, SvPVX (RETVAL), len); |
|
|
125 | } |
|
|
126 | OUTPUT: |
|
|
127 | RETVAL |
|
|
128 | |
169 | |
129 | void |
170 | void |
130 | crypt_inplace (Crypt::Spritz self, SV *I) |
171 | crypt_inplace (Crypt::Spritz self, SV *I) |
131 | CODE: |
172 | CODE: |
132 | sv_force_normal (I); |
173 | sv_force_normal (I); |
133 | { |
174 | { |
134 | STRLEN len; char *ptr = SvPVbyte (I, len); |
175 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
176 | if (len > 4000) perlinterp_release (); |
135 | spritz_cipher_xor_crypt (self, ptr, ptr, len); |
177 | spritz_cipher_xor_crypt (self, ptr, ptr, len); |
|
|
178 | if (len > 4000) perlinterp_acquire (); |
136 | } |
179 | } |
137 | |
180 | |
138 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ |
181 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ |
139 | |
182 | |
140 | # new == Spritz::new (inherit) |
183 | # new == Spritz::new (inherit) |
141 | # add == absorb (alias) |
184 | # add == absorb (alias) |
142 | |
185 | |
143 | SV * |
186 | SV * |
144 | spritz_hash_finish (Crypt::Spritz self, STRLEN len) |
187 | spritz_hash_finish (Crypt::Spritz self, STRLEN len) |
145 | CODE: |
188 | CODE: |
|
|
189 | char *retval; |
146 | RETVAL = alloc_pv (len); |
190 | RETVAL = alloc_pv (len); |
147 | spritz_hash_finish (self, SvPVX (RETVAL), len); |
191 | spritz_hash_finish (self, SvPVX (RETVAL), len); |
148 | OUTPUT: |
192 | OUTPUT: |
149 | RETVAL |
193 | RETVAL |
150 | |
194 | |
… | |
… | |
162 | RETVAL |
206 | RETVAL |
163 | |
207 | |
164 | # add == Spritz::HASH::add (inherit) |
208 | # add == Spritz::HASH::add (inherit) |
165 | # finish == Spritz::HASH::finish (inherit) |
209 | # finish == Spritz::HASH::finish (inherit) |
166 | |
210 | |
167 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_xor_ |
211 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_ |
168 | |
212 | |
169 | # new == Spritz::MAC::new (inherit) |
213 | # new == Spritz::MAC::new (inherit) |
170 | # nonce == absorb_and_stop (alias) |
214 | # nonce == absorb_and_stop (alias) |
171 | # associated_data == 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) |
172 | # finish == Spritz::MAC::finish (alias) |
218 | # finish == Spritz::MAC::finish (alias) |
173 | |
219 | |
174 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_ |
220 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_ |
175 | |
221 | |
176 | # new == Spritz::MAC::new (inherit) |
222 | # new == Spritz::MAC::new (inherit) |
177 | # nonce == Spritz::AEAD::nonce (inherit) |
223 | # nonce == Spritz::AEAD::nonce (inherit) |
178 | # associated_data == Spritz::AEAD::associated_data (inherit) |
224 | # associated_data == Spritz::AEAD::associated_data (inherit) |
|
|
225 | # crypt == Spritz::Cipher::crypt (xs-alias) |
179 | # finish == Spritz::AEAD::finish (inherit) |
226 | # finish == Spritz::AEAD::finish (inherit) |
180 | |
|
|
181 | SV * |
|
|
182 | crypt (Crypt::Spritz self, SV *I) |
|
|
183 | CODE: |
|
|
184 | { |
|
|
185 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
186 | RETVAL = alloc_pv (len); |
|
|
187 | spritz_aead_xor_crypt (self, ptr, SvPVX (RETVAL), len); |
|
|
188 | } |
|
|
189 | OUTPUT: |
|
|
190 | RETVAL |
|
|
191 | |
227 | |
192 | void |
228 | void |
193 | crypt_inplace (Crypt::Spritz self, SV *I) |
229 | crypt_inplace (Crypt::Spritz self, SV *I) |
194 | CODE: |
230 | CODE: |
195 | sv_force_normal (I); |
231 | sv_force_normal (I); |
196 | { |
232 | { |
197 | STRLEN len; char *ptr = SvPVbyte (I, len); |
233 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
234 | if (len > 400) perlinterp_release (); |
198 | spritz_aead_xor_crypt (self, ptr, ptr, len); |
235 | spritz_aead_xor_crypt (self, ptr, ptr, len); |
|
|
236 | if (len > 400) perlinterp_acquire (); |
199 | } |
237 | } |
200 | |
238 | |
201 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ |
239 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ |
202 | |
240 | |
203 | SV * |
241 | SV * |