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.4 by root, Sat Jan 10 07:10:46 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 *
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)
104SV * 121SV *
105new (SV *klass, SV *K, SV *IV = 0) 122new (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
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
116MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_ 166MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_
117 167
118SV * 168# crypt == Spritz::Cipher::crypt (xs-alias)
119crypt (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
129void 170void
130crypt_inplace (Crypt::Spritz self, SV *I) 171crypt_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
138MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_ 181MODULE = 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
143SV * 186SV *
144spritz_hash_finish (Crypt::Spritz self, STRLEN len) 187spritz_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
167MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_xor_ 211MODULE = 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
174MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_ 220MODULE = 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
181SV *
182crypt (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
192void 228void
193crypt_inplace (Crypt::Spritz self, SV *I) 229crypt_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
201MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_ 239MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_
202 240
203SV * 241SV *

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines