ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Spritz/Spritz.xs
Revision: 1.3
Committed: Sat Jan 10 04:56:38 2015 UTC (9 years, 4 months ago) by root
Branch: MAIN
Changes since 1.2: +2 -0 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"))
42 croak ("object is not of type Crypt::Spritz");
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 PREFIX = spritz_
54
55 PROTOTYPES: ENABLE
56
57 SV *
58 new (SV *klass)
59 CODE:
60 RETVAL = alloc_state (klass);
61 spritz_init ((spritz_state *)SvPVX (SvRV (RETVAL)));
62 OUTPUT:
63 RETVAL
64
65 void spritz_init (Crypt::Spritz self)
66
67 void spritz_update (Crypt::Spritz self)
68
69 void spritz_whip (Crypt::Spritz self, UV r)
70
71 void spritz_crush (Crypt::Spritz self)
72
73 void spritz_shuffle (Crypt::Spritz self)
74
75 void spritz_absorb_stop (Crypt::Spritz self)
76
77 void spritz_absorb (Crypt::Spritz self, SV *data)
78 ALIAS:
79 absorb_and_stop = 1
80 CODE:
81 {
82 STRLEN len; char *ptr = SvPVbyte (data, len);
83
84 spritz_absorb (self, ptr, len);
85
86 if (ix)
87 spritz_absorb_stop (self);
88 }
89
90 U8 spritz_output (Crypt::Spritz self)
91
92 U8 spritz_drip (Crypt::Spritz self)
93
94 SV *
95 spritz_squeeze (Crypt::Spritz self, STRLEN len)
96 CODE:
97 RETVAL = alloc_pv (len);
98 spritz_squeeze (self, SvPVX (RETVAL), len);
99 OUTPUT:
100 RETVAL
101
102 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Cipher::XOR PREFIX = spritz_cipher_xor_
103
104 SV *
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
127 void
128 crypt_inplace (Crypt::Spritz self, SV *I)
129 CODE:
130 sv_force_normal (I);
131 {
132 STRLEN len; char *ptr = SvPVbyte (I, len);
133 spritz_cipher_xor_crypt (self, ptr, ptr, len);
134 }
135
136 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::Hash PREFIX = spritz_hash_
137
138 # new == Spritz::new (inherit)
139 # add == absorb (alias)
140
141 SV *
142 spritz_hash_finish (Crypt::Spritz self, STRLEN len)
143 CODE:
144 RETVAL = alloc_pv (len);
145 spritz_hash_finish (self, SvPVX (RETVAL), len);
146 OUTPUT:
147 RETVAL
148
149 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::MAC PREFIX = spritz_mac_
150
151 SV *
152 new (SV *klass, SV *K)
153 CODE:
154 {
155 STRLEN len; char *ptr = SvPVbyte (K, len);
156 RETVAL = alloc_state (klass);
157 spritz_mac_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
158 }
159 OUTPUT:
160 RETVAL
161
162 # add == Spritz::HASH::add (inherit)
163 # finish == Spritz::HASH::finish (inherit)
164
165 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::AEAD::XOR PREFIX = spritz_aead_xor_
166
167 # new == Spritz::MAC::new (inherit)
168 # nonce == absorb_and_stop (alias)
169 # associated_data == absorb_and_stop (alias)
170 # finish == Spritz::MAC::finish (alias)
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
183 void
184 crypt_inplace (Crypt::Spritz self, SV *I)
185 CODE:
186 sv_force_normal (I);
187 {
188 STRLEN len; char *ptr = SvPVbyte (I, len);
189 spritz_aead_xor_crypt (self, ptr, ptr, len);
190 }
191
192 MODULE = Crypt::Spritz PACKAGE = Crypt::Spritz::PRNG PREFIX = spritz_prng_
193
194 SV *
195 new (SV *klass, SV *S = 0)
196 CODE:
197 {
198 STRLEN len = 0; char *ptr = S ? SvPVbyte (S, len) : 0;
199 RETVAL = alloc_state (klass);
200 spritz_prng_init ((spritz_state *)SvPVX (SvRV (RETVAL)), ptr, len);
201 }
202 OUTPUT:
203 RETVAL
204
205 # add == absorb (alias)
206 # get == squeeze (alias)
207