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 * |
… | |
… | |
36 | } |
38 | } |
37 | |
39 | |
38 | static spritz_state * |
40 | static spritz_state * |
39 | get_state (SV *sv) |
41 | get_state (SV *sv) |
40 | { |
42 | { |
41 | if (!sv_derived_from (sv, "Crypt::Spritz")) |
43 | if (!sv_derived_from (sv, "Crypt::Spritz::Base")) |
42 | croak ("object is not of type Crypt::Spritz"); |
44 | croak ("object is not of type Crypt::Spritz::Base"); |
43 | |
45 | |
44 | sv = SvRV (sv); |
46 | sv = SvRV (sv); |
45 | |
47 | |
46 | /* this can happen when the objhetc is serialised, which isn't officially supported */ |
48 | /* this can happen when the objhetc is serialised, which isn't officially supported */ |
47 | if (SvUTF8 (sv)) |
49 | if (SvUTF8 (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) |
… | |
… | |
97 | RETVAL = alloc_pv (len); |
114 | RETVAL = alloc_pv (len); |
98 | spritz_squeeze (self, SvPVX (RETVAL), len); |
115 | spritz_squeeze (self, SvPVX (RETVAL), len); |
99 | OUTPUT: |
116 | OUTPUT: |
100 | RETVAL |
117 | RETVAL |
101 | |
118 | |
|
|
119 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_xor_ |
|
|
120 | |
|
|
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 | STRLEN iv_len = 0; char *iv = IV ? SvPVbyte (IV, iv_len) : 0; |
|
|
127 | RETVAL = alloc_state (klass); |
|
|
128 | spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len); |
|
|
129 | } |
|
|
130 | OUTPUT: |
|
|
131 | RETVAL |
|
|
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 | |
102 | 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_ |
103 | |
167 | |
104 | SV * |
168 | # crypt == Spritz::Cipher::crypt (xs-alias) |
105 | new (SV *klass, SV *K, SV *IV = 0) |
|
|
106 | CODE: |
|
|
107 | { |
|
|
108 | STRLEN k_len ; char *k = SvPVbyte (K , k_len ); |
|
|
109 | STRLEN iv_len = 0; char *iv = iv ? SvPVbyte (IV, iv_len) : 0; |
|
|
110 | RETVAL = alloc_state (klass); |
|
|
111 | spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len); |
|
|
112 | } |
|
|
113 | OUTPUT: |
|
|
114 | RETVAL |
|
|
115 | |
|
|
116 | SV * |
|
|
117 | crypt (Crypt::Spritz self, SV *I) |
|
|
118 | CODE: |
|
|
119 | { |
|
|
120 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
121 | RETVAL = alloc_pv (len); |
|
|
122 | spritz_cipher_xor_crypt (self, ptr, SvPVX (RETVAL), len); |
|
|
123 | } |
|
|
124 | OUTPUT: |
|
|
125 | RETVAL |
|
|
126 | |
169 | |
127 | void |
170 | void |
128 | crypt_inplace (Crypt::Spritz self, SV *I) |
171 | crypt_inplace (Crypt::Spritz self, SV *I) |
129 | CODE: |
172 | CODE: |
130 | sv_force_normal (I); |
173 | sv_force_normal (I); |
131 | { |
174 | { |
132 | STRLEN len; char *ptr = SvPVbyte (I, len); |
175 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
176 | if (len > 4000) perlinterp_release (); |
133 | spritz_cipher_xor_crypt (self, ptr, ptr, len); |
177 | spritz_cipher_xor_crypt (self, ptr, ptr, len); |
|
|
178 | if (len > 4000) perlinterp_acquire (); |
134 | } |
179 | } |
135 | |
180 | |
136 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ |
181 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ |
137 | |
182 | |
138 | # new == Spritz::new (inherit) |
183 | # new == Spritz::new (inherit) |
139 | # add == absorb (alias) |
184 | # add == absorb (alias) |
140 | |
185 | |
141 | SV * |
186 | SV * |
142 | spritz_hash_finish (Crypt::Spritz self, STRLEN len) |
187 | spritz_hash_finish (Crypt::Spritz self, STRLEN len) |
143 | CODE: |
188 | CODE: |
|
|
189 | char *retval; |
144 | RETVAL = alloc_pv (len); |
190 | RETVAL = alloc_pv (len); |
145 | spritz_hash_finish (self, SvPVX (RETVAL), len); |
191 | spritz_hash_finish (self, SvPVX (RETVAL), len); |
146 | OUTPUT: |
192 | OUTPUT: |
147 | RETVAL |
193 | RETVAL |
148 | |
194 | |
… | |
… | |
160 | RETVAL |
206 | RETVAL |
161 | |
207 | |
162 | # add == Spritz::HASH::add (inherit) |
208 | # add == Spritz::HASH::add (inherit) |
163 | # finish == Spritz::HASH::finish (inherit) |
209 | # finish == Spritz::HASH::finish (inherit) |
164 | |
210 | |
|
|
211 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_ |
|
|
212 | |
|
|
213 | # 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 | |
165 | 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_ |
166 | |
221 | |
167 | # new == Spritz::MAC::new (inherit) |
222 | # new == Spritz::MAC::new (inherit) |
168 | # nonce == absorb_and_stop (alias) |
223 | # nonce == Spritz::AEAD::nonce (inherit) |
169 | # associated_data == absorb_and_stop (alias) |
224 | # associated_data == Spritz::AEAD::associated_data (inherit) |
|
|
225 | # crypt == Spritz::Cipher::crypt (xs-alias) |
170 | # finish == Spritz::MAC::finish (alias) |
226 | # finish == Spritz::AEAD::finish (inherit) |
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 | |
227 | |
183 | void |
228 | void |
184 | crypt_inplace (Crypt::Spritz self, SV *I) |
229 | crypt_inplace (Crypt::Spritz self, SV *I) |
185 | CODE: |
230 | CODE: |
186 | sv_force_normal (I); |
231 | sv_force_normal (I); |
187 | { |
232 | { |
188 | STRLEN len; char *ptr = SvPVbyte (I, len); |
233 | STRLEN len; char *ptr = SvPVbyte (I, len); |
|
|
234 | if (len > 400) perlinterp_release (); |
189 | spritz_aead_xor_crypt (self, ptr, ptr, len); |
235 | spritz_aead_xor_crypt (self, ptr, ptr, len); |
|
|
236 | if (len > 400) perlinterp_acquire (); |
190 | } |
237 | } |
191 | |
238 | |
192 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ |
239 | MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ |
193 | |
240 | |
194 | SV * |
241 | SV * |