ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
Revision: 1.6
Committed: Sat Jan 10 08:29:06 2015 UTC (9 years, 4 months ago) by root
Branch: MAIN
Changes since 1.5: +31 -20 lines
Log Message:
*** empty log message ***

File Contents

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