ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
Revision: 1.7
Committed: Sat Jan 10 09:14:53 2015 UTC (9 years, 4 months ago) by root
Branch: MAIN
CVS Tags: rel-0_2
Changes since 1.6: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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 root 1.7 *SvEND (r) = 0;
26 root 1.1
27     return r;
28     }
29    
30     static SV *
31 root 1.2 alloc_state (SV *klass)
32 root 1.1 {
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 root 1.4 if (!sv_derived_from (sv, "Crypt::Spritz::Base"))
42     croak ("object is not of type Crypt::Spritz::Base");
43 root 1.1
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 root 1.5 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 root 1.1 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz PREFIX = spritz_
65    
66     PROTOTYPES: ENABLE
67    
68     SV *
69     new (SV *klass)
70     CODE:
71 root 1.2 RETVAL = alloc_state (klass);
72 root 1.1 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 root 1.2 absorb_and_stop = 1
91 root 1.1 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 root 1.4 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_xor_
114 root 1.1
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 root 1.2 RETVAL = alloc_state (klass);
122 root 1.1 spritz_cipher_xor_init ((spritz_state *)SvPVX (SvRV (RETVAL)), k, k_len, iv, iv_len);
123     }
124     OUTPUT:
125     RETVAL
126    
127 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher PREFIX = spritz_cipher_
128 root 1.4
129 root 1.1 SV *
130 root 1.6 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 root 1.1 {
148     STRLEN len; char *ptr = SvPVbyte (I, len);
149     RETVAL = alloc_pv (len);
150 root 1.6 f[ix](self, ptr, SvPVX (RETVAL), len);
151 root 1.1 }
152     OUTPUT:
153     RETVAL
154    
155 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_
156    
157     # crypt == Spritz::Cipher::crypt (xs-alias)
158    
159 root 1.1 void
160     crypt_inplace (Crypt::Spritz self, SV *I)
161     CODE:
162 root 1.3 sv_force_normal (I);
163 root 1.1 {
164     STRLEN len; char *ptr = SvPVbyte (I, len);
165     spritz_cipher_xor_crypt (self, ptr, ptr, len);
166     }
167    
168 root 1.2 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_
169 root 1.1
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 root 1.2 RETVAL = alloc_state (klass);
189 root 1.1 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 root 1.6 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD PREFIX = spritz_aead_
198 root 1.1
199 root 1.6 # 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 root 1.1
206 root 1.4 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 root 1.6 # crypt == Spritz::Cipher::crypt (xs-alias)
212 root 1.4 # finish == Spritz::AEAD::finish (inherit)
213    
214 root 1.1 void
215     crypt_inplace (Crypt::Spritz self, SV *I)
216     CODE:
217 root 1.3 sv_force_normal (I);
218 root 1.1 {
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 root 1.2 RETVAL = alloc_state (klass);
231 root 1.1 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