ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
(Generate patch)

Comparing Crypt-Spritz/Spritz.xs (file contents):
Revision 1.3 by root, Sat Jan 10 04:56:38 2015 UTC vs.
Revision 1.9 by root, Tue Jun 30 01:24:43 2015 UTC

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
7typedef spritz_state *Crypt__Spritz; 9typedef 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
30static SV * 32static SV *
36} 38}
37 39
38static spritz_state * 40static spritz_state *
39get_state (SV *sv) 41get_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
55MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Base
56
57SV *
58clone (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
53MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_ 66MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_
54 67
55PROTOTYPES: ENABLE 68PROTOTYPES: ENABLE
56 69
57SV * 70SV *
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
90U8 spritz_output (Crypt::Spritz self) 107U8 spritz_output (Crypt::Spritz self)
91 108
92U8 spritz_drip (Crypt::Spritz self) 109U8 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
119MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_xor_
120
121SV *
122new (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
133MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_
134
135SV *
136encrypt (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
102MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_ 166MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_
103 167
104SV * 168# crypt == Spritz::Cipher::crypt (xs-alias)
105new (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
116SV *
117crypt (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
127void 170void
128crypt_inplace (Crypt::Spritz self, SV *I) 171crypt_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
136MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ 181MODULE = 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
141SV * 186SV *
142spritz_hash_finish (Crypt::Spritz self, STRLEN len) 187spritz_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
211MODULE = 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
165MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_ 220MODULE = 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
172SV *
173crypt (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
183void 228void
184crypt_inplace (Crypt::Spritz self, SV *I) 229crypt_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
192MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ 239MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_
193 240
194SV * 241SV *

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines