Codebase list libcryptx-perl / upstream/0.059
New upstream version 0.059 gregor herrmann 5 years ago
334 changed file(s) with 11496 addition(s) and 7956 deletion(s). Raw diff Collapse all Expand all
00 Changes for CryptX
1
2 0.059 2018-03-25
3 - new Crypt::Digest::Keccak(224|256|384|512)
4 - new methods sign_hash_rfc7518 + verify_hash_rfc7518 (Crypt::PK::ECC)
5 - improved import of pkcs#8 private keys (Crypt::PK::ECC)
6 - improved export allowing "compressed" variants (Crypt::PK::ECC)
7 - fix #28 Apple's APNS pkcs8 auth key import fails (Crypt::PK::ECC)
8 - fix cpantesters failure (5.8.1 related)
9
10 0.058 2018-02-27
11 - fix: decode_b58b + invalid input
12
13 0.057 2018-01-31
14 - significant speed-up (more stuff handled on XS level)
15 - Crypt::Checksum is deprecated in favour of Crypt::Checksum::Adler32|CRC32
116
217 0.056 2017-12-22
318 - new Crypt::Stream::Rabbit
0 #define PERL_NO_GET_CONTEXT /* we want efficiency */
01 #include "EXTERN.h"
12 #include "perl.h"
23 #include "XSUB.h"
67 #define NEED_newRV_noinc_GLOBAL
78 #include "ppport.h"
89
10 /* assert_not_ROK is broken in 5.8.1 */
11 #if PERL_VERSION == 8 && PERL_SUBVERSION == 1
12 # undef assert_not_ROK
13 # if defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
14 # define assert_not_ROK(sv) ({assert(!SvROK(sv) || !SvRV(sv));}),
15 # else
16 # define assert_not_ROK(sv)
17 # endif
18 #endif
19
920 #undef LTC_SOURCE
1021 #include "tomcrypt.h"
1122 #include "tommath.h"
1223
13 typedef adler32_state *Crypt__Checksum__Adler32;
14 typedef crc32_state *Crypt__Checksum__CRC32;
24 typedef adler32_state *Crypt__Checksum__Adler32;
25 typedef crc32_state *Crypt__Checksum__CRC32;
26
27 typedef ccm_state *Crypt__AuthEnc__CCM;
28 typedef eax_state *Crypt__AuthEnc__EAX;
29 typedef gcm_state *Crypt__AuthEnc__GCM;
30 typedef chacha20poly1305_state *Crypt__AuthEnc__ChaCha20Poly1305;
31 typedef ocb3_state *Crypt__AuthEnc__OCB;
32
33 typedef chacha_state *Crypt__Stream__ChaCha;
34 typedef salsa20_state *Crypt__Stream__Salsa20;
35 typedef sosemanuk_state *Crypt__Stream__Sosemanuk;
36 typedef rabbit_state *Crypt__Stream__Rabbit;
37 typedef rc4_state *Crypt__Stream__RC4;
38 typedef sober128_state *Crypt__Stream__Sober128;
39
40 typedef f9_state *Crypt__Mac__F9;
41 typedef hmac_state *Crypt__Mac__HMAC;
42 typedef omac_state *Crypt__Mac__OMAC;
43 typedef pelican_state *Crypt__Mac__Pelican;
44 typedef pmac_state *Crypt__Mac__PMAC;
45 typedef xcbc_state *Crypt__Mac__XCBC;
46 typedef poly1305_state *Crypt__Mac__Poly1305;
47 typedef blake2smac_state *Crypt__Mac__BLAKE2s;
48 typedef blake2bmac_state *Crypt__Mac__BLAKE2b;
1549
1650 typedef struct cipher_struct { /* used by Crypt::Cipher */
1751 symmetric_key skey;
18 int id;
1952 struct ltc_cipher_descriptor *desc;
2053 } *Crypt__Cipher;
2154
2255 typedef struct digest_struct { /* used by Crypt::Digest */
2356 hash_state state;
24 int id;
2557 struct ltc_hash_descriptor *desc;
2658 } *Crypt__Digest;
2759
2961 hash_state state;
3062 int num;
3163 } *Crypt__Digest__SHAKE;
32
33 typedef struct ccm_struct { /* used by Crypt::AuthEnc::CCM */
34 ccm_state state;
35 int direction;
36 int tag_len;
37 unsigned long pt_len;
38 int id;
39 } *Crypt__AuthEnc__CCM;
40
41 typedef struct eax_struct { /* used by Crypt::AuthEnc::EAX */
42 eax_state state;
43 int id;
44 } *Crypt__AuthEnc__EAX;
45
46 typedef struct gcm_struct { /* used by Crypt::AuthEnc::GCM */
47 gcm_state state;
48 int id;
49 } *Crypt__AuthEnc__GCM;
50
51 typedef struct chacha20poly1305_struct {/* used by Crypt::AuthEnc::ChaCha20Poly1305 */
52 chacha20poly1305_state state;
53 int id;
54 } *Crypt__AuthEnc__ChaCha20Poly1305;
55
56 typedef struct ocb_struct { /* used by Crypt::AuthEnc::OCB */
57 ocb3_state state;
58 int id;
59 } *Crypt__AuthEnc__OCB;
60
61 typedef struct chacha_struct { /* used by Crypt::Stream::ChaCha */
62 chacha_state state;
63 int id;
64 } *Crypt__Stream__ChaCha;
65
66 typedef struct salsa20_struct { /* used by Crypt::Stream::Salsa20 */
67 salsa20_state state;
68 int id;
69 } *Crypt__Stream__Salsa20;
70
71 typedef struct sosemanuk_struct { /* used by Crypt::Stream::Sosemanuk */
72 sosemanuk_state state;
73 int id;
74 } *Crypt__Stream__Sosemanuk;
75
76 typedef struct rabbit_struct { /* used by Crypt::Stream::Rabbit */
77 rabbit_state state;
78 int id;
79 } *Crypt__Stream__Rabbit;
80
81 typedef struct rc4_struct { /* used by Crypt::Stream::RC4 */
82 rc4_state state;
83 int id;
84 } *Crypt__Stream__RC4;
85
86 typedef struct sober128_struct { /* used by Crypt::Stream::Sober128 */
87 sober128_state state;
88 int id;
89 } *Crypt__Stream__Sober128;
90
91 typedef struct f9_struct { /* used by Crypt::Mac::F9 */
92 f9_state state;
93 int id;
94 } *Crypt__Mac__F9;
95
96 typedef struct hmac_struct { /* used by Crypt::Mac::HMAC */
97 hmac_state state;
98 int id;
99 } *Crypt__Mac__HMAC;
100
101 typedef struct omac_struct { /* used by Crypt::Mac::OMAC */
102 omac_state state;
103 int id;
104 } *Crypt__Mac__OMAC;
105
106 typedef struct pelican_struct { /* used by Crypt::Mac::Pelican */
107 pelican_state state;
108 int id;
109 } *Crypt__Mac__Pelican;
110
111 typedef struct pmac_struct { /* used by Crypt::Mac::PMAC */
112 pmac_state state;
113 int id;
114 } *Crypt__Mac__PMAC;
115
116 typedef struct xcbc_struct { /* used by Crypt::Mac::XCBC */
117 xcbc_state state;
118 int id;
119 } *Crypt__Mac__XCBC;
120
121 typedef struct poly1305_struct { /* used by Crypt::Mac::Poly1305 */
122 poly1305_state state;
123 int id;
124 } *Crypt__Mac__Poly1305;
125
126 typedef struct blake2s_struct { /* used by Crypt::Mac::BLAKE2s */
127 blake2smac_state state;
128 int id;
129 } *Crypt__Mac__BLAKE2s;
130
131 typedef struct blake2b_struct { /* used by Crypt::Mac::BLAKE2b */
132 blake2bmac_state state;
133 int id;
134 } *Crypt__Mac__BLAKE2b;
13564
13665 typedef struct cbc_struct { /* used by Crypt::Mode::CBC */
13766 int cipher_id, cipher_rounds;
14069 int padlen;
14170 int padding_mode;
14271 int direction;
143 int id;
14472 } *Crypt__Mode__CBC;
14573
14674 typedef struct ecb_struct { /* used by Crypt::Mode::ECB */
15078 int padlen;
15179 int padding_mode;
15280 int direction;
153 int id;
15481 } *Crypt__Mode__ECB;
15582
15683 typedef struct cfb_struct { /* used by Crypt::Mode::CFB */
15784 int cipher_id, cipher_rounds;
15885 symmetric_CFB state;
15986 int direction;
160 int id;
16187 } *Crypt__Mode__CFB;
16288
16389 typedef struct ctr_struct { /* used by Crypt::Mode::CTR */
16591 int ctr_mode_param;
16692 symmetric_CTR state;
16793 int direction;
168 int id;
16994 } *Crypt__Mode__CTR;
17095
17196 typedef struct f8_struct { /* used by Crypt::Mode::F8 */
17297 int cipher_id, cipher_rounds;
17398 symmetric_F8 state;
17499 int direction;
175 int id;
176100 } *Crypt__Mode__F8;
177101
178102 typedef struct lrw_struct { /* used by Crypt::Mode::LRW */
179103 int cipher_id, cipher_rounds;
180104 symmetric_LRW state;
181105 int direction;
182 int id;
183106 } *Crypt__Mode__LRW;
184107
185108 typedef struct ofb_struct { /* used by Crypt::Mode::OFB */
186109 int cipher_id, cipher_rounds;
187110 symmetric_OFB state;
188111 int direction;
189 int id;
190112 } *Crypt__Mode__OFB;
191113
192114 typedef struct xts_struct { /* used by Crypt::Mode::XTS */
193115 int cipher_id, cipher_rounds;
194116 symmetric_xts state;
195117 int direction;
196 int id;
197118 } *Crypt__Mode__XTS;
198119
199120 typedef struct prng_struct { /* used by Crypt::PRNG */
200121 prng_state state;
201122 struct ltc_prng_descriptor *desc;
202123 IV last_pid;
203 int id;
204124 } *Crypt__PRNG;
205125
206126 typedef struct rsa_struct { /* used by Crypt::PK::RSA */
207127 prng_state pstate;
208128 int pindex;
209129 rsa_key key;
210 int id;
211130 } *Crypt__PK__RSA;
212131
213132 typedef struct dsa_struct { /* used by Crypt::PK::DSA */
214133 prng_state pstate;
215134 int pindex;
216135 dsa_key key;
217 int id;
218136 } *Crypt__PK__DSA;
219137
220138 typedef struct dh_struct { /* used by Crypt::PK::DH */
221139 prng_state pstate;
222140 int pindex;
223141 dh_key key;
224 int id;
225142 } *Crypt__PK__DH;
226143
227144 typedef struct ecc_struct { /* used by Crypt::PK::ECC */
228145 prng_state pstate;
229146 int pindex;
230147 ecc_key key;
231 ltc_ecc_set_type dp;
232 int id;
233148 } *Crypt__PK__ECC;
234149
235 int str_add_leading_zero(char *str, int maxlen, int minlen) {
236 int len;
150 int mp_tohex_with_leading_zero(mp_int * a, char *str, int maxlen, int minlen) {
151 int len, rv;
152
153 if (mp_isneg(a) == MP_YES) {
154 *str = '\0';
155 return MP_VAL;
156 }
157
158 rv = mp_toradix_n(a, str, 16, maxlen);
159 if (rv != MP_OKAY) {
160 *str = '\0';
161 return rv;
162 }
163
237164 len = (int)strlen(str);
238165 if (len > 0 && len % 2 && len < maxlen-2) {
239166 memmove(str+1, str, len+1); /* incl. NUL byte */
240167 *str = '0'; /* add leading zero */
241168 }
169
242170 len = (int)strlen(str);
243171 if (len < minlen && minlen < maxlen-1) {
244172 memmove(str+(minlen-len), str, len+1); /* incl. NUL byte */
245173 memset(str, '0', minlen-len); /* add leading zero */
246174 }
175
247176 return MP_OKAY;
248177 }
249178
250 int mp_tohex_with_leading_zero(mp_int * a, char *str, int maxlen, int minlen) {
251 int rv;
252 if (mp_isneg(a) == MP_YES) {
253 *str = '\0';
254 return MP_VAL;
255 }
256 rv = mp_toradix_n(a, str, 16, maxlen);
257 if (rv != MP_OKAY) {
258 *str = '\0';
259 return rv;
260 }
261 return str_add_leading_zero(str, maxlen, minlen);
179 int _base16_encode(const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen)
180 {
181 unsigned long i;
182 const char alphabet[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
183
184 if (*outlen < inlen * 2) {
185 *outlen = inlen * 2;
186 return CRYPT_BUFFER_OVERFLOW;
187 }
188
189 for (i = 0; i < inlen; i++) {
190 out[i*2] = (unsigned char)alphabet[in[i] >> 4];
191 out[i*2+1] = (unsigned char)alphabet[in[i] & 0xF];
192 }
193
194 *outlen = inlen * 2;
195 return CRYPT_OK;
196 }
197
198 size_t _find_start(const char *name, char *ltcname, size_t ltclen)
199 {
200 size_t i, start = 0;
201 if (name == NULL || strlen(name) + 1 > ltclen) croak("FATAL: invalid name") ;
202 /* normalize */
203 for (i = 0; i < ltclen && name[i] > 0; i++) {
204 if (name[i] >= 'A' && name[i] <= 'Z') {
205 ltcname[i] = name[i] + 32; /* lowecase */
206 }
207 else if (name[i] == '_') {
208 ltcname[i] = '-';
209 }
210 else {
211 ltcname[i] = name[i];
212 }
213 if (name[i] == ':') start = i + 1;
214 }
215 return start;
216 }
217
218 int _find_hash(const char *name)
219 {
220 char ltcname[100] = { 0 };
221 size_t start = _find_start(name, ltcname, sizeof(ltcname) - 1);
222 /* special cases */
223 if (strcmp(ltcname + start, "ripemd128") == 0) return find_hash("rmd128");
224 if (strcmp(ltcname + start, "ripemd160") == 0) return find_hash("rmd160");
225 if (strcmp(ltcname + start, "ripemd256") == 0) return find_hash("rmd256");
226 if (strcmp(ltcname + start, "ripemd320") == 0) return find_hash("rmd320");
227 if (strcmp(ltcname + start, "tiger192") == 0) return find_hash("tiger");
228 if (strcmp(ltcname + start, "chaes") == 0) return find_hash("chc_hash");
229 if (strcmp(ltcname + start, "chc-hash") == 0) return find_hash("chc_hash");
230 return find_hash(ltcname + start);
231 }
232
233 int _find_cipher(const char *name)
234 {
235 char ltcname[100] = { 0 };
236 size_t start = _find_start(name, ltcname, sizeof(ltcname) - 1);
237 /* special cases */
238 if (strcmp(ltcname + start, "des-ede") == 0) return find_cipher("3des");
239 if (strcmp(ltcname + start, "saferp") == 0) return find_cipher("safer+");
240 return find_cipher(ltcname + start);
241 }
242
243 int _find_prng(const char *name)
244 {
245 char ltcname[100] = { 0 };
246 size_t start = _find_start(name, ltcname, sizeof(ltcname) - 1);
247 return find_prng(ltcname + start);
262248 }
263249
264250 /* Math::BigInt::LTM related */
265251 typedef mp_int * Math__BigInt__LTM;
266252 STATIC SV * sv_from_mpi(mp_int *mpi) {
253 dTHX; /* fetch context */
267254 SV *obj = newSV(0);
268255 sv_setref_pv(obj, "Math::BigInt::LTM", (void*)mpi);
269256 return obj;
270257 }
271258
272 ltc_ecc_set_type* _ecc_set_dp_from_SV(ltc_ecc_set_type *dp, SV *curve)
259 void _ecc_oid_lookup(ecc_key *key)
273260 {
274 HV *h;
275 SV *param, **pref;
276 SV **sv_cofactor, **sv_prime, **sv_A, **sv_B, **sv_order, **sv_Gx, **sv_Gy;
261 int err;
262 unsigned i;
263 void *tmp;
264 const ltc_ecc_set_type *set;
265
266 key->dp.oidlen = 0;
267 if ((err = ltc_mp.init(&tmp)) != CRYPT_OK) return;
268 for (set = ltc_ecc_sets; set->name != NULL; set++) {
269 if ((err = mp_read_radix(tmp, set->prime, 16)) != CRYPT_OK) continue;
270 if ((mp_cmp(tmp, key->dp.prime) != LTC_MP_EQ)) continue;
271 if ((err = mp_read_radix(tmp, set->order, 16)) != CRYPT_OK) continue;
272 if ((mp_cmp(tmp, key->dp.order) != LTC_MP_EQ)) continue;
273 if ((err = mp_read_radix(tmp, set->A, 16)) != CRYPT_OK) continue;
274 if ((mp_cmp(tmp, key->dp.A) != LTC_MP_EQ)) continue;
275 if ((err = mp_read_radix(tmp, set->B, 16)) != CRYPT_OK) continue;
276 if ((mp_cmp(tmp, key->dp.B) != LTC_MP_EQ)) continue;
277 if ((err = mp_read_radix(tmp, set->Gx, 16)) != CRYPT_OK) continue;
278 if ((mp_cmp(tmp, key->dp.base.x) != LTC_MP_EQ)) continue;
279 if ((err = mp_read_radix(tmp, set->Gy, 16)) != CRYPT_OK) continue;
280 if ((mp_cmp(tmp, key->dp.base.y) != LTC_MP_EQ)) continue;
281 if (key->dp.cofactor != set->cofactor) continue;
282 break; /* found */
283 }
284 ltc_mp.deinit(tmp);
285 if (set->name != NULL) {
286 key->dp.oidlen = set->oidlen;
287 for(i = 0; i < set->oidlen; i++) key->dp.oid[i] = set->oid[i];
288 }
289 }
290
291 int _ecc_set_dp_from_SV(ecc_key *key, SV *curve)
292 {
293 dTHX; /* fetch context */
294 HV *hc, *hl, *h;
295 SV *sv_crv, **pref;
296 SV **sv_cofactor, **sv_prime, **sv_A, **sv_B, **sv_order, **sv_Gx, **sv_Gy, **sv_oid;
297 char *ch_name;
298 STRLEN l_name, i, j;
277299 int err;
278 char *ch_name;
279 STRLEN l_name;
300
301 if (!SvOK(curve)) croak("FATAL: undefined curve");
280302
281303 if (SvPOK(curve)) {
304 /* string */
282305 ch_name = SvPV(curve, l_name);
283 if ((h = get_hv("Crypt::PK::ECC::curve", 0)) == NULL) croak("FATAL: generate_key_ex: no curve register");
284 if ((pref = hv_fetch(h, ch_name, (U32)l_name, 0)) == NULL) croak("FATAL: generate_key_ex: unknown curve/1 '%s'", ch_name);
285 if (!SvOK(*pref)) croak("FATAL: generate_key_ex: unknown curve/2 '%s'", ch_name);
286 param = *pref;
306 if ((hl = get_hv("Crypt::PK::ECC::curve2ltc", 0)) == NULL) croak("FATAL: no curve2ltc register");
307 pref = hv_fetch(hl, ch_name, (U32)l_name, 0);
308 if (pref && SvOK(*pref)) {
309 sv_crv = *pref; /* found in %cutve2ltc */
310 }
311 else {
312 if ((hc = get_hv("Crypt::PK::ECC::curve", 0)) == NULL) croak("FATAL: no curve register");
313 pref = hv_fetch(hc, ch_name, (U32)l_name, 0);
314 if (pref && SvOK(*pref)) {
315 sv_crv = *pref; /* found in %curve */
316 }
317 else {
318 sv_crv = curve;
319 }
320 }
287321 }
288322 else if (SvROK(curve)) {
289 param = curve;
323 /* hashref */
324 sv_crv = curve;
290325 }
291326 else {
292327 croak("FATAL: curve has to be a string or a hashref");
293328 }
294329
295 if ((h = (HV*)(SvRV(param))) == NULL) croak("FATAL: ecparams: param is not valid hashref");
296
297 if ((sv_prime = hv_fetchs(h, "prime", 0)) == NULL) croak("FATAL: ecparams: missing param prime");
298 if ((sv_A = hv_fetchs(h, "A", 0)) == NULL) croak("FATAL: ecparams: missing param A");
299 if ((sv_B = hv_fetchs(h, "B", 0)) == NULL) croak("FATAL: ecparams: missing param B");
300 if ((sv_order = hv_fetchs(h, "order", 0)) == NULL) croak("FATAL: ecparams: missing param order");
301 if ((sv_Gx = hv_fetchs(h, "Gx", 0)) == NULL) croak("FATAL: ecparams: missing param Gx");
302 if ((sv_Gy = hv_fetchs(h, "Gy", 0)) == NULL) croak("FATAL: ecparams: missing param Gy");
303 if ((sv_cofactor = hv_fetchs(h, "cofactor", 0)) == NULL) croak("FATAL: ecparams: missing param cofactor");
304
305 if (!SvOK(*sv_prime )) croak("FATAL: ecparams: undefined param prime");
306 if (!SvOK(*sv_A )) croak("FATAL: ecparams: undefined param A");
307 if (!SvOK(*sv_B )) croak("FATAL: ecparams: undefined param B");
308 if (!SvOK(*sv_order )) croak("FATAL: ecparams: undefined param order");
309 if (!SvOK(*sv_Gx )) croak("FATAL: ecparams: undefined param Gx");
310 if (!SvOK(*sv_Gy )) croak("FATAL: ecparams: undefined param Gy");
311 if (!SvOK(*sv_cofactor)) croak("FATAL: ecparams: undefined param cofactor");
312
313 err = ecc_dp_set( dp,
314 SvPV_nolen(*sv_prime),
315 SvPV_nolen(*sv_A),
316 SvPV_nolen(*sv_B),
317 SvPV_nolen(*sv_order),
318 SvPV_nolen(*sv_Gx),
319 SvPV_nolen(*sv_Gy),
320 (unsigned long)SvUV(*sv_cofactor),
321 NULL, /* we intentionally don't allow setting custom names */
322 NULL /* we intentionally don't allow setting custom OIDs */
323 );
324 return err == CRYPT_OK ? dp : NULL;
325 }
326
327 void _ecc_free_key(ecc_key *key, ltc_ecc_set_type *dp)
328 {
329 if(dp) {
330 ecc_dp_clear(dp);
331 }
332 if (key->type != -1) {
333 ecc_free(key);
334 key->type = -1;
335 key->dp = NULL;
330 if (SvPOK(sv_crv)) {
331 /* string - curve name */
332 const ltc_ecc_set_type *dp;
333 ch_name = SvPV(sv_crv, l_name);
334 if (ecc_get_set_by_name(ch_name, &dp) != CRYPT_OK) croak("FATAL: ecparams: unknown curve '%s'", ch_name);
335 return ecc_set_dp(dp, key);
336 }
337 else {
338 /* hashref */
339 ltc_ecc_set_type set = { 0 };
340
341 if ((h = (HV*)(SvRV(sv_crv))) == NULL) croak("FATAL: ecparams: param is not valid hashref");
342
343 if ((sv_prime = hv_fetchs(h, "prime", 0)) == NULL) croak("FATAL: ecparams: missing param prime");
344 if ((sv_A = hv_fetchs(h, "A", 0)) == NULL) croak("FATAL: ecparams: missing param A");
345 if ((sv_B = hv_fetchs(h, "B", 0)) == NULL) croak("FATAL: ecparams: missing param B");
346 if ((sv_order = hv_fetchs(h, "order", 0)) == NULL) croak("FATAL: ecparams: missing param order");
347 if ((sv_Gx = hv_fetchs(h, "Gx", 0)) == NULL) croak("FATAL: ecparams: missing param Gx");
348 if ((sv_Gy = hv_fetchs(h, "Gy", 0)) == NULL) croak("FATAL: ecparams: missing param Gy");
349 if ((sv_cofactor = hv_fetchs(h, "cofactor", 0)) == NULL) croak("FATAL: ecparams: missing param cofactor");
350
351 if (!SvOK(*sv_prime )) croak("FATAL: ecparams: undefined param prime");
352 if (!SvOK(*sv_A )) croak("FATAL: ecparams: undefined param A");
353 if (!SvOK(*sv_B )) croak("FATAL: ecparams: undefined param B");
354 if (!SvOK(*sv_order )) croak("FATAL: ecparams: undefined param order");
355 if (!SvOK(*sv_Gx )) croak("FATAL: ecparams: undefined param Gx");
356 if (!SvOK(*sv_Gy )) croak("FATAL: ecparams: undefined param Gy");
357 if (!SvOK(*sv_cofactor)) croak("FATAL: ecparams: undefined param cofactor");
358
359 set.prime = SvPV_nolen(*sv_prime);
360 set.A = SvPV_nolen(*sv_A);
361 set.B = SvPV_nolen(*sv_B);
362 set.order = SvPV_nolen(*sv_order);
363 set.Gx = SvPV_nolen(*sv_Gx);
364 set.Gy = SvPV_nolen(*sv_Gy);
365 set.cofactor = (unsigned long)SvUV(*sv_cofactor),
366 set.name = NULL;
367 set.oidlen = 0;
368
369 sv_oid = hv_fetchs(h, "oid", 0);
370 if (sv_oid && SvPOK(*sv_oid)) {
371 ch_name = SvPV(*sv_oid, l_name);
372 for (i = 0, j = 0; i < l_name; i++) {
373 if (ch_name[i] == '.') {
374 if (++j >= 16) return CRYPT_ERROR;
375 }
376 else if(ch_name[i] >= '0' && ch_name[i] <= '9') {
377 set.oid[j] = set.oid[j] * 10 + (ch_name[i] - '0');
378 }
379 else {
380 return CRYPT_ERROR;
381 }
382 }
383 if (j == 0) return CRYPT_ERROR;
384 set.oidlen = j + 1;
385 }
386
387 if ((err = ecc_set_dp(&set, key)) != CRYPT_OK) return err;
388 if (key->dp.oidlen == 0) _ecc_oid_lookup(key);
389 return CRYPT_OK;
336390 }
337391 }
338392
347401 if(crypt_mp_init("ltm") != CRYPT_OK) { croak("FATAL: crypt_mp_init failed"); }
348402
349403 SV *
350 CryptX__encode_base64url(SV * in)
351 CODE:
352 {
353 STRLEN in_len;
354 unsigned long out_len;
355 unsigned char *out_data, *in_data;
356
357 if (!SvPOK(in)) XSRETURN_UNDEF;
358 in_data = (unsigned char *) SvPVbyte(in, in_len);
359 if (in_len == 0) {
360 RETVAL = newSVpvn("", 0);
361 }
362 else {
363 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
364 RETVAL = NEWSV(0, out_len);
365 SvPOK_only(RETVAL);
366 out_data = (unsigned char *)SvPVX(RETVAL);
367 if (base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
368 SvREFCNT_dec(RETVAL);
369 XSRETURN_UNDEF;
370 }
371 SvCUR_set(RETVAL, out_len);
372 }
373 }
374 OUTPUT:
375 RETVAL
376
377 SV *
378 CryptX__decode_base64url(SV * in)
379 CODE:
380 {
381 STRLEN in_len;
382 unsigned long out_len;
383 unsigned char *out_data, *in_data;
384
385 if (!SvPOK(in)) XSRETURN_UNDEF;
386 in_data = (unsigned char *) SvPVbyte(in, in_len);
387 if (in_len == 0) {
388 RETVAL = newSVpvn("", 0);
389 }
390 else {
391 out_len = (unsigned long)in_len;
392 RETVAL = NEWSV(0, out_len);
393 SvPOK_only(RETVAL);
394 out_data = (unsigned char *)SvPVX(RETVAL);
395 if (base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
396 SvREFCNT_dec(RETVAL);
397 XSRETURN_UNDEF;
398 }
399 SvCUR_set(RETVAL, out_len);
400 }
401 }
402 OUTPUT:
403 RETVAL
404
405 SV *
406 CryptX__encode_base64(SV * in)
407 CODE:
408 {
409 STRLEN in_len;
410 unsigned long out_len;
411 unsigned char *out_data, *in_data;
412
413 if (!SvPOK(in)) XSRETURN_UNDEF;
414 in_data = (unsigned char *) SvPVbyte(in, in_len);
415 if (in_len == 0) {
416 RETVAL = newSVpvn("", 0);
417 }
418 else {
419 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
420 RETVAL = NEWSV(0, out_len);
421 SvPOK_only(RETVAL);
422 out_data = (unsigned char *)SvPVX(RETVAL);
423 if (base64_encode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
424 SvREFCNT_dec(RETVAL);
425 XSRETURN_UNDEF;
426 }
427 SvCUR_set(RETVAL, out_len);
428 }
429 }
430 OUTPUT:
431 RETVAL
432
433 SV *
434 CryptX__decode_base64(SV * in)
435 CODE:
436 {
437 STRLEN in_len;
438 unsigned long out_len;
439 unsigned char *out_data, *in_data;
440
441 if (!SvPOK(in)) XSRETURN_UNDEF;
442 in_data = (unsigned char *)SvPVbyte(in, in_len);
443 if (in_len == 0) {
444 RETVAL = newSVpvn("", 0);
445 }
446 else {
447 out_len = (unsigned long)in_len;
448 RETVAL = NEWSV(0, out_len);
449 SvPOK_only(RETVAL);
450 out_data = (unsigned char *)SvPVX(RETVAL);
451 if (base64_decode(in_data, (unsigned long)in_len, out_data, &out_len) != CRYPT_OK) {
452 SvREFCNT_dec(RETVAL);
453 XSRETURN_UNDEF;
454 }
455 SvCUR_set(RETVAL, out_len);
456 }
457 }
458 OUTPUT:
459 RETVAL
460
461 SV *
462 CryptX__encode_b32(SV *in, unsigned idx)
463 CODE:
464 {
465 STRLEN in_len;
466 unsigned long out_len;
467 unsigned char *out_data, *in_data;
468 int id = -1;
469
470 if (!SvPOK(in)) XSRETURN_UNDEF;
471 if (idx == 0) id = BASE32_RFC4648;
472 if (idx == 1) id = BASE32_BASE32HEX;
473 if (idx == 2) id = BASE32_ZBASE32;
474 if (idx == 3) id = BASE32_CROCKFORD;
475 if (id == -1) XSRETURN_UNDEF;
476 in_data = (unsigned char *) SvPVbyte(in, in_len);
477 if (in_len == 0) {
478 RETVAL = newSVpvn("", 0);
479 }
480 else {
481 out_len = (unsigned long)((8 * in_len + 4) / 5);
482 RETVAL = NEWSV(0, out_len);
483 SvPOK_only(RETVAL);
484 out_data = (unsigned char *)SvPVX(RETVAL);
485 if (base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
486 SvREFCNT_dec(RETVAL);
487 XSRETURN_UNDEF;
488 }
489 SvCUR_set(RETVAL, out_len);
490 }
491 }
492 OUTPUT:
493 RETVAL
494
495 SV *
496 CryptX__decode_b32(SV *in, unsigned idx)
497 CODE:
498 {
499 STRLEN in_len;
500 unsigned long out_len;
501 unsigned char *out_data, *in_data;
502 int id = -1;
503
504 if (!SvPOK(in)) XSRETURN_UNDEF;
505 if (idx == 0) id = BASE32_RFC4648;
506 if (idx == 1) id = BASE32_BASE32HEX;
507 if (idx == 2) id = BASE32_ZBASE32;
508 if (idx == 3) id = BASE32_CROCKFORD;
509 if (id == -1) XSRETURN_UNDEF;
510 in_data = (unsigned char *)SvPVbyte(in, in_len);
511 if (in_len == 0) {
512 RETVAL = newSVpvn("", 0);
513 }
514 else {
515 out_len = (unsigned long)in_len;
516 RETVAL = NEWSV(0, out_len);
517 SvPOK_only(RETVAL);
518 out_data = (unsigned char *)SvPVX(RETVAL);
519 if (base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
520 SvREFCNT_dec(RETVAL);
521 XSRETURN_UNDEF;
522 }
523 SvCUR_set(RETVAL, out_len);
524 }
525 }
526 OUTPUT:
527 RETVAL
528
529 SV *
530 CryptX__increment_octets_le(SV * in)
531 CODE:
532 {
533 STRLEN len, i = 0;
534 unsigned char *out_data, *in_data;
535
536 if (!SvPOK(in)) XSRETURN_UNDEF;
537 in_data = (unsigned char *)SvPVbyte(in, len);
538 if (len == 0) XSRETURN_UNDEF;
539
540 RETVAL = NEWSV(0, len);
541 SvPOK_only(RETVAL);
542 SvCUR_set(RETVAL, len);
543 out_data = (unsigned char *)SvPVX(RETVAL);
544 Copy(in_data, out_data, len, unsigned char);
545 while (i < len) {
546 out_data[i]++;
547 if (0 != out_data[i]) break;
548 i++;
549 }
550 if (i == len) {
551 SvREFCNT_dec(RETVAL);
552 croak("FATAL: increment_octets_le overflow");
553 }
554 }
555 OUTPUT:
556 RETVAL
557
558 SV *
559 CryptX__increment_octets_be(SV * in)
560 CODE:
561 {
562 STRLEN len, i = 0;
563 unsigned char *out_data, *in_data;
564
565 if (!SvPOK(in)) XSRETURN_UNDEF;
566 in_data = (unsigned char *)SvPVbyte(in, len);
567 if (len == 0) XSRETURN_UNDEF;
568
569 RETVAL = NEWSV(0, len);
570 SvPOK_only(RETVAL);
571 SvCUR_set(RETVAL, len);
572 out_data = (unsigned char *)SvPVX(RETVAL);
573 Copy(in_data, out_data, len, unsigned char);
574 while (i < len) {
575 out_data[len - 1 - i]++;
576 if (0 != out_data[len - 1 - i]) break;
577 i++;
578 }
579 if (i == len) {
580 SvREFCNT_dec(RETVAL);
581 croak("FATAL: increment_octets_be overflow");
582 }
583 }
584 OUTPUT:
585 RETVAL
586
587 SV *
588 CryptX__radix_to_bin(char *in, int radix)
404 CryptX__ltc_build_settings()
405 CODE:
406 RETVAL = newSVpv(crypt_build_settings, 0);
407 OUTPUT:
408 RETVAL
409
410 SV *
411 CryptX__ltc_mp_name()
412 CODE:
413 RETVAL = newSVpv(ltc_mp.name, 0);
414 OUTPUT:
415 RETVAL
416
417 int
418 CryptX__ltc_mp_bits_per_digit()
419 CODE:
420 RETVAL = ltc_mp.bits_per_digit;
421 OUTPUT:
422 RETVAL
423
424 MODULE = CryptX PACKAGE = Crypt::Misc
425
426 PROTOTYPES: DISABLE
427
428 SV *
429 _radix_to_bin(char *in, int radix)
589430 CODE:
590431 {
591432 STRLEN len;
592433 unsigned char *out_data;
593434 mp_int mpi;
594435
595 if (in == NULL || strlen(in) == 0) XSRETURN_UNDEF;
596 if (mp_init(&mpi) != CRYPT_OK) XSRETURN_UNDEF;
597
598 if (mp_read_radix(&mpi, in, radix) == CRYPT_OK) {
436 if (in == NULL) XSRETURN_UNDEF;
437 if (mp_init(&mpi) != CRYPT_OK) XSRETURN_UNDEF;
438 if (strlen(in) == 0) {
439 RETVAL = newSVpvn("", 0);
440 }
441 else if (mp_read_radix(&mpi, in, radix) == CRYPT_OK) {
599442 len = mp_unsigned_bin_size(&mpi);
600 RETVAL = NEWSV(0, len);
601 SvPOK_only(RETVAL);
602 SvCUR_set(RETVAL, len);
603 out_data = (unsigned char *)SvPVX(RETVAL);
604 mp_to_unsigned_bin(&mpi, out_data);
605 mp_clear(&mpi);
606 }
607 else {
608 XSRETURN_UNDEF;
609 }
610 }
611 OUTPUT:
612 RETVAL
613
614 SV *
615 CryptX__bin_to_radix(SV *in, int radix)
443 if (len == 0) {
444 RETVAL = newSVpvn("", 0);
445 }
446 else {
447 RETVAL = NEWSV(0, len); /* avoid zero! */
448 SvPOK_only(RETVAL);
449 SvCUR_set(RETVAL, len);
450 out_data = (unsigned char *)SvPVX(RETVAL);
451 mp_to_unsigned_bin(&mpi, out_data);
452 }
453 }
454 else {
455 RETVAL = newSVpvn(NULL, 0); /* undef */
456 }
457 mp_clear(&mpi);
458 }
459 OUTPUT:
460 RETVAL
461
462 SV *
463 _bin_to_radix(SV *in, int radix)
616464 CODE:
617465 {
618466 STRLEN len;
624472
625473 if (!SvPOK(in) || radix < 2 || radix > 64) XSRETURN_UNDEF;
626474 in_data = (unsigned char *) SvPVbyte(in, len);
627 if (len == 0) XSRETURN_UNDEF;
628
629 mp_init(&mpi);
630 if (mp_read_unsigned_bin(&mpi, in_data, (unsigned long)len) == CRYPT_OK) {
631 mp_init_copy(&tmp, &mpi);
632 while (mp_iszero(&tmp) == MP_NO) {
633 mp_div_d(&tmp, (mp_digit)radix, &tmp, &d);
634 digits++;
635 }
636 mp_clear(&tmp);
637
638 if (digits == 0) {
639 RETVAL = newSVpvn("", 0);
640 mp_clear(&mpi);
475 mp_init_multi(&mpi, &tmp, NULL);
476 if (len == 0) {
477 RETVAL = newSVpvn("", 0);
478 }
479 else {
480 if (mp_read_unsigned_bin(&mpi, in_data, (unsigned long)len) == CRYPT_OK) {
481 mp_copy(&mpi, &tmp);
482 while (mp_iszero(&tmp) == MP_NO) {
483 mp_div_d(&tmp, (mp_digit)radix, &tmp, &d);
484 digits++;
485 }
486 if (digits == 0) {
487 RETVAL = newSVpvn("", 0);
488 }
489 else {
490 RETVAL = NEWSV(0, digits + 2); /* +2 for sign and NUL byte */
491 SvPOK_only(RETVAL);
492 out_data = SvPVX(RETVAL);
493 mp_toradix(&mpi, out_data, radix);
494 SvCUR_set(RETVAL, strlen(out_data));
495 }
641496 }
642497 else {
643 RETVAL = NEWSV(0, digits + 2); /* +2 for sign and NUL byte */
644 SvPOK_only(RETVAL);
645 out_data = SvPVX(RETVAL);
646 mp_toradix(&mpi, out_data, radix);
647 SvCUR_set(RETVAL, strlen(out_data));
648 mp_clear(&mpi);
649 }
650 }
651 else {
652 mp_clear(&mpi);
653 XSRETURN_UNDEF;
654 }
655 }
656 OUTPUT:
657 RETVAL
658
659 SV *
660 CryptX__ltc_build_settings()
661 CODE:
662 RETVAL = newSVpv(crypt_build_settings, 0);
663 OUTPUT:
664 RETVAL
665
666 SV *
667 CryptX__ltc_mp_name()
668 CODE:
669 RETVAL = newSVpv(ltc_mp.name, 0);
670 OUTPUT:
671 RETVAL
672
673 int
674 CryptX__ltc_mp_bits_per_digit()
675 CODE:
676 RETVAL = ltc_mp.bits_per_digit;
498 RETVAL = newSVpvn(NULL, 0); /* undef */
499 }
500 }
501 mp_clear_multi(&tmp, &mpi, NULL);
502 }
503 OUTPUT:
504 RETVAL
505
506 SV *
507 encode_b64(SV * in)
508 ALIAS:
509 encode_b64u = 1
510 CODE:
511 {
512 int rv;
513 STRLEN in_len;
514 unsigned long out_len;
515 unsigned char *out_data, *in_data;
516
517 if (!SvPOK(in)) XSRETURN_UNDEF;
518 in_data = (unsigned char *) SvPVbyte(in, in_len);
519 if (in_len == 0) {
520 RETVAL = newSVpvn("", 0);
521 }
522 else {
523 out_len = (unsigned long)(4 * ((in_len + 2) / 3) + 1);
524 RETVAL = NEWSV(0, out_len); /* avoid zero! */
525 SvPOK_only(RETVAL);
526 out_data = (unsigned char *)SvPVX(RETVAL);
527 if (ix == 1)
528 rv = base64url_encode(in_data, (unsigned long)in_len, out_data, &out_len);
529 else
530 rv = base64_encode(in_data, (unsigned long)in_len, out_data, &out_len);
531 if (rv != CRYPT_OK) {
532 SvREFCNT_dec(RETVAL);
533 XSRETURN_UNDEF;
534 }
535 SvCUR_set(RETVAL, out_len);
536 }
537 }
538 OUTPUT:
539 RETVAL
540
541 SV *
542 decode_b64(SV * in)
543 ALIAS:
544 decode_b64u = 1
545 CODE:
546 {
547 int rv;
548 STRLEN in_len;
549 unsigned long out_len;
550 unsigned char *out_data, *in_data;
551
552 if (!SvPOK(in)) XSRETURN_UNDEF;
553 in_data = (unsigned char *)SvPVbyte(in, in_len);
554 if (in_len == 0) {
555 RETVAL = newSVpvn("", 0);
556 }
557 else {
558 out_len = (unsigned long)in_len;
559 RETVAL = NEWSV(0, out_len); /* avoid zero! */
560 SvPOK_only(RETVAL);
561 out_data = (unsigned char *)SvPVX(RETVAL);
562 if (ix == 1)
563 rv = base64url_decode(in_data, (unsigned long)in_len, out_data, &out_len);
564 else
565 rv = base64_decode(in_data, (unsigned long)in_len, out_data, &out_len);
566 if (rv != CRYPT_OK) {
567 SvREFCNT_dec(RETVAL);
568 XSRETURN_UNDEF;
569 }
570 SvCUR_set(RETVAL, out_len);
571 }
572 }
573 OUTPUT:
574 RETVAL
575
576 SV *
577 encode_b32r(SV *in)
578 ALIAS:
579 encode_b32b = 1
580 encode_b32z = 2
581 encode_b32c = 3
582 CODE:
583 {
584 STRLEN in_len;
585 unsigned long out_len;
586 unsigned char *out_data, *in_data;
587 int id = -1;
588
589 if (!SvPOK(in)) XSRETURN_UNDEF;
590 if (ix == 0) id = BASE32_RFC4648;
591 if (ix == 1) id = BASE32_BASE32HEX;
592 if (ix == 2) id = BASE32_ZBASE32;
593 if (ix == 3) id = BASE32_CROCKFORD;
594 if (id == -1) XSRETURN_UNDEF;
595 in_data = (unsigned char *) SvPVbyte(in, in_len);
596 if (in_len == 0) {
597 RETVAL = newSVpvn("", 0);
598 }
599 else {
600 out_len = (unsigned long)((8 * in_len + 4) / 5);
601 RETVAL = NEWSV(0, out_len); /* avoid zero! */
602 SvPOK_only(RETVAL);
603 out_data = (unsigned char *)SvPVX(RETVAL);
604 if (base32_encode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
605 SvREFCNT_dec(RETVAL);
606 XSRETURN_UNDEF;
607 }
608 SvCUR_set(RETVAL, out_len);
609 }
610 }
611 OUTPUT:
612 RETVAL
613
614 SV *
615 decode_b32r(SV *in)
616 ALIAS:
617 decode_b32b = 1
618 decode_b32z = 2
619 decode_b32c = 3
620 CODE:
621 {
622 STRLEN in_len;
623 unsigned long out_len;
624 unsigned char *out_data, *in_data;
625 int id = -1;
626
627 if (!SvPOK(in)) XSRETURN_UNDEF;
628 if (ix == 0) id = BASE32_RFC4648;
629 if (ix == 1) id = BASE32_BASE32HEX;
630 if (ix == 2) id = BASE32_ZBASE32;
631 if (ix == 3) id = BASE32_CROCKFORD;
632 if (id == -1) XSRETURN_UNDEF;
633 in_data = (unsigned char *)SvPVbyte(in, in_len);
634 if (in_len == 0) {
635 RETVAL = newSVpvn("", 0);
636 }
637 else {
638 out_len = (unsigned long)in_len;
639 RETVAL = NEWSV(0, out_len); /* avoid zero! */
640 SvPOK_only(RETVAL);
641 out_data = (unsigned char *)SvPVX(RETVAL);
642 if (base32_decode(in_data, (unsigned long)in_len, out_data, &out_len, id) != CRYPT_OK) {
643 SvREFCNT_dec(RETVAL);
644 XSRETURN_UNDEF;
645 }
646 SvCUR_set(RETVAL, out_len);
647 }
648 }
649 OUTPUT:
650 RETVAL
651
652 SV *
653 increment_octets_le(SV * in)
654 CODE:
655 {
656 STRLEN len, i = 0;
657 unsigned char *out_data, *in_data;
658
659 if (!SvPOK(in)) XSRETURN_UNDEF;
660 in_data = (unsigned char *)SvPVbyte(in, len);
661 if (len == 0) {
662 RETVAL = newSVpvn("", 0);
663 }
664 else {
665 RETVAL = NEWSV(0, len); /* avoid zero! */
666 SvPOK_only(RETVAL);
667 SvCUR_set(RETVAL, len);
668 out_data = (unsigned char *)SvPVX(RETVAL);
669 Copy(in_data, out_data, len, unsigned char);
670 while (i < len) {
671 out_data[i]++;
672 if (0 != out_data[i]) break;
673 i++;
674 }
675 if (i == len) {
676 SvREFCNT_dec(RETVAL);
677 croak("FATAL: increment_octets_le overflow");
678 }
679 }
680 }
681 OUTPUT:
682 RETVAL
683
684 SV *
685 increment_octets_be(SV * in)
686 CODE:
687 {
688 STRLEN len, i = 0;
689 unsigned char *out_data, *in_data;
690
691 if (!SvPOK(in)) XSRETURN_UNDEF;
692 in_data = (unsigned char *)SvPVbyte(in, len);
693 if (len == 0) {
694 RETVAL = newSVpvn("", 0);
695 }
696 else {
697 RETVAL = NEWSV(0, len); /* avoid zero! */
698 SvPOK_only(RETVAL);
699 SvCUR_set(RETVAL, len);
700 out_data = (unsigned char *)SvPVX(RETVAL);
701 Copy(in_data, out_data, len, unsigned char);
702 while (i < len) {
703 out_data[len - 1 - i]++;
704 if (0 != out_data[len - 1 - i]) break;
705 i++;
706 }
707 if (i == len) {
708 SvREFCNT_dec(RETVAL);
709 croak("FATAL: increment_octets_be overflow");
710 }
711 }
712 }
677713 OUTPUT:
678714 RETVAL
679715
8181 lib/Crypt/Digest/BLAKE2s_224.pm
8282 lib/Crypt/Digest/BLAKE2s_256.pm
8383 lib/Crypt/Digest/CHAES.pm
84 lib/Crypt/Digest/Keccak224.pm
85 lib/Crypt/Digest/Keccak256.pm
86 lib/Crypt/Digest/Keccak384.pm
87 lib/Crypt/Digest/Keccak512.pm
8488 lib/Crypt/Digest/MD2.pm
8589 lib/Crypt/Digest/MD4.pm
8690 lib/Crypt/Digest/MD5.pm
388392 src/ltc/pk/asn1/der/boolean/der_encode_boolean.c
389393 src/ltc/pk/asn1/der/boolean/der_length_boolean.c
390394 src/ltc/pk/asn1/der/choice/der_decode_choice.c
395 src/ltc/pk/asn1/der/custom_type/der_decode_custom_type.c
396 src/ltc/pk/asn1/der/custom_type/der_encode_custom_type.c
397 src/ltc/pk/asn1/der/custom_type/der_length_custom_type.c
398 src/ltc/pk/asn1/der/general/der_asn1_maps.c
399 src/ltc/pk/asn1/der/general/der_decode_asn1_identifier.c
400 src/ltc/pk/asn1/der/general/der_decode_asn1_length.c
401 src/ltc/pk/asn1/der/general/der_encode_asn1_identifier.c
402 src/ltc/pk/asn1/der/general/der_encode_asn1_length.c
403 src/ltc/pk/asn1/der/general/der_length_asn1_identifier.c
404 src/ltc/pk/asn1/der/general/der_length_asn1_length.c
391405 src/ltc/pk/asn1/der/generalizedtime/der_decode_generalizedtime.c
392406 src/ltc/pk/asn1/der/generalizedtime/der_encode_generalizedtime.c
393407 src/ltc/pk/asn1/der/generalizedtime/der_length_generalizedtime.c
409423 src/ltc/pk/asn1/der/sequence/der_decode_sequence_ex.c
410424 src/ltc/pk/asn1/der/sequence/der_decode_sequence_flexi.c
411425 src/ltc/pk/asn1/der/sequence/der_decode_sequence_multi.c
412 src/ltc/pk/asn1/der/sequence/der_decode_subject_public_key_info.c
413426 src/ltc/pk/asn1/der/sequence/der_encode_sequence_ex.c
414427 src/ltc/pk/asn1/der/sequence/der_encode_sequence_multi.c
415 src/ltc/pk/asn1/der/sequence/der_encode_subject_public_key_info.c
416428 src/ltc/pk/asn1/der/sequence/der_length_sequence.c
417429 src/ltc/pk/asn1/der/sequence/der_sequence_free.c
418430 src/ltc/pk/asn1/der/sequence/der_sequence_shrink.c
429441 src/ltc/pk/asn1/der/utf8/der_decode_utf8_string.c
430442 src/ltc/pk/asn1/der/utf8/der_encode_utf8_string.c
431443 src/ltc/pk/asn1/der/utf8/der_length_utf8_string.c
444 src/ltc/pk/asn1/x509/x509_decode_subject_public_key_info.c
445 src/ltc/pk/asn1/x509/x509_encode_subject_public_key_info.c
432446 src/ltc/pk/dh/dh.c
433447 src/ltc/pk/dh/dh_check_pubkey.c
434448 src/ltc/pk/dh/dh_export.c
457471 src/ltc/pk/ecc/ecc_ansi_x963_export.c
458472 src/ltc/pk/ecc/ecc_ansi_x963_import.c
459473 src/ltc/pk/ecc/ecc_decrypt_key.c
460 src/ltc/pk/ecc/ecc_dp_clear.c
461 src/ltc/pk/ecc/ecc_dp_fill_from_sets.c
462 src/ltc/pk/ecc/ecc_dp_from_oid.c
463 src/ltc/pk/ecc/ecc_dp_from_params.c
464 src/ltc/pk/ecc/ecc_dp_init.c
465 src/ltc/pk/ecc/ecc_dp_set.c
466474 src/ltc/pk/ecc/ecc_encrypt_key.c
467475 src/ltc/pk/ecc/ecc_export.c
468 src/ltc/pk/ecc/ecc_export_full.c
469 src/ltc/pk/ecc/ecc_export_raw.c
476 src/ltc/pk/ecc/ecc_export_openssl.c
470477 src/ltc/pk/ecc/ecc_free.c
478 src/ltc/pk/ecc/ecc_get_key.c
479 src/ltc/pk/ecc/ecc_get_set.c
471480 src/ltc/pk/ecc/ecc_get_size.c
472481 src/ltc/pk/ecc/ecc_import.c
473 src/ltc/pk/ecc/ecc_import_full.c
482 src/ltc/pk/ecc/ecc_import_openssl.c
474483 src/ltc/pk/ecc/ecc_import_pkcs8.c
475 src/ltc/pk/ecc/ecc_import_raw.c
484 src/ltc/pk/ecc/ecc_import_x509.c
476485 src/ltc/pk/ecc/ecc_make_key.c
486 src/ltc/pk/ecc/ecc_set_dp.c
487 src/ltc/pk/ecc/ecc_set_dp_internal.c
488 src/ltc/pk/ecc/ecc_set_key.c
477489 src/ltc/pk/ecc/ecc_shared_secret.c
478490 src/ltc/pk/ecc/ecc_sign_hash.c
479491 src/ltc/pk/ecc/ecc_sizes.c
480492 src/ltc/pk/ecc/ecc_verify_hash.c
481 src/ltc/pk/ecc/ecc_verify_key.c
482493 src/ltc/pk/ecc/ltc_ecc_export_point.c
483494 src/ltc/pk/ecc/ltc_ecc_import_point.c
484495 src/ltc/pk/ecc/ltc_ecc_is_point.c
485496 src/ltc/pk/ecc/ltc_ecc_is_point_at_infinity.c
486 src/ltc/pk/ecc/ltc_ecc_is_valid_idx.c
487497 src/ltc/pk/ecc/ltc_ecc_map.c
488498 src/ltc/pk/ecc/ltc_ecc_mul2add.c
489499 src/ltc/pk/ecc/ltc_ecc_mulmod.c
491501 src/ltc/pk/ecc/ltc_ecc_points.c
492502 src/ltc/pk/ecc/ltc_ecc_projective_add_point.c
493503 src/ltc/pk/ecc/ltc_ecc_projective_dbl_point.c
504 src/ltc/pk/ecc/ltc_ecc_verify_key.c
494505 src/ltc/pk/pkcs1/pkcs_1_i2osp.c
495506 src/ltc/pk/pkcs1/pkcs_1_mgf1.c
496507 src/ltc/pk/pkcs1/pkcs_1_oaep_decode.c
903914 t/digest_blake2s_224.t
904915 t/digest_blake2s_256.t
905916 t/digest_chaes.t
917 t/digest_keccak224.t
918 t/digest_keccak256.t
919 t/digest_keccak384.t
920 t/digest_keccak512.t
906921 t/digest_md2.t
907922 t/digest_md4.t
908923 t/digest_md5.t
4444 "url" : "https://github.com/DCIT/perl-CryptX"
4545 }
4646 },
47 "version" : "0.056",
47 "version" : "0.059",
4848 "x_serialization_backend" : "JSON::PP version 2.94"
4949 }
2121 resources:
2222 bugtracker: https://github.com/DCIT/perl-CryptX/issues
2323 repository: https://github.com/DCIT/perl-CryptX
24 version: '0.056'
24 version: '0.059'
2525 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
22 use ExtUtils::MakeMaker;
33 use Config;
44
5 my @myobjs = map { s|.c$|$Config{obj_ext}|; $_ } grep { $_ !~ m|^src/ltc/\.*tab\.c$| } (
6 glob('src/ltm/*.c'),
7 glob('src/ltc/*/*.c'),
8 glob('src/ltc/*/*/*.c'),
9 glob('src/ltc/*/*/*/*.c'),
10 glob('src/ltc/*/*/*/*/*.c'),
11 );
12 my $myextlib = "src/liballinone$Config{lib_ext}";
13 my $mycflags = "$Config{ccflags} $Config{cccdlflags} $Config{optimize}";
5 my (@EUMM_INC_LIB, $myarflags, $mycflags);
146
15 #FIX: this is particularly useful for Debian https://github.com/DCIT/perl-CryptX/pull/39
16 $mycflags .= " $ENV{CFLAGS}" if $ENV{CFLAGS};
17 $mycflags .= " $ENV{CPPFLAGS}" if $ENV{CPPFLAGS};
7 if ($ENV{CRYPTX_CFLAGS} || $ENV{CRYPTX_LDFLAGS}) {
8 # EXPERIMENTAL: use system libraries libtomcrypt + libtommath
9 # e.g.
10 # CRYPTX_LDFLAGS='-L/usr/local/lib -ltommath -ltomcrypt' CRYPTX_CFLAGS='-DLTM_DESC -I/usr/local/include' perl Makefile.PL
11 print "CRYPTX_CFLAGS = $ENV{CRYPTX_CFLAGS}\n" if $ENV{CRYPTX_CFLAGS};
12 print "CRYPTX_LDFLAGS = $ENV{CRYPTX_LDFLAGS}\n" if $ENV{CRYPTX_LDFLAGS};
13 @EUMM_INC_LIB = (
14 INC => $ENV{CRYPTX_CFLAGS},
15 LIBS => [ $ENV{CRYPTX_LDFLAGS} ],
16 );
17 }
18 else {
19 # PREFERRED: use bundled libtomcrypt + libtommath (from ./src subdir)
20 my @myobjs = map { s|.c$|$Config{obj_ext}|; $_ } grep { $_ !~ m|^src/ltc/\.*tab\.c$| } (
21 glob('src/ltm/*.c'),
22 glob('src/ltc/*/*.c'),
23 glob('src/ltc/*/*/*.c'),
24 glob('src/ltc/*/*/*/*.c'),
25 glob('src/ltc/*/*/*/*/*.c'),
26 );
27 $mycflags = "$Config{ccflags} $Config{cccdlflags} $Config{optimize}";
1828
19 #FIX: gcc with -flto is a trouble maker see https://github.com/DCIT/perl-CryptX/issues/32
20 $mycflags =~ s/-flto\b//g;
29 #FIX: this is particularly useful for Debian https://github.com/DCIT/perl-CryptX/pull/39
30 $mycflags .= " $ENV{CFLAGS}" if $ENV{CFLAGS};
31 $mycflags .= " $ENV{CPPFLAGS}" if $ENV{CPPFLAGS};
2132
22 #FIX: avoid -Wwrite-strings -Wcast-qual -pedantic -pedantic-errors -ansi -std=c89
23 $mycflags =~ s/-pedantic\b//g;
24 $mycflags =~ s/-pedantic-errors\b//g;
25 $mycflags =~ s/-std=c89\b//g;
26 $mycflags =~ s/-ansi\b//g;
27 $mycflags =~ s/-Wwrite-strings\b//g;
28 $mycflags =~ s/-Wcast-qual\b//g;
33 #FIX: gcc with -flto is a trouble maker see https://github.com/DCIT/perl-CryptX/issues/32
34 $mycflags =~ s/-flto\b//g;
2935
30 #FIX: avoid "ar: fatal: Numeric group ID too large" see https://github.com/DCIT/perl-CryptX/issues/33
31 my $myarflags = '$(AR_STATIC_ARGS)';
32 if ($^O ne 'MSWin32' && $Config{ar}) {
33 # for ar's "deterministic mode" we need GNU binutils 2.20+ (2009-10-16)
34 my $arver = `$Config{ar} --version 2>/dev/null`;
35 my ($maj, $min) = $arver =~ /^GNU ar [^\d]*(\d)\.(\d+)\.\d+/s;
36 $myarflags = 'rcD' if ($maj && $min && $maj >= 2 && $min >= 20) || $arver=~ /^BSD ar /;
36 #FIX: avoid -Wwrite-strings -Wcast-qual -pedantic -pedantic-errors -ansi -std=c89
37 $mycflags =~ s/-pedantic\b//g;
38 $mycflags =~ s/-pedantic-errors\b//g;
39 $mycflags =~ s/-std=c89\b//g;
40 $mycflags =~ s/-ansi\b//g;
41 $mycflags =~ s/-Wwrite-strings\b//g;
42 $mycflags =~ s/-Wcast-qual\b//g;
43
44 #FIX: avoid "ar: fatal: Numeric group ID too large" see https://github.com/DCIT/perl-CryptX/issues/33
45 $myarflags = '$(AR_STATIC_ARGS)';
46 if ($^O ne 'MSWin32' && $Config{ar}) {
47 # for ar's "deterministic mode" we need GNU binutils 2.20+ (2009-10-16)
48 my $arver = `$Config{ar} --version 2>/dev/null`;
49 my ($maj, $min) = $arver =~ /^GNU ar [^\d]*(\d)\.(\d+)\.\d+/s;
50 $myarflags = 'rcD' if ($maj && $min && $maj >= 2 && $min >= 20) || $arver=~ /^BSD ar /;
51 }
52 @EUMM_INC_LIB = (
53 INC => '-DLTM_DESC -Isrc/ltc/headers -Isrc/ltm',
54 MYEXTLIB => "src/liballinone$Config{lib_ext}",
55 clean => { 'FILES' => join(' ', @myobjs, "src/liballinone$Config{lib_ext}") },
56 );
3757 }
3858
3959 my %eumm_args = (
4565 LICENSE => 'perl_5',
4666 META_MERGE => { resources => { repository => 'https://github.com/DCIT/perl-CryptX', bugtracker => 'https://github.com/DCIT/perl-CryptX/issues' } },
4767 dist => { 'PREOP' => 'perldoc -u lib/CryptX.pm | pod2markdown > README.md' },
48 ($ENV{CRYPTX_CFLAGS} || $ENV{CRYPTX_LDFLAGS})
49 ?
50 (
51 # e.g. CRYPTX_LDFLAGS='-L/usr/local/lib -ltommath -ltomcrypt' CRYPTX_CFLAGS='-DLTM_DESC -I/usr/local/include' perl Makefile.PL
52 INC => $ENV{CRYPTX_CFLAGS},
53 LIBS => [ $ENV{CRYPTX_LDFLAGS} ],
54 )
55 :
56 (
57 # bundled libtomcrypt + libtommath
58 INC => '-DLTM_DESC -Isrc/ltc/headers -Isrc/ltm',
59 MYEXTLIB => $myextlib,
60 clean => { 'FILES' => join(' ', @myobjs, $myextlib) },
61 )
68 @EUMM_INC_LIB
6269 );
6370
64 my $eumm_ver = eval $ExtUtils::MakeMaker::VERSION;
71 my $eumm_ver = eval $ExtUtils::MakeMaker::VERSION;
6572 delete $eumm_args{MIN_PERL_VERSION} if $eumm_ver < 6.48;
6673 delete $eumm_args{META_ADD} if $eumm_ver < 6.46;
6774 delete $eumm_args{META_MERGE} if $eumm_ver < 6.46;
6976
7077 WriteMakefile(%eumm_args);
7178
72 # ARFLAGS=\$(AR_STATIC_ARGS) RANLIB=\$(RANLIB) AR=\$(AR)
79 sub MY::postamble {
80 return "" unless $mycflags && $myarflags;
7381
74 sub MY::postamble {
75 my $myextlib = qq{
82 my $extra_targets = qq{
7683 \$(MYEXTLIB): src/Makefile
7784 cd src && \$(MAKE) ARFLAGS="$myarflags" RANLIB="\$(RANLIB)" AR="\$(AR)" CC="\$(CC)" LIB_EXT=\$(LIB_EXT) OBJ_EXT=\$(OBJ_EXT) CFLAGS="$mycflags"
7885 };
7986
80 $myextlib = qq{
87 $extra_targets = qq{
8188 \$(MYEXTLIB): src/Makefile
8289 cd src && \$(MAKE) -f Makefile.nmake CFLAGS="$mycflags"
8390 } if $^O eq 'MSWin32' && $Config{make} =~ /nmake/ && $Config{cc} =~ /cl/;
8491
85 $myextlib = qq{
92 $extra_targets = qq{
8693 \$(MYEXTLIB): src/Makefile
8794 cd src && \$(MAKE) CC="$Config{cc}" CFLAGS="$mycflags"
8895 } if $^O eq 'MSWin32' && $Config{cc} =~ /gcc/;
8996
90 my $version_patch = q{
97 $extra_targets .= q{
9198 versionsync:
9299 $(NOECHO) perl _generators/version_patch.pl sync
93100 versioninc:
106113 $(NOECHO) perl -Mblib t/openssl/dsa-test.pl
107114 $(NOECHO) perl -Mblib t/openssl/ecc-test.pl
108115 $(NOECHO) perl -Mblib t/openssl/rsa-test.pl
116 rebuild-pre:
117 $(RM_F) src/liballinone.a
118 $(TOUCH) CryptX.xs
119 rebuild: rebuild-pre all
120
109121 };
110122
111 return "$myextlib\n$version_patch";
123 return $extra_targets;
112124 }
55
66 Cryptography in CryptX is based on [https://github.com/libtom/libtomcrypt](https://github.com/libtom/libtomcrypt)
77
8 Currently available modules:
8 Available modules:
99
1010 - Symmetric ciphers - see [Crypt::Cipher](https://metacpan.org/pod/Crypt::Cipher) and related modules
1111
3535 [Crypt::Digest::CHAES](https://metacpan.org/pod/Crypt::Digest::CHAES), [Crypt::Digest::MD2](https://metacpan.org/pod/Crypt::Digest::MD2), [Crypt::Digest::MD4](https://metacpan.org/pod/Crypt::Digest::MD4), [Crypt::Digest::MD5](https://metacpan.org/pod/Crypt::Digest::MD5), [Crypt::Digest::RIPEMD128](https://metacpan.org/pod/Crypt::Digest::RIPEMD128), [Crypt::Digest::RIPEMD160](https://metacpan.org/pod/Crypt::Digest::RIPEMD160),
3636 [Crypt::Digest::RIPEMD256](https://metacpan.org/pod/Crypt::Digest::RIPEMD256), [Crypt::Digest::RIPEMD320](https://metacpan.org/pod/Crypt::Digest::RIPEMD320), [Crypt::Digest::SHA1](https://metacpan.org/pod/Crypt::Digest::SHA1), [Crypt::Digest::SHA224](https://metacpan.org/pod/Crypt::Digest::SHA224), [Crypt::Digest::SHA256](https://metacpan.org/pod/Crypt::Digest::SHA256), [Crypt::Digest::SHA384](https://metacpan.org/pod/Crypt::Digest::SHA384),
3737 [Crypt::Digest::SHA512](https://metacpan.org/pod/Crypt::Digest::SHA512), [Crypt::Digest::SHA512\_224](https://metacpan.org/pod/Crypt::Digest::SHA512_224), [Crypt::Digest::SHA512\_256](https://metacpan.org/pod/Crypt::Digest::SHA512_256), [Crypt::Digest::Tiger192](https://metacpan.org/pod/Crypt::Digest::Tiger192), [Crypt::Digest::Whirlpool](https://metacpan.org/pod/Crypt::Digest::Whirlpool),
38 [Crypt::Digest::Keccak224](https://metacpan.org/pod/Crypt::Digest::Keccak224), [Crypt::Digest::Keccak256](https://metacpan.org/pod/Crypt::Digest::Keccak256), [Crypt::Digest::Keccak384](https://metacpan.org/pod/Crypt::Digest::Keccak384), [Crypt::Digest::Keccak512](https://metacpan.org/pod/Crypt::Digest::Keccak512),
3839 [Crypt::Digest::SHA3\_224](https://metacpan.org/pod/Crypt::Digest::SHA3_224), [Crypt::Digest::SHA3\_256](https://metacpan.org/pod/Crypt::Digest::SHA3_256), [Crypt::Digest::SHA3\_384](https://metacpan.org/pod/Crypt::Digest::SHA3_384), [Crypt::Digest::SHA3\_512](https://metacpan.org/pod/Crypt::Digest::SHA3_512), [Crypt::Digest::SHAKE](https://metacpan.org/pod/Crypt::Digest::SHAKE)
3940
4041 - Checksums
4142
42 [Crypt::Checksum](https://metacpan.org/pod/Crypt::Checksum), [Crypt::Checksum::Adler32](https://metacpan.org/pod/Crypt::Checksum::Adler32), [Crypt::Checksum::CRC32](https://metacpan.org/pod/Crypt::Checksum::CRC32)
43 [Crypt::Checksum::Adler32](https://metacpan.org/pod/Crypt::Checksum::Adler32), [Crypt::Checksum::CRC32](https://metacpan.org/pod/Crypt::Checksum::CRC32)
4344
4445 - Message Authentication Codes
4546
5051
5152 [Crypt::PK::RSA](https://metacpan.org/pod/Crypt::PK::RSA), [Crypt::PK::DSA](https://metacpan.org/pod/Crypt::PK::DSA), [Crypt::PK::ECC](https://metacpan.org/pod/Crypt::PK::ECC), [Crypt::PK::DH](https://metacpan.org/pod/Crypt::PK::DH)
5253
53 - Cryptographically secure random number generators
54 - Cryptographically secure random number generators - see [Crypt::PRNG](https://metacpan.org/pod/Crypt::PRNG) and related modules
5455
55 [Crypt::PRNG](https://metacpan.org/pod/Crypt::PRNG), [Crypt::PRNG::Fortuna](https://metacpan.org/pod/Crypt::PRNG::Fortuna), [Crypt::PRNG::Yarrow](https://metacpan.org/pod/Crypt::PRNG::Yarrow), [Crypt::PRNG::RC4](https://metacpan.org/pod/Crypt::PRNG::RC4), [Crypt::PRNG::Sober128](https://metacpan.org/pod/Crypt::PRNG::Sober128), [Crypt::PRNG::ChaCha20](https://metacpan.org/pod/Crypt::PRNG::ChaCha20)
56 [Crypt::PRNG::Fortuna](https://metacpan.org/pod/Crypt::PRNG::Fortuna), [Crypt::PRNG::Yarrow](https://metacpan.org/pod/Crypt::PRNG::Yarrow), [Crypt::PRNG::RC4](https://metacpan.org/pod/Crypt::PRNG::RC4), [Crypt::PRNG::Sober128](https://metacpan.org/pod/Crypt::PRNG::Sober128), [Crypt::PRNG::ChaCha20](https://metacpan.org/pod/Crypt::PRNG::ChaCha20)
5657
5758 - Key derivation functions - PBKDF1, PBKDF2 and HKDF
5859
6869
6970 # COPYRIGHT
7071
71 Copyright (c) 2013+ DCIT, a.s. [http://www.dcit.cz](http://www.dcit.cz) / Karel Miko
72 Copyright (c) 2013+ DCIT, a.s. [https://www.dcit.cz](https://www.dcit.cz) / Karel Miko
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::CCM
11
2 PROTOTYPES: DISABLE
3
24 Crypt::AuthEnc::CCM
3 _new(char * cipher_name, SV * key, SV * nonce, SV * adata, int tag_len, int pt_len)
5 new(Class, char * cipher_name, SV * key, SV * nonce, SV * adata, int tag_len, int pt_len)
46 CODE:
57 {
68 unsigned char *k=NULL;
2022 if (!SvPOK(adata)) croak("FATAL: adata must be string/buffer scalar");
2123 h = (unsigned char *) SvPVbyte(adata, h_len);
2224
23 id = find_cipher(cipher_name);
25 id = _find_cipher(cipher_name);
2426 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2527
26 Newz(0, RETVAL, 1, struct ccm_struct);
28 Newz(0, RETVAL, 1, ccm_state);
2729 if (!RETVAL) croak("FATAL: Newz failed");
2830
29 rv = ccm_init(&RETVAL->state, id, k, (int)k_len, (int)pt_len, (int)tag_len, (int)h_len); /* XXX-TODO why int? */
31 rv = ccm_init(RETVAL, id, k, (int)k_len, (int)pt_len, (int)tag_len, (int)h_len); /* XXX-TODO why int? */
3032 if (rv != CRYPT_OK) {
3133 Safefree(RETVAL);
3234 croak("FATAL: ccm_init failed: %s", error_to_string(rv));
3335 }
34 rv = ccm_add_nonce(&RETVAL->state, n, (unsigned long)n_len);
36 rv = ccm_add_nonce(RETVAL, n, (unsigned long)n_len);
3537 if (rv != CRYPT_OK) {
3638 Safefree(RETVAL);
3739 croak("FATAL: ccm_add_nonce failed: %s", error_to_string(rv));
3840 }
39 rv = ccm_add_aad(&RETVAL->state, h, (unsigned long)h_len);
41 rv = ccm_add_aad(RETVAL, h, (unsigned long)h_len);
4042 if (rv != CRYPT_OK) {
4143 Safefree(RETVAL);
4244 croak("FATAL: ccm_add_aad failed: %s", error_to_string(rv));
4345 }
44 RETVAL->direction = -1;
45 RETVAL->tag_len = tag_len;
46 RETVAL->pt_len = pt_len;
4746 }
4847 OUTPUT:
4948 RETVAL
5655 Crypt::AuthEnc::CCM
5756 clone(Crypt::AuthEnc::CCM self)
5857 CODE:
59 Newz(0, RETVAL, 1, struct ccm_struct);
58 Newz(0, RETVAL, 1, ccm_state);
6059 if (!RETVAL) croak("FATAL: Newz failed");
61 Copy(&self->state, &RETVAL->state, 1, struct ccm_struct);
60 Copy(self, RETVAL, 1, ccm_state);
6261 OUTPUT:
6362 RETVAL
6463
7574 RETVAL = newSVpvn("", 0);
7675 }
7776 else {
78 if (self->direction == -1) self->direction = CCM_ENCRYPT;
79 if (self->direction != CCM_ENCRYPT) {
80 croak("FATAL: encrypt_add failed: wrong direction");
81 }
82 if (self->pt_len < in_data_len) croak("FATAL: encrypt_add failed: pt_len mismatch");
83 RETVAL = NEWSV(0, in_data_len);
77 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
8478 SvPOK_only(RETVAL);
8579 SvCUR_set(RETVAL, in_data_len);
8680 out_data = (unsigned char *)SvPVX(RETVAL);
87 rv = ccm_process(&self->state, in_data, (unsigned long)in_data_len, out_data, self->direction);
81 rv = ccm_process(self, in_data, (unsigned long)in_data_len, out_data, CCM_ENCRYPT);
8882 if (rv != CRYPT_OK) {
8983 SvREFCNT_dec(RETVAL);
9084 croak("FATAL: ccm_process failed: %s", error_to_string(rv));
9185 }
92 self->pt_len -= (unsigned long)in_data_len;
9386 }
9487 }
9588 OUTPUT:
108101 RETVAL = newSVpvn("", 0);
109102 }
110103 else {
111 if (self->direction == -1) self->direction = CCM_DECRYPT;
112 if (self->direction != CCM_DECRYPT) {
113 croak("FATAL: decrypt_add failed: wrong direction");
114 }
115 if (self->pt_len < in_data_len) croak("FATAL: decrypt_add failed: pt_len mismatch");
116 RETVAL = NEWSV(0, in_data_len);
104 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
117105 SvPOK_only(RETVAL);
118106 SvCUR_set(RETVAL, in_data_len);
119107 out_data = (unsigned char *)SvPVX(RETVAL);
120 rv = ccm_process(&self->state, out_data, (unsigned long)in_data_len, in_data, CCM_DECRYPT);
108 rv = ccm_process(self, out_data, (unsigned long)in_data_len, in_data, CCM_DECRYPT);
121109 if (rv != CRYPT_OK) {
122110 SvREFCNT_dec(RETVAL);
123111 croak("FATAL: ccm_process failed: %s", error_to_string(rv));
124112 }
125 self->pt_len -= (unsigned long)in_data_len;
126113 }
127114 }
128115 OUTPUT:
134121 {
135122 int rv;
136123 unsigned char tag[MAXBLOCKSIZE];
137 unsigned long tag_len = self->tag_len;
138
139 if (self->direction != CCM_ENCRYPT) {
140 croak("FATAL: encrypt_done failed: wrong direction");
141 }
142 if (self->pt_len != 0) croak("FATAL: encrypt_done failed: pt_len mismatch");
143 rv = ccm_done(&self->state, tag, &tag_len);
124 unsigned long tag_len = MAXBLOCKSIZE;
125
126 rv = ccm_done(self, tag, &tag_len);
144127 if (rv != CRYPT_OK) croak("FATAL: ccm_done failed: %s", error_to_string(rv));
145128 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
146129 }
151134 {
152135 int rv;
153136 unsigned char tag[MAXBLOCKSIZE];
154 unsigned long tag_len = self->tag_len;
137 unsigned long tag_len = MAXBLOCKSIZE;
155138 STRLEN expected_tag_len;
156139 unsigned char *expected_tag;
157140
158 if (self->direction != CCM_DECRYPT) {
159 croak("FATAL: decrypt_done failed: wrong direction");
160 }
161 if (self->pt_len != 0) croak("FATAL: decrypt_done failed: pt_len mismatch");
162 rv = ccm_done(&self->state, tag, &tag_len);
141 rv = ccm_done(self, tag, &tag_len);
163142 if (rv != CRYPT_OK) croak("FATAL: ccm_done failed: %s", error_to_string(rv));
164143 if (items == 1) {
165144 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
178157 }
179158 }
180159 }
160
161 void
162 ccm_encrypt_authenticate(char *cipher_name, SV *key, SV *nonce, SV *header, unsigned long tag_len, SV *plaintext)
163 PPCODE:
164 {
165 STRLEN k_len = 0, n_len = 0, h_len = 0, pt_len = 0;
166 unsigned char *k = NULL, *n = NULL, *h = NULL, *pt = NULL;
167 int rv, id;
168 unsigned char tag[MAXBLOCKSIZE];
169 SV *output;
170
171 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
172 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
173 if (SvPOK(plaintext)) pt = (unsigned char *) SvPVbyte(plaintext, pt_len);
174 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
175
176 id = _find_cipher(cipher_name);
177 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
178 output = NEWSV(0, pt_len > 0 ? pt_len : 1); /* avoid zero! */
179 SvPOK_only(output);
180 SvCUR_set(output, pt_len);
181 if(tag_len < 4 || tag_len > 16) tag_len = 16;
182
183 rv = ccm_memory(id, k, (unsigned long)k_len, NULL, n, (unsigned long)n_len, h, (unsigned long)h_len,
184 pt, (unsigned long)pt_len, (unsigned char *)SvPVX(output), tag, &tag_len, CCM_ENCRYPT);
185
186 if (rv != CRYPT_OK) {
187 SvREFCNT_dec(output);
188 croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
189 }
190 XPUSHs(sv_2mortal(output));
191 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
192 }
193
194 void
195 ccm_decrypt_verify(char *cipher_name, SV *key, SV *nonce, SV *header, SV *ciphertext, SV *tagsv)
196 PPCODE:
197 {
198 STRLEN k_len = 0, n_len = 0, h_len = 0, ct_len = 0, t_len = 0;
199 unsigned char *k = NULL, *n = NULL, *h = NULL, *ct = NULL, *t = NULL;
200 int rv, id;
201 unsigned char tag[MAXBLOCKSIZE];
202 unsigned long tag_len;
203 SV *output;
204
205 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
206 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
207 if (SvPOK(ciphertext)) ct = (unsigned char *) SvPVbyte(ciphertext, ct_len);
208 if (SvPOK(tagsv)) t = (unsigned char *) SvPVbyte(tagsv, t_len);
209 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
210
211 id = _find_cipher(cipher_name);
212 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
213 output = NEWSV(0, ct_len > 0 ? ct_len : 1); /* avoid zero! */
214 SvPOK_only(output);
215 SvCUR_set(output, ct_len);
216 tag_len = (unsigned long)t_len;
217 Copy(t, tag, t_len, unsigned char);
218
219 rv = ccm_memory(id, k, (unsigned long)k_len, NULL, n, (unsigned long)n_len, h, (unsigned long)h_len,
220 (unsigned char *)SvPVX(output), (unsigned long)ct_len, ct, tag, &tag_len, CCM_DECRYPT);
221
222 if (rv != CRYPT_OK) {
223 SvREFCNT_dec(output);
224 XPUSHs(sv_2mortal(newSVpvn(NULL,0))); /* undef */
225 }
226 else {
227 XPUSHs(sv_2mortal(output));
228 }
229 }
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::ChaCha20Poly1305
11
2 PROTOTYPES: DISABLE
3
24 Crypt::AuthEnc::ChaCha20Poly1305
3 _new(SV * key, SV * nonce = NULL)
5 new(Class, SV * key, SV * nonce = NULL)
46 CODE:
57 {
68 int rv;
1416 iv = (unsigned char *) SvPVbyte(nonce, iv_len);
1517 }
1618
17 Newz(0, RETVAL, 1, struct chacha20poly1305_struct);
19 Newz(0, RETVAL, 1, chacha20poly1305_state);
1820 if (!RETVAL) croak("FATAL: Newz failed");
1921
20 rv = chacha20poly1305_init(&RETVAL->state, k, (unsigned long)k_len);
22 rv = chacha20poly1305_init(RETVAL, k, (unsigned long)k_len);
2123 if (rv != CRYPT_OK) {
2224 Safefree(RETVAL);
2325 croak("FATAL: chacha20poly1305_init failed: %s", error_to_string(rv));
2426 }
2527
2628 if (iv && iv_len > 0) {
27 rv = chacha20poly1305_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
29 rv = chacha20poly1305_setiv(RETVAL, iv, (unsigned long)iv_len);
2830 if (rv != CRYPT_OK) {
2931 Safefree(RETVAL);
3032 croak("FATAL: chacha20poly1305_setiv failed: %s", error_to_string(rv));
4244 Crypt::AuthEnc::ChaCha20Poly1305
4345 clone(Crypt::AuthEnc::ChaCha20Poly1305 self)
4446 CODE:
45 Newz(0, RETVAL, 1, struct chacha20poly1305_struct);
47 Newz(0, RETVAL, 1, chacha20poly1305_state);
4648 if (!RETVAL) croak("FATAL: Newz failed");
47 Copy(&self->state, &RETVAL->state, 1, struct chacha20poly1305_struct);
49 Copy(self, RETVAL, 1, chacha20poly1305_state);
4850 OUTPUT:
4951 RETVAL
5052
5860
5961 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
6062 iv = (unsigned char *) SvPVbyte(nonce, iv_len);
61 rv = chacha20poly1305_setiv(&self->state, iv, (unsigned long)iv_len);
63 rv = chacha20poly1305_setiv(self, iv, (unsigned long)iv_len);
6264 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_setiv failed: %s", error_to_string(rv));
6365 XPUSHs(ST(0)); /* return self */;
6466 }
7375
7476 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
7577 iv = (unsigned char *) SvPVbyte(nonce, iv_len);
76 rv = chacha20poly1305_setiv_rfc7905(&self->state, iv, (unsigned long)iv_len, (ulong64)seqnum);
78 rv = chacha20poly1305_setiv_rfc7905(self, iv, (unsigned long)iv_len, (ulong64)seqnum);
7779 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_setiv_rfc7905 failed: %s", error_to_string(rv));
7880 XPUSHs(ST(0)); /* return self */
7981 }
8789 unsigned char *in_data;
8890
8991 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
90 rv = chacha20poly1305_add_aad(&self->state, in_data, (unsigned long)in_data_len);
92 rv = chacha20poly1305_add_aad(self, in_data, (unsigned long)in_data_len);
9193 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_add_aad failed: %s", error_to_string(rv));
9294 XPUSHs(ST(0)); /* return self */
9395 }
105107 RETVAL = newSVpvn("", 0);
106108 }
107109 else {
108 RETVAL = NEWSV(0, in_data_len);
110 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
109111 SvPOK_only(RETVAL);
110112 SvCUR_set(RETVAL, in_data_len);
111113 out_data = (unsigned char *)SvPVX(RETVAL);
112 rv = chacha20poly1305_decrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
114 rv = chacha20poly1305_decrypt(self, in_data, (unsigned long)in_data_len, out_data);
113115 if (rv != CRYPT_OK) {
114116 SvREFCNT_dec(RETVAL);
115117 croak("FATAL: chacha20poly1305_decrypt failed: %s", error_to_string(rv));
132134 RETVAL = newSVpvn("", 0);
133135 }
134136 else {
135 RETVAL = NEWSV(0, in_data_len);
137 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
136138 SvPOK_only(RETVAL);
137139 SvCUR_set(RETVAL, in_data_len);
138140 out_data = (unsigned char *)SvPVX(RETVAL);
139 rv = chacha20poly1305_encrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
141 rv = chacha20poly1305_encrypt(self, in_data, (unsigned long)in_data_len, out_data);
140142 if (rv != CRYPT_OK) {
141143 SvREFCNT_dec(RETVAL);
142144 croak("FATAL: chacha20poly1305_encrypt failed: %s", error_to_string(rv));
154156 unsigned char tag[MAXBLOCKSIZE];
155157 unsigned long tag_len = sizeof(tag);
156158
157 rv = chacha20poly1305_done(&self->state, tag, &tag_len);
159 rv = chacha20poly1305_done(self, tag, &tag_len);
158160 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_done failed: %s", error_to_string(rv));
159161 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
160162 }
169171 STRLEN expected_tag_len;
170172 unsigned char *expected_tag;
171173
172 rv = chacha20poly1305_done(&self->state, tag, &tag_len);
174 rv = chacha20poly1305_done(self, tag, &tag_len);
173175 if (rv != CRYPT_OK) croak("FATAL: chacha20poly1305_done failed: %s", error_to_string(rv));
174176 if (items == 1) {
175177 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
188190 }
189191 }
190192 }
193
194 void
195 chacha20poly1305_encrypt_authenticate(SV *key, SV *nonce, SV *header, SV *plaintext)
196 PPCODE:
197 {
198 STRLEN k_len = 0, n_len = 0, h_len = 0, pt_len = 0;
199 unsigned char *k = NULL, *n = NULL, *h = NULL, *pt = NULL;
200 int rv;
201 unsigned char tag[MAXBLOCKSIZE];
202 unsigned long tag_len = sizeof(tag);
203 SV *output;
204
205 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
206 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
207 if (SvPOK(plaintext)) pt = (unsigned char *) SvPVbyte(plaintext, pt_len);
208 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
209
210 output = NEWSV(0, pt_len > 0 ? pt_len : 1); /* avoid zero! */
211 SvPOK_only(output);
212 SvCUR_set(output, pt_len);
213
214 rv = chacha20poly1305_memory(k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len,
215 pt, (unsigned long)pt_len, (unsigned char *)SvPVX(output), tag, &tag_len,
216 CHACHA20POLY1305_ENCRYPT);
217
218 if (rv != CRYPT_OK) {
219 SvREFCNT_dec(output);
220 croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
221 }
222 XPUSHs(sv_2mortal(output));
223 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
224 }
225
226 void
227 chacha20poly1305_decrypt_verify(SV *key, SV *nonce, SV *header, SV *ciphertext, SV *tagsv)
228 PPCODE:
229 {
230 STRLEN k_len = 0, n_len = 0, h_len = 0, ct_len = 0, t_len = 0;
231 unsigned char *k = NULL, *n = NULL, *h = NULL, *ct = NULL, *t = NULL;
232 int rv;
233 unsigned char tag[MAXBLOCKSIZE];
234 unsigned long tag_len;
235 SV *output;
236
237 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
238 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
239 if (SvPOK(ciphertext)) ct = (unsigned char *) SvPVbyte(ciphertext, ct_len);
240 if (SvPOK(tagsv)) t = (unsigned char *) SvPVbyte(tagsv, t_len);
241 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
242
243 output = NEWSV(0, ct_len > 0 ? ct_len : 1); /* avoid zero! */
244 SvPOK_only(output);
245 SvCUR_set(output, ct_len);
246 tag_len = (unsigned long)t_len;
247 Copy(t, tag, t_len, unsigned char);
248
249 rv = chacha20poly1305_memory(k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len,
250 ct, (unsigned long)ct_len, (unsigned char *)SvPVX(output), tag, &tag_len,
251 CHACHA20POLY1305_DECRYPT);
252
253 if (rv != CRYPT_OK) {
254 SvREFCNT_dec(output);
255 XPUSHs(sv_2mortal(newSVpvn(NULL,0))); /* undef */
256 }
257 else {
258 XPUSHs(sv_2mortal(output));
259 }
260 }
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::EAX
11
2 PROTOTYPES: DISABLE
3
24 Crypt::AuthEnc::EAX
3 _new(char * cipher_name, SV * key, SV * nonce, SV * adata=&PL_sv_undef)
5 new(Class, char * cipher_name, SV * key, SV * nonce, SV * adata=&PL_sv_undef)
46 CODE:
57 {
68 STRLEN k_len=0;
2022 h = (unsigned char *) SvPVbyte(adata, h_len);
2123 }
2224
23 id = find_cipher(cipher_name);
25 id = _find_cipher(cipher_name);
2426 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2527
26 Newz(0, RETVAL, 1, struct eax_struct);
28 Newz(0, RETVAL, 1, eax_state);
2729 if (!RETVAL) croak("FATAL: Newz failed");
2830
29 rv = eax_init(&RETVAL->state, id, k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len);
31 rv = eax_init(RETVAL, id, k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len);
3032 if (rv != CRYPT_OK) {
3133 Safefree(RETVAL);
3234 croak("FATAL: eax setup failed: %s", error_to_string(rv));
4345 Crypt::AuthEnc::EAX
4446 clone(Crypt::AuthEnc::EAX self)
4547 CODE:
46 Newz(0, RETVAL, 1, struct eax_struct);
48 Newz(0, RETVAL, 1, eax_state);
4749 if (!RETVAL) croak("FATAL: Newz failed");
48 Copy(&self->state, &RETVAL->state, 1, struct eax_struct);
50 Copy(self, RETVAL, 1, eax_state);
4951 OUTPUT:
5052 RETVAL
5153
6264 RETVAL = newSVpvn("", 0);
6365 }
6466 else {
65 RETVAL = NEWSV(0, in_data_len);
67 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
6668 SvPOK_only(RETVAL);
6769 SvCUR_set(RETVAL, in_data_len);
6870 out_data = (unsigned char *)SvPVX(RETVAL);
69 rv = eax_encrypt(&self->state, in_data, out_data, (unsigned long)in_data_len);
71 rv = eax_encrypt(self, in_data, out_data, (unsigned long)in_data_len);
7072 if (rv != CRYPT_OK) {
7173 SvREFCNT_dec(RETVAL);
7274 croak("FATAL: eax_encrypt failed: %s", error_to_string(rv));
8991 RETVAL = newSVpvn("", 0);
9092 }
9193 else {
92 RETVAL = NEWSV(0, in_data_len);
94 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
9395 SvPOK_only(RETVAL);
9496 SvCUR_set(RETVAL, in_data_len);
9597 out_data = (unsigned char *)SvPVX(RETVAL);
96 rv = eax_decrypt(&self->state, in_data, out_data, (unsigned long)in_data_len);
98 rv = eax_decrypt(self, in_data, out_data, (unsigned long)in_data_len);
9799 if (rv != CRYPT_OK) {
98100 SvREFCNT_dec(RETVAL);
99101 croak("FATAL: eax_decrypt failed: %s", error_to_string(rv));
111113 unsigned char tag[MAXBLOCKSIZE];
112114 unsigned long tag_len = sizeof(tag);
113115
114 rv = eax_done(&self->state, tag, &tag_len);
116 rv = eax_done(self, tag, &tag_len);
115117 if (rv != CRYPT_OK) croak("FATAL: eax_done failed: %s", error_to_string(rv));
116118 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
117119 }
126128 STRLEN expected_tag_len;
127129 unsigned char *expected_tag;
128130
129 rv = eax_done(&self->state, tag, &tag_len);
131 rv = eax_done(self, tag, &tag_len);
130132 if (rv != CRYPT_OK) croak("FATAL: eax_done failed: %s", error_to_string(rv));
131133 if (items == 1) {
132134 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
154156 int rv;
155157 unsigned char *h;
156158 h = (unsigned char *)SvPVbyte(adata, h_len);
157 rv = eax_addheader(&self->state, h, (unsigned long)h_len);
159 rv = eax_addheader(self, h, (unsigned long)h_len);
158160 if (rv != CRYPT_OK) croak("FATAL: eax_addheader failed: %s", error_to_string(rv));
159161 XPUSHs(ST(0)); /* return self */
160162 }
163
164 void
165 eax_encrypt_authenticate(char *cipher_name, SV *key, SV *nonce, SV *header, SV *plaintext)
166 PPCODE:
167 {
168 STRLEN k_len = 0, n_len = 0, h_len = 0, pt_len = 0;
169 unsigned char *k = NULL, *n = NULL, *h = NULL, *pt = NULL;
170 int rv, id;
171 unsigned char tag[MAXBLOCKSIZE];
172 unsigned long tag_len = sizeof(tag);
173 SV *output;
174
175 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
176 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
177 if (SvPOK(plaintext)) pt = (unsigned char *) SvPVbyte(plaintext, pt_len);
178 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
179
180 id = _find_cipher(cipher_name);
181 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
182 output = NEWSV(0, pt_len > 0 ? pt_len : 1); /* avoid zero! */
183 SvPOK_only(output);
184 SvCUR_set(output, pt_len);
185
186 rv = eax_encrypt_authenticate_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len,
187 h, (unsigned long)h_len, pt, (unsigned long)pt_len,
188 (unsigned char *)SvPVX(output), tag, &tag_len);
189
190 if (rv != CRYPT_OK) {
191 SvREFCNT_dec(output);
192 croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
193 }
194 XPUSHs(sv_2mortal(output));
195 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
196 }
197
198 void
199 eax_decrypt_verify(char *cipher_name, SV *key, SV *nonce, SV *header, SV *ciphertext, SV *tagsv)
200 PPCODE:
201 {
202 STRLEN k_len = 0, n_len = 0, h_len = 0, ct_len = 0, t_len = 0;
203 unsigned char *k = NULL, *n = NULL, *h = NULL, *ct = NULL, *t = NULL;
204 int rv, id, stat = 0;
205 unsigned char tag[MAXBLOCKSIZE];
206 unsigned long tag_len;
207 SV *output;
208
209 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
210 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
211 if (SvPOK(ciphertext)) ct = (unsigned char *) SvPVbyte(ciphertext, ct_len);
212 if (SvPOK(tagsv)) t = (unsigned char *) SvPVbyte(tagsv, t_len);
213 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
214
215 id = _find_cipher(cipher_name);
216 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
217 output = NEWSV(0, ct_len > 0 ? ct_len : 1); /* avoid zero! */
218 SvPOK_only(output);
219 SvCUR_set(output, ct_len);
220 tag_len = (unsigned long)t_len;
221 Copy(t, tag, t_len, unsigned char);
222
223 rv = eax_decrypt_verify_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len,
224 ct, (unsigned long)ct_len, (unsigned char *)SvPVX(output), tag, tag_len, &stat);
225
226 if (rv != CRYPT_OK || stat != 1) {
227 SvREFCNT_dec(output);
228 XPUSHs(sv_2mortal(newSVpvn(NULL,0))); /* undef */
229 }
230 else {
231 XPUSHs(sv_2mortal(output));
232 }
233 }
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::GCM
11
2 PROTOTYPES: DISABLE
3
24 Crypt::AuthEnc::GCM
3 _new(char * cipher_name, SV * key, SV * nonce = NULL)
5 new(Class, char * cipher_name, SV * key, SV * nonce = NULL)
46 CODE:
57 {
68 STRLEN k_len = 0, iv_len = 0;
1416 iv = (unsigned char *)SvPVbyte(nonce, iv_len);
1517 }
1618
17 id = find_cipher(cipher_name);
19 id = _find_cipher(cipher_name);
1820 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1921
20 Newz(0, RETVAL, 1, struct gcm_struct);
22 Newz(0, RETVAL, 1, gcm_state);
2123 if (!RETVAL) croak("FATAL: Newz failed");
2224
23 rv = gcm_init(&RETVAL->state, id, k, (unsigned long)k_len);
25 rv = gcm_init(RETVAL, id, k, (unsigned long)k_len);
2426 if (rv != CRYPT_OK) {
2527 Safefree(RETVAL);
2628 croak("FATAL: gcm_init failed: %s", error_to_string(rv));
2729 }
2830
2931 if (iv && iv_len > 0) {
30 rv = gcm_add_iv(&RETVAL->state, iv, (unsigned long)iv_len);
32 rv = gcm_add_iv(RETVAL, iv, (unsigned long)iv_len);
3133 if (rv != CRYPT_OK) {
3234 Safefree(RETVAL);
3335 croak("FATAL: gcm_add_iv failed: %s", error_to_string(rv));
4547 Crypt::AuthEnc::GCM
4648 clone(Crypt::AuthEnc::GCM self)
4749 CODE:
48 Newz(0, RETVAL, 1, struct gcm_struct);
50 Newz(0, RETVAL, 1, gcm_state);
4951 if (!RETVAL) croak("FATAL: Newz failed");
50 Copy(&self->state, &RETVAL->state, 1, struct gcm_struct);
52 Copy(self, RETVAL, 1, gcm_state);
5153 OUTPUT:
5254 RETVAL
5355
5658 PPCODE:
5759 {
5860 int rv;
59 rv = gcm_reset(&self->state);
61 rv = gcm_reset(self);
6062 if (rv != CRYPT_OK) croak("FATAL: gcm_reset failed: %s", error_to_string(rv));
6163 XPUSHs(ST(0)); /* return self */
6264 }
7577 }
7678 else
7779 {
78 RETVAL = NEWSV(0, in_data_len);
80 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
7981 SvPOK_only(RETVAL);
8082 SvCUR_set(RETVAL, in_data_len);
8183 out_data = (unsigned char *)SvPVX(RETVAL);
82 rv = gcm_process(&self->state, in_data, (unsigned long)in_data_len, out_data, GCM_ENCRYPT);
84 rv = gcm_process(self, in_data, (unsigned long)in_data_len, out_data, GCM_ENCRYPT);
8385 if (rv != CRYPT_OK) {
8486 SvREFCNT_dec(RETVAL);
8587 croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
98100 unsigned char *in_data;
99101
100102 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
101 rv = gcm_add_iv(&self->state, in_data, (unsigned long)in_data_len);
103 rv = gcm_add_iv(self, in_data, (unsigned long)in_data_len);
102104 if (rv != CRYPT_OK) croak("FATAL: gcm_add_iv failed: %s", error_to_string(rv));
103105 XPUSHs(ST(0)); /* return self */
104106 }
112114 unsigned char *in_data;
113115
114116 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
115 rv = gcm_add_aad(&self->state, in_data, (unsigned long)in_data_len);
117 rv = gcm_add_aad(self, in_data, (unsigned long)in_data_len);
116118 if (rv != CRYPT_OK) croak("FATAL: gcm_add_aad failed: %s", error_to_string(rv));
117119 XPUSHs(ST(0)); /* return self */
118120 }
130132 RETVAL = newSVpvn("", 0);
131133 }
132134 else {
133 RETVAL = NEWSV(0, in_data_len);
135 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
134136 SvPOK_only(RETVAL);
135137 SvCUR_set(RETVAL, in_data_len);
136138 out_data = (unsigned char *)SvPVX(RETVAL);
137 rv = gcm_process(&self->state, out_data, (unsigned long)in_data_len, in_data, GCM_DECRYPT);
139 rv = gcm_process(self, out_data, (unsigned long)in_data_len, in_data, GCM_DECRYPT);
138140 if (rv != CRYPT_OK) {
139141 SvREFCNT_dec(RETVAL);
140142 croak("FATAL: encrypt_add/gcm_process failed: %s", error_to_string(rv));
153155 unsigned char tag[MAXBLOCKSIZE];
154156 unsigned long tag_len = sizeof(tag);
155157
156 rv = gcm_done(&self->state, tag, &tag_len);
158 rv = gcm_done(self, tag, &tag_len);
157159 if (rv != CRYPT_OK) croak("FATAL: gcm_done failed: %s", error_to_string(rv));
158160 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
159161 }
168170 STRLEN expected_tag_len;
169171 unsigned char *expected_tag;
170172
171 rv = gcm_done(&self->state, tag, &tag_len);
173 rv = gcm_done(self, tag, &tag_len);
172174 if (rv != CRYPT_OK) croak("FATAL: gcm_done failed: %s", error_to_string(rv));
173175 if (items == 1) {
174176 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
187189 }
188190 }
189191 }
192
193 void
194 gcm_encrypt_authenticate(char *cipher_name, SV *key, SV *nonce, SV *header = NULL, SV *plaintext)
195 PPCODE:
196 {
197 STRLEN k_len = 0, n_len = 0, h_len = 0, pt_len = 0;
198 unsigned char *k = NULL, *n = NULL, *h = NULL, *pt = NULL;
199 int rv, id;
200 unsigned char tag[MAXBLOCKSIZE];
201 unsigned long tag_len = sizeof(tag);
202 SV *output;
203
204 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
205 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
206 if (SvPOK(plaintext)) pt = (unsigned char *) SvPVbyte(plaintext, pt_len);
207 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
208
209 id = _find_cipher(cipher_name);
210 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
211 output = NEWSV(0, pt_len > 0 ? pt_len : 1); /* avoid zero! */
212 SvPOK_only(output);
213 SvCUR_set(output, pt_len);
214
215 rv = gcm_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len,
216 pt, (unsigned long)pt_len, (unsigned char *)SvPVX(output), tag, &tag_len, GCM_ENCRYPT);
217
218 if (rv != CRYPT_OK) {
219 SvREFCNT_dec(output);
220 croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
221 }
222 XPUSHs(sv_2mortal(output));
223 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
224 }
225
226 void
227 gcm_decrypt_verify(char *cipher_name, SV *key, SV *nonce, SV *header, SV *ciphertext, SV *tagsv)
228 PPCODE:
229 {
230 STRLEN k_len = 0, n_len = 0, h_len = 0, ct_len = 0, t_len = 0;
231 unsigned char *k = NULL, *n = NULL, *h = NULL, *ct = NULL, *t = NULL;
232 int rv, id;
233 unsigned char tag[MAXBLOCKSIZE];
234 unsigned long tag_len;
235 SV *output;
236
237 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
238 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
239 if (SvPOK(ciphertext)) ct = (unsigned char *) SvPVbyte(ciphertext, ct_len);
240 if (SvPOK(tagsv)) t = (unsigned char *) SvPVbyte(tagsv, t_len);
241 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
242
243 id = _find_cipher(cipher_name);
244 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
245 output = NEWSV(0, ct_len > 0 ? ct_len : 1); /* avoid zero! */
246 SvPOK_only(output);
247 SvCUR_set(output, ct_len);
248 tag_len = (unsigned long)t_len;
249 Copy(t, tag, t_len, unsigned char);
250
251 rv = gcm_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len, h, (unsigned long)h_len,
252 (unsigned char *)SvPVX(output), (unsigned long)ct_len, ct, tag, &tag_len, GCM_DECRYPT);
253
254 if (rv != CRYPT_OK) {
255 SvREFCNT_dec(output);
256 XPUSHs(sv_2mortal(newSVpvn(NULL,0))); /* undef */
257 }
258 else {
259 XPUSHs(sv_2mortal(output));
260 }
261 }
00 MODULE = CryptX PACKAGE = Crypt::AuthEnc::OCB
11
2 PROTOTYPES: DISABLE
3
24 Crypt::AuthEnc::OCB
3 _new(char * cipher_name, SV * key, SV * nonce, unsigned long taglen)
5 new(Class, char * cipher_name, SV * key, SV * nonce, unsigned long taglen)
46 CODE:
57 {
68 STRLEN k_len=0;
1416 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
1517 n = (unsigned char *) SvPVbyte(nonce, n_len);
1618
17 id = find_cipher(cipher_name);
19 id = _find_cipher(cipher_name);
1820 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1921
20 Newz(0, RETVAL, 1, struct ocb_struct);
22 Newz(0, RETVAL, 1, ocb3_state);
2123 if (!RETVAL) croak("FATAL: Newz failed");
2224
23 rv = ocb3_init(&RETVAL->state, id, k, (unsigned long)k_len, n, (unsigned long)n_len, taglen);
25 rv = ocb3_init(RETVAL, id, k, (unsigned long)k_len, n, (unsigned long)n_len, taglen);
2426 if (rv != CRYPT_OK) {
2527 Safefree(RETVAL);
2628 croak("FATAL: ocb setup failed: %s", error_to_string(rv));
3739 Crypt::AuthEnc::OCB
3840 clone(Crypt::AuthEnc::OCB self)
3941 CODE:
40 Newz(0, RETVAL, 1, struct ocb_struct);
42 Newz(0, RETVAL, 1, ocb3_state);
4143 if (!RETVAL) croak("FATAL: Newz failed");
42 Copy(&self->state, &RETVAL->state, 1, struct ocb_struct);
44 Copy(self, RETVAL, 1, ocb3_state);
4345 OUTPUT:
4446 RETVAL
4547
5456 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
5557
5658 if (in_data_len>0) {
57 rv = ocb3_add_aad(&self->state, in_data, (unsigned long)in_data_len);
59 rv = ocb3_add_aad(self, in_data, (unsigned long)in_data_len);
5860 if (rv != CRYPT_OK) croak("FATAL: ocb3_add_aad failed: %s", error_to_string(rv));
5961 }
6062 XPUSHs(ST(0)); /* return self */
7678 if (in_data_len % 16) {
7779 croak ("FATAL: sizeof(data) should be multiple of 16");
7880 }
79 RETVAL = NEWSV(0, in_data_len);
80 SvPOK_only(RETVAL);
81 SvCUR_set(RETVAL, in_data_len);
82 out_data = (unsigned char *)SvPVX(RETVAL);
83 rv = ocb3_encrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
81 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
82 SvPOK_only(RETVAL);
83 SvCUR_set(RETVAL, in_data_len);
84 out_data = (unsigned char *)SvPVX(RETVAL);
85 rv = ocb3_encrypt(self, in_data, (unsigned long)in_data_len, out_data);
8486 if (rv != CRYPT_OK) {
8587 SvREFCNT_dec(RETVAL);
8688 croak("FATAL: ocb3_encrypt failed: %s", error_to_string(rv));
100102
101103 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
102104 if (in_data_len == 0) {
103 rv = ocb3_encrypt_last(&self->state, in_data, 0, NULL);
104 if (rv != CRYPT_OK) {
105 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
106 }
107 RETVAL = newSVpvn("", 0);
108 }
109 else {
110 RETVAL = NEWSV(0, in_data_len);
111 SvPOK_only(RETVAL);
112 SvCUR_set(RETVAL, in_data_len);
113 out_data = (unsigned char *)SvPVX(RETVAL);
114 rv = ocb3_encrypt_last(&self->state, in_data, (unsigned long)in_data_len, out_data);
105 rv = ocb3_encrypt_last(self, in_data, 0, NULL);
106 if (rv != CRYPT_OK) {
107 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
108 }
109 RETVAL = newSVpvn("", 0);
110 }
111 else {
112 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
113 SvPOK_only(RETVAL);
114 SvCUR_set(RETVAL, in_data_len);
115 out_data = (unsigned char *)SvPVX(RETVAL);
116 rv = ocb3_encrypt_last(self, in_data, (unsigned long)in_data_len, out_data);
115117 if (rv != CRYPT_OK) {
116118 SvREFCNT_dec(RETVAL);
117119 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
137139 if (in_data_len % 16) {
138140 croak ("FATAL: sizeof(data) should be multiple of 16");
139141 }
140 RETVAL = NEWSV(0, in_data_len);
141 SvPOK_only(RETVAL);
142 SvCUR_set(RETVAL, in_data_len);
143 out_data = (unsigned char *)SvPVX(RETVAL);
144 rv = ocb3_decrypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
142 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
143 SvPOK_only(RETVAL);
144 SvCUR_set(RETVAL, in_data_len);
145 out_data = (unsigned char *)SvPVX(RETVAL);
146 rv = ocb3_decrypt(self, in_data, (unsigned long)in_data_len, out_data);
145147 if (rv != CRYPT_OK) {
146148 SvREFCNT_dec(RETVAL);
147149 croak("FATAL: ocb3_decrypt failed: %s", error_to_string(rv));
161163
162164 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
163165 if (in_data_len == 0) {
164 rv = ocb3_decrypt_last(&self->state, in_data, 0, NULL);
165 if (rv != CRYPT_OK) {
166 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
167 }
168 RETVAL = newSVpvn("", 0);
169 }
170 else {
171 RETVAL = NEWSV(0, in_data_len);
172 SvPOK_only(RETVAL);
173 SvCUR_set(RETVAL, in_data_len);
174 out_data = (unsigned char *)SvPVX(RETVAL);
175 rv = ocb3_decrypt_last(&self->state, in_data, (unsigned long)in_data_len, out_data);
166 rv = ocb3_decrypt_last(self, in_data, 0, NULL);
167 if (rv != CRYPT_OK) {
168 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
169 }
170 RETVAL = newSVpvn("", 0);
171 }
172 else {
173 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
174 SvPOK_only(RETVAL);
175 SvCUR_set(RETVAL, in_data_len);
176 out_data = (unsigned char *)SvPVX(RETVAL);
177 rv = ocb3_decrypt_last(self, in_data, (unsigned long)in_data_len, out_data);
176178 if (rv != CRYPT_OK) {
177179 SvREFCNT_dec(RETVAL);
178180 croak("FATAL: ocb3_encrypt_last failed: %s", error_to_string(rv));
190192 unsigned char tag[MAXBLOCKSIZE];
191193 unsigned long tag_len = sizeof(tag);
192194
193 rv = ocb3_done(&self->state, tag, &tag_len);
195 rv = ocb3_done(self, tag, &tag_len);
194196 if (rv != CRYPT_OK) croak("FATAL: ocb3_done_encrypt failed: %s", error_to_string(rv));
195197
196198 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
206208 STRLEN expected_tag_len;
207209 unsigned char *expected_tag;
208210
209 rv = ocb3_done(&self->state, tag, &tag_len);
211 rv = ocb3_done(self, tag, &tag_len);
210212 if (rv != CRYPT_OK) croak("FATAL: ocb3_done_decrypt failed: %s", error_to_string(rv));
211213 if (items == 1) {
212214 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
225227 }
226228 }
227229 }
230
231 void
232 ocb_encrypt_authenticate(char *cipher_name, SV *key, SV *nonce, SV *header, unsigned long tag_len, SV *plaintext)
233 PPCODE:
234 {
235 STRLEN k_len = 0, n_len = 0, h_len = 0, pt_len = 0;
236 unsigned char *k = NULL, *n = NULL, *h = NULL, *pt = NULL;
237 int rv, id;
238 unsigned char tag[MAXBLOCKSIZE];
239 SV *output;
240
241 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
242 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
243 if (SvPOK(plaintext)) pt = (unsigned char *) SvPVbyte(plaintext, pt_len);
244 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
245
246 id = _find_cipher(cipher_name);
247 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
248 output = NEWSV(0, pt_len > 0 ? pt_len : 1); /* avoid zero! */
249 SvPOK_only(output);
250 SvCUR_set(output, pt_len);
251 if(tag_len < 4 || tag_len > 16) tag_len = 16;
252
253 rv = ocb3_encrypt_authenticate_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len,
254 h, (unsigned long)h_len, pt, (unsigned long)pt_len,
255 (unsigned char *)SvPVX(output), tag, &tag_len);
256
257 if (rv != CRYPT_OK) {
258 SvREFCNT_dec(output);
259 croak("FATAL: ccm_memory failed: %s", error_to_string(rv));
260 }
261 XPUSHs(sv_2mortal(output));
262 XPUSHs(sv_2mortal(newSVpvn((char*)tag, tag_len)));
263 }
264
265 void
266 ocb_decrypt_verify(char *cipher_name, SV *key, SV *nonce, SV *header, SV *ciphertext, SV *tagsv)
267 PPCODE:
268 {
269 STRLEN k_len = 0, n_len = 0, h_len = 0, ct_len = 0, t_len = 0;
270 unsigned char *k = NULL, *n = NULL, *h = NULL, *ct = NULL, *t = NULL;
271 int rv, id, stat = 0;
272 SV *output;
273
274 if (SvPOK(key)) k = (unsigned char *) SvPVbyte(key, k_len);
275 if (SvPOK(nonce)) n = (unsigned char *) SvPVbyte(nonce, n_len);
276 if (SvPOK(ciphertext)) ct = (unsigned char *) SvPVbyte(ciphertext, ct_len);
277 if (SvPOK(tagsv)) t = (unsigned char *) SvPVbyte(tagsv, t_len);
278 if (SvPOK(header)) h = (unsigned char *) SvPVbyte(header, h_len);
279
280 id = _find_cipher(cipher_name);
281 if(id==-1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
282 output = NEWSV(0, ct_len > 0 ? ct_len : 1); /* avoid zero! */
283 SvPOK_only(output);
284 SvCUR_set(output, ct_len);
285
286 rv = ocb3_decrypt_verify_memory(id, k, (unsigned long)k_len, n, (unsigned long)n_len,
287 h, (unsigned long)h_len, ct, (unsigned long)ct_len,
288 (unsigned char *)SvPVX(output), t, (unsigned long)t_len, &stat);
289
290 if (rv != CRYPT_OK || stat != 1) {
291 SvREFCNT_dec(output);
292 XPUSHs(sv_2mortal(newSVpvn(NULL,0))); /* undef */
293 }
294 else {
295 XPUSHs(sv_2mortal(output));
296 }
297 }
00 MODULE = CryptX PACKAGE = Math::BigInt::LTM
11
2 PROTOTYPES: DISABLE
23
34 ##############################################################################
45 # _new()
00 MODULE = CryptX PACKAGE = Crypt::Checksum::Adler32
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Checksum::Adler32
35 new(Class)
5052
5153 SV *
5254 digest(Crypt::Checksum::Adler32 self)
55 ALIAS:
56 hexdigest = 1
57 intdigest = 2
5358 CODE:
5459 {
55 unsigned char hash[4];
60 int rv;
61 unsigned char hash[4], out[8];
62 unsigned long outlen = 8;
63 unsigned int ui32;
64
5665 adler32_finish(self, hash, 4); /* returns void */
57 RETVAL = newSVpvn((char *) hash, 4);
66 if (ix == 1) {
67 rv = _base16_encode(hash, 4, out, &outlen);
68 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
69 RETVAL = newSVpvn((char *)out, outlen);
70 }
71 else if (ix == 2) {
72 LOAD32H(ui32, hash);
73 RETVAL = newSVuv(ui32);
74 }
75 else {
76 RETVAL = newSVpvn((char *) hash, 4);
77 }
5878 }
5979 OUTPUT:
6080 RETVAL
6181
6282 SV *
63 hexdigest(Crypt::Checksum::Adler32 self)
83 adler32_data(...)
84 ALIAS:
85 adler32_data_hex = 1
86 adler32_data_int = 2
6487 CODE:
6588 {
66 unsigned long i;
67 unsigned char hash[4];
68 char hash_hex[4*2 + 1];
69 adler32_finish(self, hash, 4); /* returns void */
70 hash_hex[0] = '\0';
71 for(i=0; i<4; i++) sprintf(&hash_hex[2*i], "%02x", hash[i]);
72 RETVAL = newSVpvn(hash_hex, strlen(hash_hex));
89 adler32_state st;
90 int rv, j;
91 unsigned char hash[4], out[8], *in;
92 unsigned long outlen = 8;
93 unsigned int ui32;
94 STRLEN inlen;
95
96 adler32_init(&st);
97 for(j = 0; j < items; j++) {
98 in = (unsigned char *)SvPVbyte(ST(j), inlen);
99 if (inlen > 0) {
100 adler32_update(&st, in, (unsigned long)inlen); /* returns void */
101 }
102 }
103 adler32_finish(&st, hash, 4); /* returns void */
104 if (ix == 1) {
105 rv = _base16_encode(hash, 4, out, &outlen);
106 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
107 RETVAL = newSVpvn((char *)out, outlen);
108 }
109 else if (ix == 2) {
110 LOAD32H(ui32, hash);
111 RETVAL = newSVuv(ui32);
112 }
113 else {
114 RETVAL = newSVpvn((char *) hash, 4);
115 }
73116 }
74117 OUTPUT:
75118 RETVAL
76
00 MODULE = CryptX PACKAGE = Crypt::Checksum::CRC32
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Checksum::CRC32
35 new(Class)
5052
5153 SV *
5254 digest(Crypt::Checksum::CRC32 self)
55 ALIAS:
56 hexdigest = 1
57 intdigest = 2
5358 CODE:
5459 {
55 unsigned char hash[4];
60 int rv;
61 unsigned char hash[4], out[8];
62 unsigned long outlen = 8;
63 unsigned int ui32;
64
5665 crc32_finish(self, hash, 4); /* returns void */
57 RETVAL = newSVpvn((char *) hash, 4);
66 if (ix == 1) {
67 rv = _base16_encode(hash, 4, out, &outlen);
68 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
69 RETVAL = newSVpvn((char *)out, outlen);
70 }
71 else if (ix == 2) {
72 LOAD32H(ui32, hash);
73 RETVAL = newSVuv(ui32);
74 }
75 else {
76 RETVAL = newSVpvn((char *) hash, 4);
77 }
5878 }
5979 OUTPUT:
6080 RETVAL
6181
6282 SV *
63 hexdigest(Crypt::Checksum::CRC32 self)
83 crc32_data(...)
84 ALIAS:
85 crc32_data_hex = 1
86 crc32_data_int = 2
6487 CODE:
6588 {
66 unsigned long i;
67 unsigned char hash[4];
68 char hash_hex[4*2 + 1];
69 crc32_finish(self, hash, 4); /* returns void */
70 hash_hex[0] = '\0';
71 for(i=0; i<4; i++) sprintf(&hash_hex[2*i], "%02x", hash[i]);
72 RETVAL = newSVpvn(hash_hex, strlen(hash_hex));
89 crc32_state st;
90 int rv, j;
91 unsigned char hash[4], out[8], *in;
92 unsigned long outlen = 8;
93 unsigned int ui32;
94 STRLEN inlen;
95
96 crc32_init(&st);
97 for(j = 0; j < items; j++) {
98 in = (unsigned char *)SvPVbyte(ST(j), inlen);
99 if (inlen > 0) {
100 crc32_update(&st, in, (unsigned long)inlen); /* returns void */
101 }
102 }
103 crc32_finish(&st, hash, 4); /* returns void */
104 if (ix == 1) {
105 rv = _base16_encode(hash, 4, out, &outlen);
106 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
107 RETVAL = newSVpvn((char *)out, outlen);
108 }
109 else if (ix == 2) {
110 LOAD32H(ui32, hash);
111 RETVAL = newSVuv(ui32);
112 }
113 else {
114 RETVAL = newSVpvn((char *) hash, 4);
115 }
73116 }
74117 OUTPUT:
75118 RETVAL
76
00 MODULE = CryptX PACKAGE = Crypt::Cipher
11
2 PROTOTYPES: DISABLE
3
24 Crypt::Cipher
3 _new(cipher_name, key, rounds=0)
4 char * cipher_name
5 SV * key
6 int rounds
5 new(char * class, ...)
76 CODE:
87 {
98 STRLEN key_len;
10 unsigned char *key_data=NULL;
11 int rv;
12 int id;
9 unsigned char *key_data = NULL;
10 SV *key;
11 char *cipher_name;
12 int rv, id, rounds = 0, idx;
13
14 /* we need to handle:
15 Crypt::Cipher->new('AES');
16 Crypt::Cipher::AES->new();
17 */
18 idx = strcmp("Crypt::Cipher", class) == 0 ? 1 : 0;
19 if (idx + 1 > items) croak("FATAL: missing argument");
20 cipher_name = SvPVX(ST(idx));
21 key = ST(idx + 1);
22 if (idx + 3 <= items) rounds = (int)SvIV(ST(idx + 2));
1323
1424 if (!SvPOK (key)) croak("FATAL: key must be string scalar");
1525 key_data = (unsigned char *)SvPVbyte(key, key_len);
1626
17 id = find_cipher(cipher_name);
27 id = _find_cipher(cipher_name);
1828 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1929
2030 Newz(0, RETVAL, 1, struct cipher_struct);
2131 if (!RETVAL) croak("FATAL: Newz failed");
2232
23 RETVAL->id = id;
2433 RETVAL->desc = &cipher_descriptor[id];
2534 rv = RETVAL->desc->setup(key_data, (int)key_len, rounds, &RETVAL->skey);
2635 if (rv != CRYPT_OK) {
3241 RETVAL
3342
3443 void
35 DESTROY(self)
36 Crypt::Cipher self
44 DESTROY(Crypt::Cipher self)
3745 CODE:
3846 Safefree(self);
3947
40 int
41 _max_keysize(self, ...)
42 Crypt::Cipher self
43 CODE:
44 RETVAL = self->desc->max_key_length;
45 OUTPUT:
46 RETVAL
47
48 int
49 _min_keysize(self, ...)
50 Crypt::Cipher self
51 CODE:
52 RETVAL = self->desc->min_key_length;
53 OUTPUT:
54 RETVAL
55
56 int
57 _blocksize(self, ...)
58 Crypt::Cipher self
59 CODE:
60 RETVAL = self->desc->block_length;
61 OUTPUT:
62 RETVAL
63
64 int
65 _default_rounds(self, ...)
66 Crypt::Cipher self
67 CODE:
68 RETVAL = self->desc->default_rounds;
69 OUTPUT:
70 RETVAL
71
7248 SV *
73 encrypt(self, data)
74 Crypt::Cipher self
75 SV * data
49 encrypt(Crypt::Cipher self, SV * data)
7650 CODE:
7751 {
7852 int rv;
8357 RETVAL = newSVpvn("", 0);
8458 }
8559 else if (len == (STRLEN)self->desc->block_length) {
86 RETVAL = NEWSV(0, len);
60 RETVAL = NEWSV(0, len); /* avoid zero! */
8761 SvPOK_only(RETVAL);
8862 SvCUR_set(RETVAL, len);
8963 rv = self->desc->ecb_encrypt((unsigned char *)plaintext, (unsigned char *)SvPVX(RETVAL), &self->skey);
10074 RETVAL
10175
10276 SV *
103 decrypt(self, data)
104 Crypt::Cipher self
105 SV * data
77 decrypt(Crypt::Cipher self, SV * data)
10678 CODE:
10779 {
10880 int rv;
11385 RETVAL = newSVpvn("", 0);
11486 }
11587 else if (len == (STRLEN)self->desc->block_length) {
116 RETVAL = NEWSV(0, len);
88 RETVAL = NEWSV(0, len); /* avoid zero! */
11789 SvPOK_only(RETVAL);
11890 SvCUR_set(RETVAL, len);
11991 rv = self->desc->ecb_decrypt((unsigned char *)ciphertext, (unsigned char *)SvPVX(RETVAL), &self->skey);
130102 RETVAL
131103
132104 int
133 _block_length_by_name(cipher_name)
134 char * cipher_name
105 blocksize(SV * param, char * extra = NULL)
135106 CODE:
136107 {
137 int rv, id;
138
139 id = find_cipher(cipher_name);
140 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
141
142 rv = cipher_descriptor[id].block_length;
143 if (!rv) XSRETURN_UNDEF;
144 RETVAL = rv;
108 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
109 IV tmp = SvIV((SV*)SvRV(param));
110 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
111 RETVAL = obj->desc->block_length;
112 }
113 else {
114 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
115 int rv, id = _find_cipher(name);
116 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
117 rv = cipher_descriptor[id].block_length;
118 if (!rv) croak("FATAL: invalid block_length for '%s'", name);
119 RETVAL = rv;
120 }
145121 }
146122 OUTPUT:
147123 RETVAL
148124
149125 int
150 _min_key_length_by_name(cipher_name)
151 char * cipher_name
126 max_keysize(SV * param, char * extra = NULL)
152127 CODE:
153128 {
154 int rv, id;
155
156 id = find_cipher(cipher_name);
157 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
158
159 rv = cipher_descriptor[id].min_key_length;
160 if (!rv) XSRETURN_UNDEF;
161 RETVAL = rv;
129 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
130 IV tmp = SvIV((SV*)SvRV(param));
131 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
132 RETVAL = obj->desc->max_key_length;
133 }
134 else {
135 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
136 int rv, id = _find_cipher(name);
137 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
138 rv = cipher_descriptor[id].max_key_length;
139 if (!rv) croak("FATAL: invalid max_key_length for '%s'", name);
140 RETVAL = rv;
141 }
162142 }
163143 OUTPUT:
164144 RETVAL
165145
166146 int
167 _max_key_length_by_name(cipher_name)
168 char * cipher_name
147 min_keysize(SV * param, char * extra = NULL)
169148 CODE:
170149 {
171 int rv, id;
172
173 id = find_cipher(cipher_name);
174 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
175
176 rv = cipher_descriptor[id].max_key_length;
177 if (!rv) XSRETURN_UNDEF;
178 RETVAL = rv;
150 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
151 IV tmp = SvIV((SV*)SvRV(param));
152 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
153 RETVAL = obj->desc->min_key_length;
154 }
155 else {
156 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
157 int rv, id = _find_cipher(name);
158 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
159 rv = cipher_descriptor[id].min_key_length;
160 if (!rv) croak("FATAL: invalid min_key_length for '%s'", name);
161 RETVAL = rv;
162 }
179163 }
180164 OUTPUT:
181165 RETVAL
182166
183167 int
184 _default_rounds_by_name(cipher_name)
185 char * cipher_name
168 default_rounds(SV * param, char * extra = NULL)
186169 CODE:
187170 {
188 int rv, id;
189
190 id = find_cipher(cipher_name);
191 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
192
193 rv = cipher_descriptor[id].default_rounds;
194 if (!rv) XSRETURN_UNDEF;
195 RETVAL = rv;
171 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Cipher")) {
172 IV tmp = SvIV((SV*)SvRV(param));
173 Crypt__Cipher obj = INT2PTR(Crypt__Cipher, tmp);
174 RETVAL = obj->desc->default_rounds;
175 }
176 else {
177 char *name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Cipher") ? SvPVX(param) : extra;
178 int rv, id = _find_cipher(name);
179 if (id == -1) croak("FATAL: find_cipher failed for '%s'", name);
180 rv = cipher_descriptor[id].default_rounds;
181 if (!rv) XSRETURN_UNDEF;
182 RETVAL = rv;
183 }
196184 }
197185 OUTPUT:
198186 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Digest
11
2 PROTOTYPES: DISABLE
3
24 Crypt::Digest
3 _new(digest_name)
4 char * digest_name
5 new(char * cname, char * pname = NULL)
56 CODE:
67 {
78 int rv;
89 int id;
10 char *digest_name = strcmp(cname, "Crypt::Digest") == 0 ? pname : cname;
911
10 id = find_hash(digest_name);
12 id = _find_hash(digest_name);
1113 if (id == -1) croak("FATAL: find_hash failed for '%s'", digest_name);
1214
1315 Newz(0, RETVAL, 1, struct digest_struct);
1416 if (!RETVAL) croak("FATAL: Newz failed");
1517
16 RETVAL->id = id;
1718 RETVAL->desc = &hash_descriptor[id];
1819 rv = RETVAL->desc->init(&RETVAL->state);
1920 if (rv != CRYPT_OK) {
2526 RETVAL
2627
2728 void
28 DESTROY(self)
29 Crypt::Digest self
29 DESTROY(Crypt::Digest self)
3030 CODE:
3131 Safefree(self);
3232
3333 void
34 reset(self)
35 Crypt::Digest self
34 reset(Crypt::Digest self)
3635 PPCODE:
3736 {
3837 int rv;
4241 }
4342
4443 Crypt::Digest
45 clone(self)
46 Crypt::Digest self
44 clone(Crypt::Digest self)
4745 CODE:
4846 Newz(0, RETVAL, 1, struct digest_struct);
4947 if (!RETVAL) croak("FATAL: Newz failed");
5957 int rv, i;
6058 unsigned char *in;
6159
62 for(i=1; i<items; i++) {
60 for(i = 1; i < items; i++) {
6361 in = (unsigned char *)SvPVbyte(ST(i), inlen);
64 if (inlen>0) {
62 if (inlen > 0) {
6563 rv = self->desc->process(&self->state, in, (unsigned long)inlen);
6664 if (rv != CRYPT_OK) croak("FATAL: digest process failed: %s", error_to_string(rv));
6765 }
7068 }
7169
7270 SV *
73 digest(self)
74 Crypt::Digest self
71 digest(Crypt::Digest self)
72 ALIAS:
73 hexdigest = 1
74 b64digest = 2
75 b64udigest = 3
7576 CODE:
7677 {
78 int rv;
79 unsigned long outlen;
7780 unsigned char hash[MAXBLOCKSIZE];
78 int rv;
81 char out[MAXBLOCKSIZE*2];
7982
8083 rv = self->desc->done(&self->state, hash);
8184 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
82 RETVAL = newSVpvn((char *) hash, self->desc->hashsize);
85
86 outlen = sizeof(out);
87 if (ix == 3) {
88 rv = base64url_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 else if (ix == 2) {
93 rv = base64_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else if (ix == 1) {
98 rv = _base16_encode(hash, self->desc->hashsize, (unsigned char *)out, &outlen);
99 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
100 RETVAL = newSVpvn(out, outlen);
101 }
102 else {
103 RETVAL = newSVpvn((char *) hash, self->desc->hashsize);
104 }
83105 }
84106 OUTPUT:
85107 RETVAL
86108
87109 SV *
88 hexdigest(self)
89 Crypt::Digest self
110 digest_data(char * digest_name, ...)
111 ALIAS:
112 digest_data_hex = 1
113 digest_data_b64 = 2
114 digest_data_b64u = 3
90115 CODE:
91116 {
92 int rv;
93 unsigned long i;
94 unsigned char hash[MAXBLOCKSIZE];
95 char hash_hex[MAXBLOCKSIZE*2 + 1];
117 STRLEN inlen;
118 int rv, id, i;
119 unsigned char *in, hash[MAXBLOCKSIZE];
120 unsigned long len = sizeof(hash), outlen;
121 char out[MAXBLOCKSIZE*2];
122 hash_state md;
96123
97 rv = self->desc->done(&self->state, hash);
124 id = _find_hash(digest_name);
125 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
126
127 /* digest_data("SHA1", $data1, $data2, $data3); */
128 len = hash_descriptor[id].hashsize;
129 rv = hash_descriptor[id].init(&md);
130 if (rv != CRYPT_OK) croak("FATAL: digest init failed: %s", error_to_string(rv));
131 for (i = 1; i < items; i++) {
132 in = (unsigned char *)SvPVbyte(ST(i), inlen);
133 if (inlen > 0) {
134 rv = hash_descriptor[id].process(&md, in, (unsigned long)inlen);
135 if (rv != CRYPT_OK) croak("FATAL: digest process failed: %s", error_to_string(rv));
136 }
137 }
138 rv = hash_descriptor[id].done(&md, hash);
98139 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
99140
100 hash_hex[0] = '\0';
101 for(i=0; i<self->desc->hashsize; i++)
102 sprintf(&hash_hex[2*i], "%02x", hash[i]);
103 RETVAL = newSVpvn(hash_hex, strlen(hash_hex));
104 }
105 OUTPUT:
106 RETVAL
107
108 SV *
109 b64digest(self)
110 Crypt::Digest self
111 CODE:
112 {
113 int rv;
114 unsigned long outlen;
115 unsigned char hash[MAXBLOCKSIZE];
116 char hash_base64[MAXBLOCKSIZE*2 + 1];
117
118 rv = self->desc->done(&self->state, hash);
119 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
120
121 outlen = sizeof(hash_base64);
122 rv = base64_encode(hash, self->desc->hashsize, (unsigned char *)hash_base64, &outlen);
123 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
124 RETVAL = newSVpvn(hash_base64, outlen);
125 }
126 OUTPUT:
127 RETVAL
128
129 SV *
130 b64udigest(self)
131 Crypt::Digest self
132 CODE:
133 {
134 int rv;
135 unsigned long outlen;
136 unsigned char hash[MAXBLOCKSIZE];
137 char hash_base64[MAXBLOCKSIZE*2 + 1];
138
139 rv = self->desc->done(&self->state, hash);
140 if (rv != CRYPT_OK) croak("FATAL: digest done failed: %s", error_to_string(rv));
141
142 outlen = sizeof(hash_base64);
143 rv = base64url_encode(hash, self->desc->hashsize, (unsigned char *)hash_base64, &outlen);
144 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
145 RETVAL = newSVpvn(hash_base64, outlen);
141 outlen = sizeof(out);
142 if (ix == 3) {
143 rv = base64url_encode(hash, len, (unsigned char *)out, &outlen);
144 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
145 RETVAL = newSVpvn((char *) out, outlen);
146 }
147 else if (ix == 2) {
148 rv = base64_encode(hash, len, (unsigned char *)out, &outlen);
149 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
150 RETVAL = newSVpvn((char *) out, outlen);
151 }
152 else if (ix == 1) {
153 rv = _base16_encode(hash, len, (unsigned char *)out, &outlen);
154 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
155 RETVAL = newSVpvn((char *) out, outlen);
156 }
157 else {
158 RETVAL = newSVpvn((char *) hash, len);
159 }
146160 }
147161 OUTPUT:
148162 RETVAL
149163
150164 int
151 _hashsize(self)
152 Crypt::Digest self
153 CODE:
154 RETVAL = self->desc->hashsize;
155 OUTPUT:
156 RETVAL
157
158 int
159 _hashsize_by_name(digest_name)
160 char * digest_name
165 hashsize(SV * param, char * extra = NULL)
161166 CODE:
162167 {
163 int rv, id;
164
165 id = find_hash(digest_name);
166 if (id == -1) croak("FATAL: find_digest failed for '%s'", digest_name);
167
168 rv = hash_descriptor[id].hashsize;
169 if (!rv) croak("FATAL: invalid hashsize for '%s'", digest_name);;
170 RETVAL = rv;
168 if (sv_isobject(param) && sv_derived_from(param, "Crypt::Digest")) {
169 IV tmp = SvIV((SV*)SvRV(param));
170 Crypt__Digest obj = INT2PTR(Crypt__Digest, tmp);
171 RETVAL = obj->desc->hashsize;
172 }
173 else {
174 char *digest_name;
175 int rv, id;
176 digest_name = SvPOK(param) && strcmp(SvPVX(param), "Crypt::Digest") ? SvPVX(param) : extra;
177 id = _find_hash(digest_name);
178 if (id == -1) croak("FATAL: find_hash failed for '%s'", digest_name);
179 rv = hash_descriptor[id].hashsize;
180 if (!rv) croak("FATAL: invalid hashsize for '%s'", digest_name);;
181 RETVAL = rv;
182 }
171183 }
172184 OUTPUT:
173185 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Digest::SHAKE
11
2 PROTOTYPES: DISABLE
3
24 Crypt::Digest::SHAKE
3 _new(int num)
5 new(Class, int num)
46 CODE:
57 {
68 int rv;
6769 int rv;
6870 unsigned char *out_data;
6971
70 RETVAL = NEWSV(0, out_len);
71 SvPOK_only(RETVAL);
72 SvCUR_set(RETVAL, out_len);
73 out_data = (unsigned char *)SvPVX(RETVAL);
74 rv = sha3_shake_done(&self->state, out_data, (unsigned long)out_len);
75 if (rv != CRYPT_OK) {
76 SvREFCNT_dec(RETVAL);
77 croak("FATAL: sha3_shake_done failed: %s", error_to_string(rv));
72 if (out_len == 0) {
73 RETVAL = newSVpvn("", 0);
74 }
75 else {
76 RETVAL = NEWSV(0, out_len); /* avoid zero! */
77 SvPOK_only(RETVAL);
78 SvCUR_set(RETVAL, out_len);
79 out_data = (unsigned char *)SvPVX(RETVAL);
80 rv = sha3_shake_done(&self->state, out_data, (unsigned long)out_len);
81 if (rv != CRYPT_OK) {
82 SvREFCNT_dec(RETVAL);
83 croak("FATAL: sha3_shake_done failed: %s", error_to_string(rv));
84 }
7885 }
7986 }
8087 OUTPUT:
00 MODULE = CryptX PACKAGE = Crypt::KeyDerivation
11
2 PROTOTYPES: DISABLE
3
24 SV *
3 _pkcs_5_alg1(SV * password, SV * salt, int iteration_count, char * hash_name, unsigned long output_len)
5 pbkdf1(SV * password, SV * salt, int iteration_count = 5000, const char * hash_name = "SHA256", unsigned long output_len = 32)
46 CODE:
57 {
6 /*
7 int pkcs_5_alg1(const unsigned char *password, unsigned long password_len,
8 const unsigned char *salt,
9 int iteration_count, int hash_idx,
10 unsigned char *out, unsigned long *outlen)
11 */
128 int rv, id;
139 unsigned char *output;
1410 unsigned char *password_ptr=NULL;
1612 unsigned char *salt_ptr=NULL;
1713 STRLEN salt_len=0;
1814
19 id = find_hash(hash_name);
20 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
15 if (output_len == 0) {
16 RETVAL = newSVpvn("", 0);
17 }
18 else {
19 id = _find_hash(hash_name);
20 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
2121
22 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
23 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
24 if (salt_len < 8) croak("FATAL: salt_len has to be 8");
22 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
23 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
24 if (salt_len < 8) croak("FATAL: salt_len has to be 8");
2525
26 RETVAL = NEWSV(0, output_len);
27 SvPOK_only(RETVAL);
28 SvCUR_set(RETVAL, output_len);
29 output = (unsigned char *)SvPVX(RETVAL);
26 RETVAL = NEWSV(0, output_len); /* avoid zero! */
27 SvPOK_only(RETVAL);
28 SvCUR_set(RETVAL, output_len);
29 output = (unsigned char *)SvPVX(RETVAL);
3030
31 rv = pkcs_5_alg1(password_ptr, (unsigned long)password_len, salt_ptr, iteration_count, id, output, &output_len);
32 if (rv != CRYPT_OK) {
33 SvREFCNT_dec(RETVAL);
34 croak("FATAL: pkcs_5_alg1 process failed: %s", error_to_string(rv));
31 rv = pkcs_5_alg1(password_ptr, (unsigned long)password_len, salt_ptr, iteration_count, id, output, &output_len);
32 if (rv != CRYPT_OK) {
33 SvREFCNT_dec(RETVAL);
34 croak("FATAL: pkcs_5_alg1 process failed: %s", error_to_string(rv));
35 }
36 SvCUR_set(RETVAL, output_len);
3537 }
36 SvCUR_set(RETVAL, output_len);
3738 }
3839 OUTPUT:
3940 RETVAL
4041
4142 SV *
42 _pkcs_5_alg2(SV * password, SV * salt, int iteration_count, char * hash_name, unsigned long output_len)
43 pbkdf2(SV * password, SV * salt, int iteration_count = 5000, const char * hash_name = "SHA256", unsigned long output_len = 32)
4344 CODE:
4445 {
45 /*
46 int pkcs_5_alg2(const unsigned char *password, unsigned long password_len,
47 const unsigned char *salt, unsigned long salt_len,
48 int iteration_count, int hash_idx,
49 unsigned char *out, unsigned long *outlen)
50 */
5146 int rv, id;
5247 unsigned char *output;
5348 unsigned char *password_ptr=NULL;
5550 unsigned char *salt_ptr=NULL;
5651 STRLEN salt_len=0;
5752
58 id = find_hash(hash_name);
59 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
53 if (output_len == 0) {
54 RETVAL = newSVpvn("", 0);
55 }
56 else {
57 id = _find_hash(hash_name);
58 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
6059
61 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
62 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
60 password_ptr = (unsigned char *)SvPVbyte(password, password_len);
61 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
6362
64 RETVAL = NEWSV(0, output_len);
65 SvPOK_only(RETVAL);
66 SvCUR_set(RETVAL, output_len);
67 output = (unsigned char *)SvPVX(RETVAL);
63 RETVAL = NEWSV(0, output_len); /* avoid zero! */
64 SvPOK_only(RETVAL);
65 SvCUR_set(RETVAL, output_len);
66 output = (unsigned char *)SvPVX(RETVAL);
6867
69 rv = pkcs_5_alg2(password_ptr, (unsigned long)password_len, salt_ptr, (unsigned long)salt_len, iteration_count, id, output, &output_len);
70 if (rv != CRYPT_OK) {
71 SvREFCNT_dec(RETVAL);
72 croak("FATAL: pkcs_5_alg2 process failed: %s", error_to_string(rv));
68 rv = pkcs_5_alg2(password_ptr, (unsigned long)password_len, salt_ptr, (unsigned long)salt_len, iteration_count, id, output, &output_len);
69 if (rv != CRYPT_OK) {
70 SvREFCNT_dec(RETVAL);
71 croak("FATAL: pkcs_5_alg2 process failed: %s", error_to_string(rv));
72 }
73 SvCUR_set(RETVAL, output_len);
7374 }
74 SvCUR_set(RETVAL, output_len);
7575 }
7676 OUTPUT:
7777 RETVAL
7878
7979 SV *
80 _hkdf_extract(char * hash_name, SV * salt, SV * in)
80 hkdf_extract(SV * in, SV * salt = &PL_sv_undef, const char * hash_name = "SHA256")
8181 CODE:
8282 {
83 /*
84 int hkdf_extract(int hash_idx, const unsigned char *salt, unsigned long saltlen,
85 const unsigned char *in, unsigned long inlen,
86 unsigned char *out, unsigned long *outlen)
87 */
8883 int rv, id;
8984 unsigned char output[MAXBLOCKSIZE];
9085 unsigned long output_len;
91 unsigned char *in_ptr=NULL;
92 STRLEN in_len=0;
93 unsigned char *salt_ptr=NULL;
94 STRLEN salt_len=0;
86 unsigned char *in_ptr = NULL, *salt_ptr = NULL;
87 STRLEN in_len = 0, salt_len = 0;
9588
96 id = find_hash(hash_name);
89 id = _find_hash(hash_name);
9790 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
9891
99 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
100 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
92 if (SvPOK(in)) in_ptr = (unsigned char *)SvPVbyte(in, in_len);
93 if (SvPOK(salt)) salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
10194
10295 output_len = sizeof(output);
10396 rv = hkdf_extract(id, salt_ptr, (unsigned long)salt_len, in_ptr, (unsigned long)in_len, output, &output_len);
109102 RETVAL
110103
111104 SV *
112 _hkdf_expand(char * hash_name, SV * info, SV * in, unsigned long output_len)
105 hkdf_expand(SV * in, const char * hash_name = "SHA256", unsigned long output_len = 32, SV * info = &PL_sv_undef)
113106 CODE:
114107 {
115 /*
116 int hkdf_expand(int hash_idx, const unsigned char *info, unsigned long infolen,
117 const unsigned char *in, unsigned long inlen,
118 unsigned char *out, unsigned long outlen)
119 */
120108 int rv, id;
121109 unsigned char *output;
122 unsigned char *in_ptr=NULL;
123 STRLEN in_len=0;
124 unsigned char *info_ptr=NULL;
125 STRLEN info_len=0;
110 unsigned char *in_ptr = NULL, *info_ptr = NULL;
111 STRLEN in_len = 0, info_len = 0;
126112
127 id = find_hash(hash_name);
128 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
113 if (output_len == 0) {
114 RETVAL = newSVpvn("", 0);
115 }
116 else {
117 id = _find_hash(hash_name);
118 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
129119
130 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
131 info_ptr = (unsigned char *)SvPVbyte(info, info_len);
120 if (SvPOK(in)) in_ptr = (unsigned char *)SvPVbyte(in, in_len);
121 if (SvPOK(info)) info_ptr = (unsigned char *)SvPVbyte(info, info_len);
132122
133 RETVAL = NEWSV(0, output_len);
134 SvPOK_only(RETVAL);
135 SvCUR_set(RETVAL, output_len);
136 output = (unsigned char *)SvPVX(RETVAL);
123 RETVAL = NEWSV(0, output_len); /* avoid zero! */
124 SvPOK_only(RETVAL);
125 SvCUR_set(RETVAL, output_len);
126 output = (unsigned char *)SvPVX(RETVAL);
137127
138 rv = hkdf_expand(id, info_ptr, (unsigned long)info_len, in_ptr, (unsigned long)in_len, output, output_len);
139 if (rv != CRYPT_OK) {
140 SvREFCNT_dec(RETVAL);
141 croak("FATAL: hkdf_expand process failed: %s", error_to_string(rv));
128 rv = hkdf_expand(id, info_ptr, (unsigned long)info_len, in_ptr, (unsigned long)in_len, output, output_len);
129 if (rv != CRYPT_OK) {
130 SvREFCNT_dec(RETVAL);
131 croak("FATAL: hkdf_expand process failed: %s", error_to_string(rv));
132 }
133 SvCUR_set(RETVAL, output_len);
142134 }
143 SvCUR_set(RETVAL, output_len);
144135 }
145136 OUTPUT:
146137 RETVAL
147138
148139 SV *
149 _hkdf(char * hash_name, SV * salt, SV * info, SV * in, unsigned long output_len)
140 hkdf(SV * in, SV * salt, const char * hash_name = "SHA256", unsigned long output_len = 32, SV * info = &PL_sv_undef)
150141 CODE:
151142 {
152 /*
153 int hkdf(int hash_idx, const unsigned char *salt, unsigned long saltlen,
154 const unsigned char *info, unsigned long infolen,
155 const unsigned char *in, unsigned long inlen,
156 unsigned char *out, unsigned long outlen)
157 */
158143 int rv, id;
159144 unsigned char *output;
160 unsigned char *in_ptr=NULL;
161 STRLEN in_len=0;
162 unsigned char *info_ptr=NULL;
163 STRLEN info_len=0;
164 unsigned char *salt_ptr=NULL;
165 STRLEN salt_len=0;
145 unsigned char *in_ptr = NULL, *info_ptr = NULL, *salt_ptr = NULL;
146 STRLEN in_len = 0, info_len = 0, salt_len = 0;
166147
167 id = find_hash(hash_name);
168 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
148 if (output_len == 0) {
149 RETVAL = newSVpvn("", 0);
150 }
151 else {
152 id = _find_hash(hash_name);
153 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
169154
170 in_ptr = (unsigned char *)SvPVbyte(in, in_len);
171 info_ptr = (unsigned char *)SvPVbyte(info, info_len);
172 salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
155 if (SvPOK(in)) in_ptr = (unsigned char *)SvPVbyte(in, in_len);
156 if (SvPOK(info)) info_ptr = (unsigned char *)SvPVbyte(info, info_len);
157 if (SvPOK(salt)) salt_ptr = (unsigned char *)SvPVbyte(salt, salt_len);
173158
174 RETVAL = NEWSV(0, output_len);
175 SvPOK_only(RETVAL);
176 SvCUR_set(RETVAL, output_len);
177 output = (unsigned char *)SvPVX(RETVAL);
159 RETVAL = NEWSV(0, output_len); /* avoid zero! */
160 SvPOK_only(RETVAL);
161 SvCUR_set(RETVAL, output_len);
162 output = (unsigned char *)SvPVX(RETVAL);
178163
179 rv = hkdf(id, salt_ptr, (unsigned long)salt_len, info_ptr, (unsigned long)info_len, in_ptr, (unsigned long)in_len, output, output_len);
180 if (rv != CRYPT_OK) {
181 SvREFCNT_dec(RETVAL);
182 croak("FATAL: hkdf_expand process failed: %s", error_to_string(rv));
164 rv = hkdf(id, salt_ptr, (unsigned long)salt_len, info_ptr, (unsigned long)info_len, in_ptr, (unsigned long)in_len, output, output_len);
165 if (rv != CRYPT_OK) {
166 SvREFCNT_dec(RETVAL);
167 croak("FATAL: hkdf_expand process failed: %s", error_to_string(rv));
168 }
169 SvCUR_set(RETVAL, output_len);
183170 }
184 SvCUR_set(RETVAL, output_len);
185171 }
186172 OUTPUT:
187173 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::BLAKE2b
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::BLAKE2b
5 _new(int size, SV * key)
7 new(Class, unsigned long size, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1214 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1315 k = (unsigned char *) SvPVbyte(key, k_len);
1416
15 Newz(0, RETVAL, 1, struct blake2b_struct);
17 Newz(0, RETVAL, 1, blake2bmac_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = blake2bmac_init(&RETVAL->state, size, k, (unsigned long)k_len);
20 rv = blake2bmac_init(RETVAL, size, k, (unsigned long)k_len);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: blake2b_init failed: %s", error_to_string(rv));
3234 Crypt::Mac::BLAKE2b
3335 clone(Crypt::Mac::BLAKE2b self)
3436 CODE:
35 Newz(0, RETVAL, 1, struct blake2b_struct);
37 Newz(0, RETVAL, 1, blake2bmac_state);
3638 if (!RETVAL) croak("FATAL: Newz failed");
37 Copy(&self->state, &RETVAL->state, 1, struct blake2b_struct);
39 Copy(self, RETVAL, 1, blake2bmac_state);
3840 OUTPUT:
3941 RETVAL
4042
4143 void
42 _add_single(Crypt::Mac::BLAKE2b self, SV * data)
43 CODE:
44 add(Crypt::Mac::BLAKE2b self, ...)
45 PPCODE:
4446 {
45 int rv;
47 int rv, i;
4648 STRLEN in_data_len;
4749 unsigned char *in_data;
4850
49 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
50 if (in_data_len>0) {
51 rv = blake2bmac_process(&self->state, in_data, (unsigned long)in_data_len);
52 if (rv != CRYPT_OK) croak("FATAL: blake2b_process failed: %s", error_to_string(rv));
51 for(i = 1; i < items; i++) {
52 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
53 if (in_data_len > 0) {
54 rv = blake2bmac_process(self, in_data, (unsigned long)in_data_len);
55 if (rv != CRYPT_OK) croak("FATAL: blake2b_process failed: %s", error_to_string(rv));
56 }
5357 }
58 XPUSHs(ST(0)); /* return self */
5459 }
5560
5661 SV *
5762 mac(Crypt::Mac::BLAKE2b self)
63 ALIAS:
64 hexmac = 1
65 b64mac = 2
66 b64umac = 3
5867 CODE:
5968 {
60 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
69 unsigned char mac[MAXBLOCKSIZE];
70 unsigned long maclen, outlen;
6271 int rv;
72 char out[MAXBLOCKSIZE*2];
6373
64 mac_len = sizeof(mac);
65 rv = blake2bmac_done(&self->state, (unsigned char*)mac, &mac_len);
74 maclen = sizeof(mac);
75 rv = blake2bmac_done(self, mac, &maclen);
6676 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
77 outlen = sizeof(out);
78 if (ix == 3) {
79 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
80 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
81 RETVAL = newSVpvn(out, outlen);
82 }
83 if (ix == 2) {
84 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
85 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
86 RETVAL = newSVpvn(out, outlen);
87 }
88 if (ix == 1) {
89 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
90 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
91 RETVAL = newSVpvn(out, outlen);
92 }
93 else {
94 RETVAL = newSVpvn((char * )mac, maclen);
95 }
6896 }
6997 OUTPUT:
7098 RETVAL
7199
72100 SV *
73 b64mac(Crypt::Mac::BLAKE2b self)
101 blake2b(unsigned long size, SV * key, ...)
102 ALIAS:
103 blake2b_hex = 1
104 blake2b_b64 = 2
105 blake2b_b64u = 3
74106 CODE:
75107 {
108 STRLEN inlen, klen;
109 unsigned char *in;
110 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
111 int rv, i;
76112 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
78 int rv;
79 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
113 unsigned long len = sizeof(mac), outlen;
114 char out[MAXBLOCKSIZE*2];
115 blake2bmac_state st;
81116
82 mac_len = sizeof(mac);
83 rv = blake2bmac_done(&self->state, mac, &mac_len);
117 if (size < len) len = size;
118 rv = blake2bmac_init(&st, len, k, (unsigned long)klen);
119 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_init failed: %s", error_to_string(rv));
120 for (i = 2; i < items; i++) {
121 in = (unsigned char *)SvPVbyte(ST(i), inlen);
122 if (inlen > 0) {
123 rv = blake2bmac_process(&st, in, (unsigned long)inlen);
124 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_process failed: %s", error_to_string(rv));
125 }
126 }
127 rv = blake2bmac_done(&st, mac, &len);
84128 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
87 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
129
130 outlen = sizeof(out);
131 if (ix == 3) {
132 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
133 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
134 RETVAL = newSVpvn((char *) out, outlen);
135 }
136 else if (ix == 2) {
137 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 1) {
142 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else {
147 RETVAL = newSVpvn((char *) mac, len);
148 }
89149 }
90150 OUTPUT:
91151 RETVAL
92
93 SV *
94 b64umac(Crypt::Mac::BLAKE2b self)
95 CODE:
96 {
97 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
99 int rv;
100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
102
103 mac_len = sizeof(mac);
104 rv = blake2bmac_done(&self->state, mac, &mac_len);
105 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
110 }
111 OUTPUT:
112 RETVAL
113
114 SV *
115 hexmac(Crypt::Mac::BLAKE2b self)
116 CODE:
117 {
118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
122
123 mac_len = sizeof(mac);
124 rv = blake2bmac_done(&self->state, mac, &mac_len);
125 if (rv != CRYPT_OK) croak("FATAL: blake2bmac_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 }
131 OUTPUT:
132 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::BLAKE2s
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::BLAKE2s
5 _new(int size, SV * key)
7 new(Class, unsigned long size, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1214 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1315 k = (unsigned char *) SvPVbyte(key, k_len);
1416
15 Newz(0, RETVAL, 1, struct blake2s_struct);
17 Newz(0, RETVAL, 1, blake2smac_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = blake2smac_init(&RETVAL->state, size, k, (unsigned long)k_len);
20 rv = blake2smac_init(RETVAL, size, k, (unsigned long)k_len);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: blake2s_init failed: %s", error_to_string(rv));
3234 Crypt::Mac::BLAKE2s
3335 clone(Crypt::Mac::BLAKE2s self)
3436 CODE:
35 Newz(0, RETVAL, 1, struct blake2s_struct);
37 Newz(0, RETVAL, 1, blake2smac_state);
3638 if (!RETVAL) croak("FATAL: Newz failed");
37 Copy(&self->state, &RETVAL->state, 1, struct blake2s_struct);
39 Copy(self, RETVAL, 1, blake2smac_state);
3840 OUTPUT:
3941 RETVAL
4042
4143 void
42 _add_single(Crypt::Mac::BLAKE2s self, SV * data)
43 CODE:
44 add(Crypt::Mac::BLAKE2s self, ...)
45 PPCODE:
4446 {
45 int rv;
47 int rv, i;
4648 STRLEN in_data_len;
4749 unsigned char *in_data;
4850
49 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
50 if (in_data_len>0) {
51 rv = blake2smac_process(&self->state, in_data, (unsigned long)in_data_len);
52 if (rv != CRYPT_OK) croak("FATAL: blake2s_process failed: %s", error_to_string(rv));
51 for(i = 1; i < items; i++) {
52 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
53 if (in_data_len > 0) {
54 rv = blake2smac_process(self, in_data, (unsigned long)in_data_len);
55 if (rv != CRYPT_OK) croak("FATAL: blake2s_process failed: %s", error_to_string(rv));
56 }
5357 }
58 XPUSHs(ST(0)); /* return self */
5459 }
5560
5661 SV *
5762 mac(Crypt::Mac::BLAKE2s self)
63 ALIAS:
64 hexmac = 1
65 b64mac = 2
66 b64umac = 3
5867 CODE:
5968 {
60 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
69 unsigned char mac[MAXBLOCKSIZE];
70 unsigned long maclen, outlen;
6271 int rv;
72 char out[MAXBLOCKSIZE*2];
6373
64 mac_len = sizeof(mac);
65 rv = blake2smac_done(&self->state, (unsigned char*)mac, &mac_len);
74 maclen = sizeof(mac);
75 rv = blake2smac_done(self, mac, &maclen);
6676 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
77 outlen = sizeof(out);
78 if (ix == 3) {
79 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
80 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
81 RETVAL = newSVpvn(out, outlen);
82 }
83 if (ix == 2) {
84 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
85 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
86 RETVAL = newSVpvn(out, outlen);
87 }
88 if (ix == 1) {
89 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
90 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
91 RETVAL = newSVpvn(out, outlen);
92 }
93 else {
94 RETVAL = newSVpvn((char * )mac, maclen);
95 }
6896 }
6997 OUTPUT:
7098 RETVAL
7199
72100 SV *
73 b64mac(Crypt::Mac::BLAKE2s self)
101 blake2s(unsigned long size, SV * key, ...)
102 ALIAS:
103 blake2s_hex = 1
104 blake2s_b64 = 2
105 blake2s_b64u = 3
74106 CODE:
75107 {
108 STRLEN inlen, klen;
109 unsigned char *in;
110 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
111 int rv, i;
76112 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
78 int rv;
79 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
113 unsigned long len = sizeof(mac), outlen;
114 char out[MAXBLOCKSIZE*2];
115 blake2smac_state st;
81116
82 mac_len = sizeof(mac);
83 rv = blake2smac_done(&self->state, mac, &mac_len);
117 if (size < len) len = size;
118 rv = blake2smac_init(&st, len, k, (unsigned long)klen);
119 if (rv != CRYPT_OK) croak("FATAL: blake2smac_init failed: %s", error_to_string(rv));
120 for (i = 2; i < items; i++) {
121 in = (unsigned char *)SvPVbyte(ST(i), inlen);
122 if (inlen > 0) {
123 rv = blake2smac_process(&st, in, (unsigned long)inlen);
124 if (rv != CRYPT_OK) croak("FATAL: blake2smac_process failed: %s", error_to_string(rv));
125 }
126 }
127 rv = blake2smac_done(&st, mac, &len);
84128 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
87 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
129
130 outlen = sizeof(out);
131 if (ix == 3) {
132 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
133 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
134 RETVAL = newSVpvn((char *) out, outlen);
135 }
136 else if (ix == 2) {
137 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 1) {
142 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else {
147 RETVAL = newSVpvn((char *) mac, len);
148 }
89149 }
90150 OUTPUT:
91151 RETVAL
92
93 SV *
94 b64umac(Crypt::Mac::BLAKE2s self)
95 CODE:
96 {
97 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
99 int rv;
100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
102
103 mac_len = sizeof(mac);
104 rv = blake2smac_done(&self->state, mac, &mac_len);
105 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
110 }
111 OUTPUT:
112 RETVAL
113
114 SV *
115 hexmac(Crypt::Mac::BLAKE2s self)
116 CODE:
117 {
118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
122
123 mac_len = sizeof(mac);
124 rv = blake2smac_done(&self->state, mac, &mac_len);
125 if (rv != CRYPT_OK) croak("FATAL: blake2smac_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 }
131 OUTPUT:
132 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::F9
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::F9
5 _new(char * cipher_name, SV * key)
7 new(Class, char * cipher_name, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1012 int rv;
1113 int id;
1214
13 id = find_cipher(cipher_name);
15 id = _find_cipher(cipher_name);
1416 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1517
1618 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1719 k = (unsigned char *) SvPVbyte(key, k_len);
1820
19 Newz(0, RETVAL, 1, struct f9_struct);
21 Newz(0, RETVAL, 1, f9_state);
2022 if (!RETVAL) croak("FATAL: Newz failed");
2123
22 rv = f9_init(&RETVAL->state, id, k, (unsigned long)k_len);
24 rv = f9_init(RETVAL, id, k, (unsigned long)k_len);
2325 if (rv != CRYPT_OK) {
2426 Safefree(RETVAL);
2527 croak("FATAL: f9_init failed: %s", error_to_string(rv));
3638 Crypt::Mac::F9
3739 clone(Crypt::Mac::F9 self)
3840 CODE:
39 Newz(0, RETVAL, 1, struct f9_struct);
41 Newz(0, RETVAL, 1, f9_state);
4042 if (!RETVAL) croak("FATAL: Newz failed");
41 Copy(&self->state, &RETVAL->state, 1, struct f9_struct);
43 Copy(self, RETVAL, 1, f9_state);
4244 OUTPUT:
4345 RETVAL
4446
4547 void
46 _add_single(Crypt::Mac::F9 self, SV * data)
47 CODE:
48 add(Crypt::Mac::F9 self, ...)
49 PPCODE:
4850 {
49 int rv;
51 int rv, i;
5052 STRLEN in_data_len;
5153 unsigned char *in_data;
5254
53 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
54 if (in_data_len>0) {
55 rv = f9_process(&self->state, in_data, (unsigned long)in_data_len);
56 if (rv != CRYPT_OK) croak("FATAL: f9_process failed: %s", error_to_string(rv));
55 for(i = 1; i < items; i++) {
56 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
57 if (in_data_len > 0) {
58 rv = f9_process(self, in_data, (unsigned long)in_data_len);
59 if (rv != CRYPT_OK) croak("FATAL: f9_process failed: %s", error_to_string(rv));
60 }
5761 }
62 XPUSHs(ST(0)); /* return self */
5863 }
5964
6065 SV *
6166 mac(Crypt::Mac::F9 self)
67 ALIAS:
68 hexmac = 1
69 b64mac = 2
70 b64umac = 3
6271 CODE:
6372 {
64 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
73 unsigned char mac[MAXBLOCKSIZE];
74 unsigned long maclen, outlen;
6675 int rv;
76 char out[MAXBLOCKSIZE*2];
6777
68 mac_len = sizeof(mac);
69 rv = f9_done(&self->state, (unsigned char*)mac, &mac_len);
78 maclen = sizeof(mac);
79 rv = f9_done(self, mac, &maclen);
7080 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
81 outlen = sizeof(out);
82 if (ix == 3) {
83 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
84 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
85 RETVAL = newSVpvn(out, outlen);
86 }
87 if (ix == 2) {
88 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 if (ix == 1) {
93 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else {
98 RETVAL = newSVpvn((char * )mac, maclen);
99 }
72100 }
73101 OUTPUT:
74102 RETVAL
75103
76104 SV *
77 b64mac(Crypt::Mac::F9 self)
105 f9(char * cipher_name, SV * key, ...)
106 ALIAS:
107 f9_hex = 1
108 f9_b64 = 2
109 f9_b64u = 3
78110 CODE:
79111 {
112 STRLEN inlen, klen;
113 unsigned char *in;
114 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
115 int rv, i;
80116 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
82 int rv;
83 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
117 unsigned long len = sizeof(mac), outlen;
118 char out[MAXBLOCKSIZE*2];
119 f9_state st;
85120
86 mac_len = sizeof(mac);
87 rv = f9_done(&self->state, mac, &mac_len);
121 int id = _find_cipher(cipher_name);
122 if (id == -1) croak("FATAL: find_cipher failed for '%s'", cipher_name);
123 rv = f9_init(&st, id, k, (unsigned long)klen);
124 if (rv != CRYPT_OK) croak("FATAL: f9_init failed: %s", error_to_string(rv));
125 for (i = 2; i < items; i++) {
126 in = (unsigned char *)SvPVbyte(ST(i), inlen);
127 if (inlen > 0) {
128 rv = f9_process(&st, in, (unsigned long)inlen);
129 if (rv != CRYPT_OK) croak("FATAL: f9_process failed: %s", error_to_string(rv));
130 }
131 }
132 rv = f9_done(&st, mac, &len);
88133 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
91 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
134
135 outlen = sizeof(out);
136 if (ix == 3) {
137 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 2) {
142 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else if (ix == 1) {
147 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
148 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
149 RETVAL = newSVpvn((char *) out, outlen);
150 }
151 else {
152 RETVAL = newSVpvn((char *) mac, len);
153 }
93154 }
94155 OUTPUT:
95156 RETVAL
96
97 SV *
98 b64umac(Crypt::Mac::F9 self)
99 CODE:
100 {
101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
103 int rv;
104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
106
107 mac_len = sizeof(mac);
108 rv = f9_done(&self->state, mac, &mac_len);
109 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
114 }
115 OUTPUT:
116 RETVAL
117
118 SV *
119 hexmac(Crypt::Mac::F9 self)
120 CODE:
121 {
122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
126
127 mac_len = sizeof(mac);
128 rv = f9_done(&self->state, mac, &mac_len);
129 if (rv != CRYPT_OK) croak("FATAL: f9_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
134 }
135 OUTPUT:
136 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::HMAC
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::HMAC
5 _new(char * hash_name, SV * key)
7 new(Class, char * hash_name, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1012 int rv;
1113 int id;
1214
13 id = find_hash(hash_name);
15 id = _find_hash(hash_name);
1416 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
1517
1618 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1719 k = (unsigned char *) SvPVbyte(key, k_len);
1820
19 Newz(0, RETVAL, 1, struct hmac_struct);
21 Newz(0, RETVAL, 1, hmac_state);
2022 if (!RETVAL) croak("FATAL: Newz failed");
2123
22 rv = hmac_init(&RETVAL->state, id, k, (unsigned long)k_len);
24 rv = hmac_init(RETVAL, id, k, (unsigned long)k_len);
2325 if (rv != CRYPT_OK) {
2426 Safefree(RETVAL);
2527 croak("FATAL: hmac_init failed: %s", error_to_string(rv));
3638 Crypt::Mac::HMAC
3739 clone(Crypt::Mac::HMAC self)
3840 CODE:
39 Newz(0, RETVAL, 1, struct hmac_struct);
41 Newz(0, RETVAL, 1, hmac_state);
4042 if (!RETVAL) croak("FATAL: Newz failed");
41 Copy(&self->state, &RETVAL->state, 1, struct hmac_struct);
43 Copy(self, RETVAL, 1, hmac_state);
4244 OUTPUT:
4345 RETVAL
4446
4547 void
46 _add_single(Crypt::Mac::HMAC self, SV * data)
47 CODE:
48 add(Crypt::Mac::HMAC self, ...)
49 PPCODE:
4850 {
49 int rv;
51 int rv, i;
5052 STRLEN in_data_len;
5153 unsigned char *in_data;
5254
53 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
54 if (in_data_len>0) {
55 rv = hmac_process(&self->state, in_data, (unsigned long)in_data_len);
56 if (rv != CRYPT_OK) croak("FATAL: hmac_process failed: %s", error_to_string(rv));
55 for(i = 1; i < items; i++) {
56 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
57 if (in_data_len > 0) {
58 rv = hmac_process(self, in_data, (unsigned long)in_data_len);
59 if (rv != CRYPT_OK) croak("FATAL: hmac_process failed: %s", error_to_string(rv));
60 }
5761 }
62 XPUSHs(ST(0)); /* return self */
5863 }
5964
6065 SV *
6166 mac(Crypt::Mac::HMAC self)
67 ALIAS:
68 hexmac = 1
69 b64mac = 2
70 b64umac = 3
6271 CODE:
6372 {
64 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
73 unsigned char mac[MAXBLOCKSIZE];
74 unsigned long maclen, outlen;
6675 int rv;
76 char out[MAXBLOCKSIZE*2];
6777
68 mac_len = sizeof(mac);
69 rv = hmac_done(&self->state, (unsigned char*)mac, &mac_len);
78 maclen = sizeof(mac);
79 rv = hmac_done(self, mac, &maclen);
7080 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
81 outlen = sizeof(out);
82 if (ix == 3) {
83 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
84 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
85 RETVAL = newSVpvn(out, outlen);
86 }
87 if (ix == 2) {
88 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 if (ix == 1) {
93 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else {
98 RETVAL = newSVpvn((char * )mac, maclen);
99 }
72100 }
73101 OUTPUT:
74102 RETVAL
75103
76104 SV *
77 b64mac(Crypt::Mac::HMAC self)
105 hmac(char * hash_name, SV * key, ...)
106 ALIAS:
107 hmac_hex = 1
108 hmac_b64 = 2
109 hmac_b64u = 3
78110 CODE:
79111 {
112 STRLEN inlen, klen;
113 unsigned char *in;
114 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
115 int rv, i;
80116 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
82 int rv;
83 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
117 unsigned long len = sizeof(mac), outlen;
118 char out[MAXBLOCKSIZE*2];
119 hmac_state st;
85120
86 mac_len = sizeof(mac);
87 rv = hmac_done(&self->state, mac, &mac_len);
121 int id = _find_hash(hash_name);
122 if (id == -1) croak("FATAL: find_digest failed for '%s'", hash_name);
123 rv = hmac_init(&st, id, k, (unsigned long)klen);
124 if (rv != CRYPT_OK) croak("FATAL: hmac_init failed: %s", error_to_string(rv));
125 for (i = 2; i < items; i++) {
126 in = (unsigned char *)SvPVbyte(ST(i), inlen);
127 if (inlen > 0) {
128 rv = hmac_process(&st, in, (unsigned long)inlen);
129 if (rv != CRYPT_OK) croak("FATAL: hmac_process failed: %s", error_to_string(rv));
130 }
131 }
132 rv = hmac_done(&st, mac, &len);
88133 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
91 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
134
135 outlen = sizeof(out);
136 if (ix == 3) {
137 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 2) {
142 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else if (ix == 1) {
147 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
148 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
149 RETVAL = newSVpvn((char *) out, outlen);
150 }
151 else {
152 RETVAL = newSVpvn((char *) mac, len);
153 }
93154 }
94155 OUTPUT:
95156 RETVAL
96
97 SV *
98 b64umac(Crypt::Mac::HMAC self)
99 CODE:
100 {
101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
103 int rv;
104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
106
107 mac_len = sizeof(mac);
108 rv = hmac_done(&self->state, mac, &mac_len);
109 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
114 }
115 OUTPUT:
116 RETVAL
117
118 SV *
119 hexmac(Crypt::Mac::HMAC self)
120 CODE:
121 {
122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
126
127 mac_len = sizeof(mac);
128 rv = hmac_done(&self->state, mac, &mac_len);
129 if (rv != CRYPT_OK) croak("FATAL: hmac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
134 }
135 OUTPUT:
136 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::OMAC
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::OMAC
5 _new(char * cipher_name, SV * key)
7 new(Class, char * cipher_name, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1012 int rv;
1113 int id;
1214
13 id = find_cipher(cipher_name);
15 id = _find_cipher(cipher_name);
1416 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1517
1618 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1719 k = (unsigned char *) SvPVbyte(key, k_len);
1820
19 Newz(0, RETVAL, 1, struct omac_struct);
21 Newz(0, RETVAL, 1, omac_state);
2022 if (!RETVAL) croak("FATAL: Newz failed");
2123
22 rv = omac_init(&RETVAL->state, id, k, (unsigned long)k_len);
24 rv = omac_init(RETVAL, id, k, (unsigned long)k_len);
2325 if (rv != CRYPT_OK) {
2426 Safefree(RETVAL);
2527 croak("FATAL: omac_init failed: %s", error_to_string(rv));
3638 Crypt::Mac::OMAC
3739 clone(Crypt::Mac::OMAC self)
3840 CODE:
39 Newz(0, RETVAL, 1, struct omac_struct);
41 Newz(0, RETVAL, 1, omac_state);
4042 if (!RETVAL) croak("FATAL: Newz failed");
41 Copy(&self->state, &RETVAL->state, 1, struct omac_struct);
43 Copy(self, RETVAL, 1, omac_state);
4244 OUTPUT:
4345 RETVAL
4446
4547 void
46 _add_single(Crypt::Mac::OMAC self, SV * data)
47 CODE:
48 add(Crypt::Mac::OMAC self, ...)
49 PPCODE:
4850 {
49 int rv;
51 int rv, i;
5052 STRLEN in_data_len;
5153 unsigned char *in_data;
5254
53 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
54 if (in_data_len>0) {
55 rv = omac_process(&self->state, in_data, (unsigned long)in_data_len);
56 if (rv != CRYPT_OK) croak("FATAL: omac_process failed: %s", error_to_string(rv));
55 for(i = 1; i < items; i++) {
56 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
57 if (in_data_len > 0) {
58 rv = omac_process(self, in_data, (unsigned long)in_data_len);
59 if (rv != CRYPT_OK) croak("FATAL: omac_process failed: %s", error_to_string(rv));
60 }
5761 }
62 XPUSHs(ST(0)); /* return self */
5863 }
5964
6065 SV *
6166 mac(Crypt::Mac::OMAC self)
67 ALIAS:
68 hexmac = 1
69 b64mac = 2
70 b64umac = 3
6271 CODE:
6372 {
64 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
73 unsigned char mac[MAXBLOCKSIZE];
74 unsigned long maclen, outlen;
6675 int rv;
76 char out[MAXBLOCKSIZE*2];
6777
68 mac_len = sizeof(mac);
69 rv = omac_done(&self->state, (unsigned char*)mac, &mac_len);
78 maclen = sizeof(mac);
79 rv = omac_done(self, mac, &maclen);
7080 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
81 outlen = sizeof(out);
82 if (ix == 3) {
83 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
84 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
85 RETVAL = newSVpvn(out, outlen);
86 }
87 if (ix == 2) {
88 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 if (ix == 1) {
93 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else {
98 RETVAL = newSVpvn((char * )mac, maclen);
99 }
72100 }
73101 OUTPUT:
74102 RETVAL
75103
76104 SV *
77 b64mac(Crypt::Mac::OMAC self)
105 omac(char * cipher_name, SV * key, ...)
106 ALIAS:
107 omac_hex = 1
108 omac_b64 = 2
109 omac_b64u = 3
78110 CODE:
79111 {
112 STRLEN inlen, klen;
113 unsigned char *in;
114 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
115 int rv, i;
80116 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
82 int rv;
83 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
117 unsigned long len = sizeof(mac), outlen;
118 char out[MAXBLOCKSIZE*2];
119 omac_state st;
85120
86 mac_len = sizeof(mac);
87 rv = omac_done(&self->state, mac, &mac_len);
121 int id = _find_cipher(cipher_name);
122 if (id == -1) croak("FATAL: find_cipher failed for '%s'", cipher_name);
123 rv = omac_init(&st, id, k, (unsigned long)klen);
124 if (rv != CRYPT_OK) croak("FATAL: omac_init failed: %s", error_to_string(rv));
125 for (i = 2; i < items; i++) {
126 in = (unsigned char *)SvPVbyte(ST(i), inlen);
127 if (inlen > 0) {
128 rv = omac_process(&st, in, (unsigned long)inlen);
129 if (rv != CRYPT_OK) croak("FATAL: omac_process failed: %s", error_to_string(rv));
130 }
131 }
132 rv = omac_done(&st, mac, &len);
88133 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
91 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
134
135 outlen = sizeof(out);
136 if (ix == 3) {
137 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 2) {
142 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else if (ix == 1) {
147 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
148 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
149 RETVAL = newSVpvn((char *) out, outlen);
150 }
151 else {
152 RETVAL = newSVpvn((char *) mac, len);
153 }
93154 }
94155 OUTPUT:
95156 RETVAL
96
97 SV *
98 b64umac(Crypt::Mac::OMAC self)
99 CODE:
100 {
101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
103 int rv;
104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
106
107 mac_len = sizeof(mac);
108 rv = omac_done(&self->state, mac, &mac_len);
109 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
114 }
115 OUTPUT:
116 RETVAL
117
118 SV *
119 hexmac(Crypt::Mac::OMAC self)
120 CODE:
121 {
122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
126
127 mac_len = sizeof(mac);
128 rv = omac_done(&self->state, mac, &mac_len);
129 if (rv != CRYPT_OK) croak("FATAL: omac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
134 }
135 OUTPUT:
136 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::PMAC
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::PMAC
5 _new(char * cipher_name, SV * key)
7 new(Class, char * cipher_name, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1012 int rv;
1113 int id;
1214
13 id = find_cipher(cipher_name);
15 id = _find_cipher(cipher_name);
1416 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1517
1618 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1719 k = (unsigned char *) SvPVbyte(key, k_len);
1820
19 Newz(0, RETVAL, 1, struct pmac_struct);
21 Newz(0, RETVAL, 1, pmac_state);
2022 if (!RETVAL) croak("FATAL: Newz failed");
2123
22 rv = pmac_init(&RETVAL->state, id, k, (unsigned long)k_len);
24 rv = pmac_init(RETVAL, id, k, (unsigned long)k_len);
2325 if (rv != CRYPT_OK) {
2426 Safefree(RETVAL);
2527 croak("FATAL: pmac_init failed: %s", error_to_string(rv));
3638 Crypt::Mac::PMAC
3739 clone(Crypt::Mac::PMAC self)
3840 CODE:
39 Newz(0, RETVAL, 1, struct pmac_struct);
41 Newz(0, RETVAL, 1, pmac_state);
4042 if (!RETVAL) croak("FATAL: Newz failed");
41 Copy(&self->state, &RETVAL->state, 1, struct pmac_struct);
43 Copy(self, RETVAL, 1, pmac_state);
4244 OUTPUT:
4345 RETVAL
4446
4547 void
46 _add_single(Crypt::Mac::PMAC self, SV * data)
47 CODE:
48 add(Crypt::Mac::PMAC self, ...)
49 PPCODE:
4850 {
49 int rv;
51 int rv, i;
5052 STRLEN in_data_len;
5153 unsigned char *in_data;
5254
53 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
54 if (in_data_len>0) {
55 rv = pmac_process(&self->state, in_data, (unsigned long)in_data_len);
56 if (rv != CRYPT_OK) croak("FATAL: pmac_process failed: %s", error_to_string(rv));
55 for(i = 1; i < items; i++) {
56 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
57 if (in_data_len > 0) {
58 rv = pmac_process(self, in_data, (unsigned long)in_data_len);
59 if (rv != CRYPT_OK) croak("FATAL: pmac_process failed: %s", error_to_string(rv));
60 }
5761 }
62 XPUSHs(ST(0)); /* return self */
5863 }
5964
6065 SV *
6166 mac(Crypt::Mac::PMAC self)
67 ALIAS:
68 hexmac = 1
69 b64mac = 2
70 b64umac = 3
6271 CODE:
6372 {
64 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
73 unsigned char mac[MAXBLOCKSIZE];
74 unsigned long maclen, outlen;
6675 int rv;
76 char out[MAXBLOCKSIZE*2];
6777
68 mac_len = sizeof(mac);
69 rv = pmac_done(&self->state, (unsigned char*)mac, &mac_len);
78 maclen = sizeof(mac);
79 rv = pmac_done(self, mac, &maclen);
7080 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
81 outlen = sizeof(out);
82 if (ix == 3) {
83 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
84 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
85 RETVAL = newSVpvn(out, outlen);
86 }
87 if (ix == 2) {
88 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 if (ix == 1) {
93 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else {
98 RETVAL = newSVpvn((char * )mac, maclen);
99 }
72100 }
73101 OUTPUT:
74102 RETVAL
75103
76104 SV *
77 b64mac(Crypt::Mac::PMAC self)
105 pmac(char * cipher_name, SV * key, ...)
106 ALIAS:
107 pmac_hex = 1
108 pmac_b64 = 2
109 pmac_b64u = 3
78110 CODE:
79111 {
112 STRLEN inlen, klen;
113 unsigned char *in;
114 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
115 int rv, i;
80116 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
82 int rv;
83 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
117 unsigned long len = sizeof(mac), outlen;
118 char out[MAXBLOCKSIZE*2];
119 pmac_state st;
85120
86 mac_len = sizeof(mac);
87 rv = pmac_done(&self->state, mac, &mac_len);
121 int id = _find_cipher(cipher_name);
122 if (id == -1) croak("FATAL: find_cipher failed for '%s'", cipher_name);
123 rv = pmac_init(&st, id, k, (unsigned long)klen);
124 if (rv != CRYPT_OK) croak("FATAL: pmac_init failed: %s", error_to_string(rv));
125 for (i = 2; i < items; i++) {
126 in = (unsigned char *)SvPVbyte(ST(i), inlen);
127 if (inlen > 0) {
128 rv = pmac_process(&st, in, (unsigned long)inlen);
129 if (rv != CRYPT_OK) croak("FATAL: pmac_process failed: %s", error_to_string(rv));
130 }
131 }
132 rv = pmac_done(&st, mac, &len);
88133 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
91 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
134
135 outlen = sizeof(out);
136 if (ix == 3) {
137 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 2) {
142 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else if (ix == 1) {
147 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
148 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
149 RETVAL = newSVpvn((char *) out, outlen);
150 }
151 else {
152 RETVAL = newSVpvn((char *) mac, len);
153 }
93154 }
94155 OUTPUT:
95156 RETVAL
96
97 SV *
98 b64umac(Crypt::Mac::PMAC self)
99 CODE:
100 {
101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
103 int rv;
104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
106
107 mac_len = sizeof(mac);
108 rv = pmac_done(&self->state, mac, &mac_len);
109 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
114 }
115 OUTPUT:
116 RETVAL
117
118 SV *
119 hexmac(Crypt::Mac::PMAC self)
120 CODE:
121 {
122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
126
127 mac_len = sizeof(mac);
128 rv = pmac_done(&self->state, mac, &mac_len);
129 if (rv != CRYPT_OK) croak("FATAL: pmac_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
134 }
135 OUTPUT:
136 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::Pelican
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::Pelican
5 _new(SV * key)
7 new(Class, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1214 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1315 k = (unsigned char *) SvPVbyte(key, k_len);
1416
15 Newz(0, RETVAL, 1, struct pelican_struct);
17 Newz(0, RETVAL, 1, pelican_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = pelican_init(&RETVAL->state, k, (unsigned long)k_len);
20 rv = pelican_init(RETVAL, k, (unsigned long)k_len);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: pelican_init failed: %s", error_to_string(rv));
3234 Crypt::Mac::Pelican
3335 clone(Crypt::Mac::Pelican self)
3436 CODE:
35 Newz(0, RETVAL, 1, struct pelican_struct);
37 Newz(0, RETVAL, 1, pelican_state);
3638 if (!RETVAL) croak("FATAL: Newz failed");
37 Copy(&self->state, &RETVAL->state, 1, struct pelican_struct);
39 Copy(self, RETVAL, 1, pelican_state);
3840 OUTPUT:
3941 RETVAL
4042
4143 void
42 _add_single(Crypt::Mac::Pelican self, SV * data)
43 CODE:
44 add(Crypt::Mac::Pelican self, ...)
45 PPCODE:
4446 {
45 int rv;
47 int rv, i;
4648 STRLEN in_data_len;
4749 unsigned char *in_data;
4850
49 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
50 if (in_data_len>0) {
51 rv = pelican_process(&self->state, in_data, (unsigned long)in_data_len);
52 if (rv != CRYPT_OK) croak("FATAL: pelican_process failed: %s", error_to_string(rv));
51 for(i = 1; i < items; i++) {
52 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
53 if (in_data_len > 0) {
54 rv = pelican_process(self, in_data, (unsigned long)in_data_len);
55 if (rv != CRYPT_OK) croak("FATAL: pelican_process failed: %s", error_to_string(rv));
56 }
5357 }
58 XPUSHs(ST(0)); /* return self */
5459 }
5560
5661 SV *
5762 mac(Crypt::Mac::Pelican self)
63 ALIAS:
64 hexmac = 1
65 b64mac = 2
66 b64umac = 3
5867 CODE:
5968 {
60 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
69 unsigned char mac[MAXBLOCKSIZE];
70 unsigned long maclen, outlen;
6271 int rv;
72 char out[MAXBLOCKSIZE*2];
6373
64 mac_len = 16;
65 rv = pelican_done(&self->state, (unsigned char*)mac);
74 maclen = 16;
75 rv = pelican_done(self, mac);
6676 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
77 outlen = sizeof(out);
78 if (ix == 3) {
79 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
80 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
81 RETVAL = newSVpvn(out, outlen);
82 }
83 if (ix == 2) {
84 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
85 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
86 RETVAL = newSVpvn(out, outlen);
87 }
88 if (ix == 1) {
89 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
90 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
91 RETVAL = newSVpvn(out, outlen);
92 }
93 else {
94 RETVAL = newSVpvn((char * )mac, maclen);
95 }
6896 }
6997 OUTPUT:
7098 RETVAL
7199
72100 SV *
73 b64mac(Crypt::Mac::Pelican self)
101 pelican(SV * key, ...)
102 ALIAS:
103 pelican_hex = 1
104 pelican_b64 = 2
105 pelican_b64u = 3
74106 CODE:
75107 {
108 STRLEN inlen, klen;
109 unsigned char *in;
110 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
111 int rv, i;
76112 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
78 int rv;
79 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
113 unsigned long len = sizeof(mac), outlen;
114 char out[MAXBLOCKSIZE*2];
115 pelican_state st;
81116
82 mac_len = 16;
83 rv = pelican_done(&self->state, mac);
117 len = 16;
118 rv = pelican_init(&st, k, (unsigned long)klen);
119 if (rv != CRYPT_OK) croak("FATAL: pelican_init failed: %s", error_to_string(rv));
120 for (i = 1; i < items; i++) {
121 in = (unsigned char *)SvPVbyte(ST(i), inlen);
122 if (inlen > 0) {
123 rv = pelican_process(&st, in, (unsigned long)inlen);
124 if (rv != CRYPT_OK) croak("FATAL: pelican_process failed: %s", error_to_string(rv));
125 }
126 }
127 rv = pelican_done(&st, mac);
84128 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
87 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
129
130 outlen = sizeof(out);
131 if (ix == 3) {
132 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
133 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
134 RETVAL = newSVpvn((char *) out, outlen);
135 }
136 else if (ix == 2) {
137 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 1) {
142 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else {
147 RETVAL = newSVpvn((char *) mac, len);
148 }
89149 }
90150 OUTPUT:
91151 RETVAL
92
93 SV *
94 b64umac(Crypt::Mac::Pelican self)
95 CODE:
96 {
97 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
99 int rv;
100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
102
103 mac_len = 16;
104 rv = pelican_done(&self->state, mac);
105 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
110 }
111 OUTPUT:
112 RETVAL
113
114 SV *
115 hexmac(Crypt::Mac::Pelican self)
116 CODE:
117 {
118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
122
123 mac_len = 16;
124 rv = pelican_done(&self->state, mac);
125 if (rv != CRYPT_OK) croak("FATAL: pelican_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 }
131 OUTPUT:
132 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::Poly1305
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::Poly1305
5 _new(SV * key)
7 new(Class, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1214 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1315 k = (unsigned char *) SvPVbyte(key, k_len);
1416
15 Newz(0, RETVAL, 1, struct poly1305_struct);
17 Newz(0, RETVAL, 1, poly1305_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = poly1305_init(&RETVAL->state, k, (unsigned long)k_len);
20 rv = poly1305_init(RETVAL, k, (unsigned long)k_len);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: poly1305_init failed: %s", error_to_string(rv));
3234 Crypt::Mac::Poly1305
3335 clone(Crypt::Mac::Poly1305 self)
3436 CODE:
35 Newz(0, RETVAL, 1, struct poly1305_struct);
37 Newz(0, RETVAL, 1, poly1305_state);
3638 if (!RETVAL) croak("FATAL: Newz failed");
37 Copy(&self->state, &RETVAL->state, 1, struct poly1305_struct);
39 Copy(self, RETVAL, 1, poly1305_state);
3840 OUTPUT:
3941 RETVAL
4042
4143 void
42 _add_single(Crypt::Mac::Poly1305 self, SV * data)
43 CODE:
44 add(Crypt::Mac::Poly1305 self, ...)
45 PPCODE:
4446 {
45 int rv;
47 int rv, i;
4648 STRLEN in_data_len;
4749 unsigned char *in_data;
4850
49 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
50 if (in_data_len>0) {
51 rv = poly1305_process(&self->state, in_data, (unsigned long)in_data_len);
52 if (rv != CRYPT_OK) croak("FATAL: poly1305_process failed: %s", error_to_string(rv));
51 for(i = 1; i < items; i++) {
52 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
53 if (in_data_len > 0) {
54 rv = poly1305_process(self, in_data, (unsigned long)in_data_len);
55 if (rv != CRYPT_OK) croak("FATAL: poly1305_process failed: %s", error_to_string(rv));
56 }
5357 }
58 XPUSHs(ST(0)); /* return self */
5459 }
5560
5661 SV *
5762 mac(Crypt::Mac::Poly1305 self)
63 ALIAS:
64 hexmac = 1
65 b64mac = 2
66 b64umac = 3
5867 CODE:
5968 {
60 char mac[MAXBLOCKSIZE];
61 unsigned long mac_len;
69 unsigned char mac[MAXBLOCKSIZE];
70 unsigned long maclen, outlen;
6271 int rv;
72 char out[MAXBLOCKSIZE*2];
6373
64 mac_len = sizeof(mac);
65 rv = poly1305_done(&self->state, (unsigned char*)mac, &mac_len);
74 maclen = sizeof(mac);
75 rv = poly1305_done(self, mac, &maclen);
6676 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
67 RETVAL = newSVpvn(mac, mac_len);
77 outlen = sizeof(out);
78 if (ix == 3) {
79 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
80 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
81 RETVAL = newSVpvn(out, outlen);
82 }
83 if (ix == 2) {
84 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
85 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
86 RETVAL = newSVpvn(out, outlen);
87 }
88 if (ix == 1) {
89 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
90 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
91 RETVAL = newSVpvn(out, outlen);
92 }
93 else {
94 RETVAL = newSVpvn((char * )mac, maclen);
95 }
6896 }
6997 OUTPUT:
7098 RETVAL
7199
72100 SV *
73 b64mac(Crypt::Mac::Poly1305 self)
101 poly1305(SV * key, ...)
102 ALIAS:
103 poly1305_hex = 1
104 poly1305_b64 = 2
105 poly1305_b64u = 3
74106 CODE:
75107 {
108 STRLEN inlen, klen;
109 unsigned char *in;
110 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
111 int rv, i;
76112 unsigned char mac[MAXBLOCKSIZE];
77 unsigned long mac_len;
78 int rv;
79 unsigned long outlen;
80 char mac_base64[MAXBLOCKSIZE*2 + 1];
113 unsigned long len = sizeof(mac), outlen;
114 char out[MAXBLOCKSIZE*2];
115 poly1305_state st;
81116
82 mac_len = sizeof(mac);
83 rv = poly1305_done(&self->state, mac, &mac_len);
117 rv = poly1305_init(&st, k, (unsigned long)klen);
118 if (rv != CRYPT_OK) croak("FATAL: poly1305_init failed: %s", error_to_string(rv));
119 for (i = 1; i < items; i++) {
120 in = (unsigned char *)SvPVbyte(ST(i), inlen);
121 if (inlen > 0) {
122 rv = poly1305_process(&st, in, (unsigned long)inlen);
123 if (rv != CRYPT_OK) croak("FATAL: poly1305_process failed: %s", error_to_string(rv));
124 }
125 }
126 rv = poly1305_done(&st, mac, &len);
84127 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
85 outlen = sizeof(mac_base64);
86 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
87 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
88 RETVAL = newSVpvn(mac_base64, outlen);
128
129 outlen = sizeof(out);
130 if (ix == 3) {
131 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
132 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
133 RETVAL = newSVpvn((char *) out, outlen);
134 }
135 else if (ix == 2) {
136 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
137 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
138 RETVAL = newSVpvn((char *) out, outlen);
139 }
140 else if (ix == 1) {
141 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
142 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
143 RETVAL = newSVpvn((char *) out, outlen);
144 }
145 else {
146 RETVAL = newSVpvn((char *) mac, len);
147 }
89148 }
90149 OUTPUT:
91150 RETVAL
92
93 SV *
94 b64umac(Crypt::Mac::Poly1305 self)
95 CODE:
96 {
97 unsigned char mac[MAXBLOCKSIZE];
98 unsigned long mac_len;
99 int rv;
100 unsigned long outlen;
101 char mac_base64[MAXBLOCKSIZE*2 + 1];
102
103 mac_len = sizeof(mac);
104 rv = poly1305_done(&self->state, mac, &mac_len);
105 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
106 outlen = sizeof(mac_base64);
107 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
108 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
109 RETVAL = newSVpvn(mac_base64, outlen);
110 }
111 OUTPUT:
112 RETVAL
113
114 SV *
115 hexmac(Crypt::Mac::Poly1305 self)
116 CODE:
117 {
118 unsigned char mac[MAXBLOCKSIZE];
119 unsigned long mac_len, i;
120 int rv;
121 char mac_hex[MAXBLOCKSIZE*2 + 1];
122
123 mac_len = sizeof(mac);
124 rv = poly1305_done(&self->state, mac, &mac_len);
125 if (rv != CRYPT_OK) croak("FATAL: poly1305_done failed: %s", error_to_string(rv));
126 mac_hex[0] = '\0';
127 for(i=0; i<mac_len; i++)
128 sprintf(&mac_hex[2*i], "%02x", mac[i]);
129 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
130 }
131 OUTPUT:
132 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mac::XCBC
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mac::XCBC
5 _new(char * cipher_name, SV * key)
7 new(Class, char * cipher_name, SV * key)
68 CODE:
79 {
810 STRLEN k_len=0;
1012 int rv;
1113 int id;
1214
13 id = find_cipher(cipher_name);
15 id = _find_cipher(cipher_name);
1416 if (id == -1) croak("FATAL: find_cipfer failed for '%s'", cipher_name);
1517
1618 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1719 k = (unsigned char *) SvPVbyte(key, k_len);
1820
19 Newz(0, RETVAL, 1, struct xcbc_struct);
21 Newz(0, RETVAL, 1, xcbc_state);
2022 if (!RETVAL) croak("FATAL: Newz failed");
2123
22 rv = xcbc_init(&RETVAL->state, id, k, (unsigned long)k_len);
24 rv = xcbc_init(RETVAL, id, k, (unsigned long)k_len);
2325 if (rv != CRYPT_OK) {
2426 Safefree(RETVAL);
2527 croak("FATAL: xcbc_init failed: %s", error_to_string(rv));
3638 Crypt::Mac::XCBC
3739 clone(Crypt::Mac::XCBC self)
3840 CODE:
39 Newz(0, RETVAL, 1, struct xcbc_struct);
41 Newz(0, RETVAL, 1, xcbc_state);
4042 if (!RETVAL) croak("FATAL: Newz failed");
41 Copy(&self->state, &RETVAL->state, 1, struct xcbc_struct);
43 Copy(self, RETVAL, 1, xcbc_state);
4244 OUTPUT:
4345 RETVAL
4446
4547 void
46 _add_single(Crypt::Mac::XCBC self, SV * data)
47 CODE:
48 add(Crypt::Mac::XCBC self, ...)
49 PPCODE:
4850 {
49 int rv;
51 int rv, i;
5052 STRLEN in_data_len;
5153 unsigned char *in_data;
5254
53 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
54 if (in_data_len>0) {
55 rv = xcbc_process(&self->state, in_data, (unsigned long)in_data_len);
56 if (rv != CRYPT_OK) croak("FATAL: xcbc_process failed: %s", error_to_string(rv));
55 for(i = 1; i < items; i++) {
56 in_data = (unsigned char *)SvPVbyte(ST(i), in_data_len);
57 if (in_data_len > 0) {
58 rv = xcbc_process(self, in_data, (unsigned long)in_data_len);
59 if (rv != CRYPT_OK) croak("FATAL: xcbc_process failed: %s", error_to_string(rv));
60 }
5761 }
62 XPUSHs(ST(0)); /* return self */
5863 }
5964
6065 SV *
6166 mac(Crypt::Mac::XCBC self)
67 ALIAS:
68 hexmac = 1
69 b64mac = 2
70 b64umac = 3
6271 CODE:
6372 {
64 char mac[MAXBLOCKSIZE];
65 unsigned long mac_len;
73 unsigned char mac[MAXBLOCKSIZE];
74 unsigned long maclen, outlen;
6675 int rv;
76 char out[MAXBLOCKSIZE*2];
6777
68 mac_len = sizeof(mac);
69 rv = xcbc_done(&self->state, (unsigned char*)mac, &mac_len);
78 maclen = sizeof(mac);
79 rv = xcbc_done(self, mac, &maclen);
7080 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
71 RETVAL = newSVpvn(mac, mac_len);
81 outlen = sizeof(out);
82 if (ix == 3) {
83 rv = base64url_encode(mac, maclen, (unsigned char*)out, &outlen);
84 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
85 RETVAL = newSVpvn(out, outlen);
86 }
87 if (ix == 2) {
88 rv = base64_encode(mac, maclen, (unsigned char*)out, &outlen);
89 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
90 RETVAL = newSVpvn(out, outlen);
91 }
92 if (ix == 1) {
93 rv = _base16_encode(mac, maclen, (unsigned char *)out, &outlen);
94 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
95 RETVAL = newSVpvn(out, outlen);
96 }
97 else {
98 RETVAL = newSVpvn((char * )mac, maclen);
99 }
72100 }
73101 OUTPUT:
74102 RETVAL
75103
76104 SV *
77 b64mac(Crypt::Mac::XCBC self)
105 xcbc(char * cipher_name, SV * key, ...)
106 ALIAS:
107 xcbc_hex = 1
108 xcbc_b64 = 2
109 xcbc_b64u = 3
78110 CODE:
79111 {
112 STRLEN inlen, klen;
113 unsigned char *in;
114 unsigned char *k = (unsigned char *)SvPVbyte(key, klen);
115 int rv, i;
80116 unsigned char mac[MAXBLOCKSIZE];
81 unsigned long mac_len;
82 int rv;
83 unsigned long outlen;
84 char mac_base64[MAXBLOCKSIZE*2 + 1];
117 unsigned long len = sizeof(mac), outlen;
118 char out[MAXBLOCKSIZE*2];
119 xcbc_state st;
85120
86 mac_len = sizeof(mac);
87 rv = xcbc_done(&self->state, mac, &mac_len);
121 int id = _find_cipher(cipher_name);
122 if (id == -1) croak("FATAL: find_cipher failed for '%s'", cipher_name);
123 rv = xcbc_init(&st, id, k, (unsigned long)klen);
124 if (rv != CRYPT_OK) croak("FATAL: xcbc_init failed: %s", error_to_string(rv));
125 for (i = 2; i < items; i++) {
126 in = (unsigned char *)SvPVbyte(ST(i), inlen);
127 if (inlen > 0) {
128 rv = xcbc_process(&st, in, (unsigned long)inlen);
129 if (rv != CRYPT_OK) croak("FATAL: xcbc_process failed: %s", error_to_string(rv));
130 }
131 }
132 rv = xcbc_done(&st, mac, &len);
88133 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
89 outlen = sizeof(mac_base64);
90 rv = base64_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
91 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
92 RETVAL = newSVpvn(mac_base64, outlen);
134
135 outlen = sizeof(out);
136 if (ix == 3) {
137 rv = base64url_encode(mac, len, (unsigned char *)out, &outlen);
138 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
139 RETVAL = newSVpvn((char *) out, outlen);
140 }
141 else if (ix == 2) {
142 rv = base64_encode(mac, len, (unsigned char *)out, &outlen);
143 if (rv != CRYPT_OK) croak("FATAL: base64_encode failed: %s", error_to_string(rv));
144 RETVAL = newSVpvn((char *) out, outlen);
145 }
146 else if (ix == 1) {
147 rv = _base16_encode(mac, len, (unsigned char *)out, &outlen);
148 if (rv != CRYPT_OK) croak("FATAL: base16_encode failed: %s", error_to_string(rv));
149 RETVAL = newSVpvn((char *) out, outlen);
150 }
151 else {
152 RETVAL = newSVpvn((char *) mac, len);
153 }
93154 }
94155 OUTPUT:
95156 RETVAL
96
97 SV *
98 b64umac(Crypt::Mac::XCBC self)
99 CODE:
100 {
101 unsigned char mac[MAXBLOCKSIZE];
102 unsigned long mac_len;
103 int rv;
104 unsigned long outlen;
105 char mac_base64[MAXBLOCKSIZE*2 + 1];
106
107 mac_len = sizeof(mac);
108 rv = xcbc_done(&self->state, mac, &mac_len);
109 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
110 outlen = sizeof(mac_base64);
111 rv = base64url_encode(mac, mac_len, (unsigned char*)mac_base64, &outlen);
112 if (rv != CRYPT_OK) croak("FATAL: base64url_encode failed: %s", error_to_string(rv));
113 RETVAL = newSVpvn(mac_base64, outlen);
114 }
115 OUTPUT:
116 RETVAL
117
118 SV *
119 hexmac(Crypt::Mac::XCBC self)
120 CODE:
121 {
122 unsigned char mac[MAXBLOCKSIZE];
123 unsigned long mac_len, i;
124 int rv;
125 char mac_hex[MAXBLOCKSIZE*2 + 1];
126
127 mac_len = sizeof(mac);
128 rv = xcbc_done(&self->state, mac, &mac_len);
129 if (rv != CRYPT_OK) croak("FATAL: xcbc_done failed: %s", error_to_string(rv));
130 mac_hex[0] = '\0';
131 for(i=0; i<mac_len; i++)
132 sprintf(&mac_hex[2*i], "%02x", mac[i]);
133 RETVAL = newSVpvn(mac_hex, strlen(mac_hex));
134 }
135 OUTPUT:
136 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mode::CBC
11
2 PROTOTYPES: DISABLE
3
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mode::CBC
5 _new(char * cipher_name, int padding=1, int rounds=0)
7 new(Class, char * cipher_name, int padding=1, int rounds=0)
68 CODE:
79 {
810 Newz(0, RETVAL, 1, struct cbc_struct);
1113 RETVAL->padlen = 0;
1214 RETVAL->direction = 0;
1315 RETVAL->cipher_rounds = rounds;
14 RETVAL->cipher_id = find_cipher(cipher_name);
16 RETVAL->cipher_id = _find_cipher(cipher_name);
1517 if (RETVAL->cipher_id == -1) {
1618 Safefree(RETVAL);
1719 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2527 CODE:
2628 Safefree(self);
2729
28 int
29 _get_dir(Crypt::Mode::CBC self)
30 CODE:
31 RETVAL = self->direction;
32 OUTPUT:
33 RETVAL
34
3530 void
36 _start(Crypt::Mode::CBC self, int dir, SV * key, SV * iv)
37 CODE:
31 start_decrypt(Crypt::Mode::CBC self, SV * key, SV * iv)
32 ALIAS:
33 start_encrypt = 1
34 PPCODE:
3835 {
3936 int rv;
4037 STRLEN k_len=0;
5552 croak("FATAL: cbc_start failed: %s", error_to_string(rv));
5653 }
5754
58 self->direction = dir;
55 self->direction = ix == 1 ? 1 : -1;
5956 self->padlen = 0;
57 XPUSHs(ST(0)); /* return self */
6058 }
6159
6260 SV *
63 _encrypt(Crypt::Mode::CBC self, SV * data)
64 CODE:
65 {
66 int rv, has_tmp_block, blen;
61 add(Crypt::Mode::CBC self, ...)
62 CODE:
63 {
64 int rv, has_tmp_block, blen, j;
6765 unsigned long i;
68
69 STRLEN in_data_len, in_data_start;
66 STRLEN in_data_len, in_data_start, out_len = 0;
7067 unsigned char *in_data, *out_data, tmp_block[MAXBLOCKSIZE];
7168
72 if (self->direction != 1) croak("FATAL: encrypt error, call start_encrypt first (%d)", self->direction);
73
74 blen = (&self->state)->blocklen;
75 in_data_start = 0;
76 has_tmp_block = 0;
77 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
78 if (in_data_len == 0) {
79 RETVAL = newSVpvn("", 0);
80 }
81 else {
82 if (self->padlen > 0) {
83 i = (blen - self->padlen);
84 if (in_data_len >= i) { /* enough data to fill pad */
85 Copy(in_data, self->pad+self->padlen, i, unsigned char);
86 in_data_len -= i;
87 in_data_start = i;
88 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
89 if (rv != CRYPT_OK) croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
90 self->padlen = 0;
91 has_tmp_block = 1;
92 }
93 else { /* not enough data to fill pad */
94 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
95 self->padlen += (int)in_data_len;
96 in_data_len = 0;
97 }
98 } /* padlen > 0 */
99
100 i = (unsigned long)(in_data_len % blen);
101 if (in_data_len>0 && i>0) { /* save tail of data into pad */
102 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
103 self->padlen = i;
104 in_data_len -= i;
105 }
106
69 RETVAL = newSVpvn("", 0);
70 for (j = 1; j < items; j++) {
71 in_data = (unsigned char *)SvPVbyte(ST(j), in_data_len);
72 blen = (&self->state)->blocklen;
73 in_data_start = 0;
74 has_tmp_block = 0;
10775 if (in_data_len > 0) {
108 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
109 RETVAL = NEWSV(0, i);
110 SvPOK_only(RETVAL);
111 SvCUR_set(RETVAL, i);
112 out_data = (unsigned char *)SvPVX(RETVAL);
113 if (has_tmp_block) {
114 Copy(tmp_block, out_data, blen, unsigned char);
115 out_data += blen;
116 }
117 rv = cbc_encrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
118 if (rv != CRYPT_OK) {
76 if (self->direction == 1) {
77 /* handle non-empty self->pad buffer */
78 if (self->padlen > 0) {
79 i = (blen - self->padlen);
80 if (in_data_len >= i) { /* enough data to fill pad */
81 Copy(in_data, self->pad+self->padlen, i, unsigned char);
82 in_data_len -= i;
83 in_data_start = i;
84 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
85 if (rv != CRYPT_OK) {
86 SvREFCNT_dec(RETVAL);
87 croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
88 }
89 self->padlen = 0;
90 has_tmp_block = 1;
91 }
92 else { /* not enough data to fill pad */
93 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
94 self->padlen += (int)in_data_len;
95 in_data_len = 0;
96 }
97 }
98
99 i = (unsigned long)(in_data_len % blen);
100 if (in_data_len > 0 && i > 0) { /* save tail of data into pad */
101 Copy(in_data + in_data_start + in_data_len - i, self->pad, i, unsigned char);
102 self->padlen = i;
103 in_data_len -= i;
104 }
105
106 if (in_data_len > 0) {
107 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
108 out_data = (unsigned char*)SvGROW(RETVAL, out_len + i + 1) + out_len;
109 out_len += i;
110 if (has_tmp_block) {
111 Copy(tmp_block, out_data, blen, unsigned char);
112 out_data += blen;
113 }
114 rv = cbc_encrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
115 if (rv != CRYPT_OK) {
116 SvREFCNT_dec(RETVAL);
117 croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
118 }
119 } /* in_data_len > 0 */
120 else if (has_tmp_block) {
121 out_data = (unsigned char*)SvGROW(RETVAL, out_len + blen + 1) + out_len;
122 out_len += blen;
123 Copy(tmp_block, out_data, blen, unsigned char);
124 }
125 }
126 else if (self->direction == -1) {
127 if (self->padlen == blen) {
128 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
129 if (rv != CRYPT_OK) {
130 SvREFCNT_dec(RETVAL);
131 croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
132 }
133 self->padlen = 0;
134 has_tmp_block = 1;
135 } /* padlen == blen */
136 else if (self->padlen > 0) {
137 i = (blen - self->padlen); /* remaining bytes in padding buffer */
138 if (in_data_len >= i) { /* enough data to fill pad */
139 Copy(in_data, self->pad+self->padlen, i, unsigned char);
140 self->padlen += i;
141 in_data_len -= i;
142 in_data_start = i;
143 if (in_data_len>0 || self->padding_mode == 0) {
144 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
145 if (rv != CRYPT_OK) {
146 SvREFCNT_dec(RETVAL);
147 croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
148 }
149 self->padlen = 0;
150 has_tmp_block = 1;
151 }
152 }
153 else { /* not enough data to fill pad */
154 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
155 self->padlen += (int)in_data_len;
156 in_data_len = 0;
157 }
158 } /* padlen > 0 */
159
160 /* here: a/ padlen == 1..16 && in_data_len == 0; b/ padlen == 0 && in_data_len > 0 */
161 if (in_data_len>0) {
162 i = (unsigned long)(in_data_len % blen);
163 if (i>0) { /* save tail of data into pad */
164 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
165 self->padlen = i;
166 in_data_len -= i;
167 }
168 }
169
170 if (in_data_len>0) {
171 if (self->padlen == 0 && self->padding_mode !=0) {
172 /* in case of padding keep full pad if no more data */
173 Copy(in_data+in_data_start+in_data_len-blen, self->pad, blen, unsigned char);
174 self->padlen = blen;
175 in_data_len -= blen;
176 }
177 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
178 if (i > 0) {
179 out_data = (unsigned char*)SvGROW(RETVAL, out_len + i + 1) + out_len;
180 out_len += i;
181 if (has_tmp_block) {
182 Copy(tmp_block, out_data, blen, unsigned char);
183 out_data += blen;
184 }
185 rv = cbc_decrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
186 if (rv != CRYPT_OK) {
187 SvREFCNT_dec(RETVAL);
188 croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
189 }
190 }
191 } /* in_data_len>0 */
192 else if (has_tmp_block) {
193 out_data = (unsigned char*)SvGROW(RETVAL, out_len + blen + 1) + out_len;
194 out_len += blen;
195 Copy(tmp_block, out_data, blen, unsigned char);
196 }
197 }
198 else {
119199 SvREFCNT_dec(RETVAL);
120 croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
121 }
122 } /* in_data_len>0 */
123 else if (has_tmp_block) {
124 RETVAL = newSVpvn((char*)tmp_block, blen);
125 }
126 else {
127 RETVAL = newSVpvn("", 0);
128 }
129 }
200 croak("FATAL: call start_decryt or start_encrpyt first (%d)", self->direction);
201 }
202 }
203 }
204 if (out_len > 0) SvCUR_set(RETVAL, out_len);
130205 }
131206 OUTPUT:
132207 RETVAL
133208
134209 SV *
135 _finish_enc(Crypt::Mode::CBC self)
136 CODE:
137 {
138 unsigned char tmp_block[MAXBLOCKSIZE];
139 int rv, blen, i, j;
140
141 blen = (&self->state)->blocklen;
142 if (self->padlen<0 || self->padlen>=blen) croak("FATAL: invalid padlen");
143
144 if (self->padding_mode == 1) { /* pkcs5|7 padding */
145 i = blen - self->padlen;
146 if (i == 0) i = blen;
147 for(j=self->padlen; j<blen; j++) self->pad[j] = (unsigned char)i;
148 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
149 if (rv != CRYPT_OK) croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
150 }
151 else if (self->padding_mode == 2) { /* oneandzeroes padding */
152 self->pad[self->padlen] = 0x80;
153 for(j=self->padlen+1; j<blen; j++) self->pad[j] = 0;
154 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
155 if (rv != CRYPT_OK) croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
210 finish(Crypt::Mode::CBC self)
211 CODE:
212 {
213 unsigned char tmp_block[MAXBLOCKSIZE], ch;
214 int i, j, rv, blen = (&self->state)->blocklen;
215
216 if (self->direction == 1) {
217 if (self->padlen<0 || self->padlen>=blen) croak("FATAL: invalid padlen");
218 if (self->padding_mode == 1) { /* pkcs5|7 padding */
219 i = blen - self->padlen;
220 if (i == 0) i = blen;
221 for(j=self->padlen; j<blen; j++) self->pad[j] = (unsigned char)i;
222 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
223 if (rv != CRYPT_OK) croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
224 }
225 else if (self->padding_mode == 2) { /* oneandzeroes padding */
226 self->pad[self->padlen] = 0x80;
227 for(j=self->padlen+1; j<blen; j++) self->pad[j] = 0;
228 rv = cbc_encrypt(self->pad, tmp_block, blen, &self->state);
229 if (rv != CRYPT_OK) croak("FATAL: cbc_encrypt failed: %s", error_to_string(rv));
230 }
231 else {
232 if (self->padlen>0) croak("FATAL: cbc_encrypt, input data length not multiple of %d", blen);
233 blen = 0;
234 }
235 }
236 else if (self->direction == -1) {
237 if (self->padlen > 0) {
238 if (self->padlen != blen) croak("FATAL: cipher text length has to be multiple of %d (%d)", blen, self->padlen);
239 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
240 if (rv != CRYPT_OK) croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
241 if (self->padding_mode == 0) { /* no padding */
242 /* we already have blen */
243 }
244 else if (self->padding_mode == 1) { /* pkcs5|7 padding */
245 ch = tmp_block[blen-1];
246 blen = blen - (ch > blen ? blen : ch);
247 }
248 else if (self->padding_mode == 2) { /* oneandzeroes padding */
249 while ((unsigned char)tmp_block[blen - 1] == 0x00) blen--;
250 if ((unsigned char)tmp_block[blen - 1] == 0x80) blen--;
251 if (blen < 0) blen = 0;
252 }
253 }
254 else {
255 blen = 0;
256 }
156257 }
157258 else {
158 if (self->padlen>0) croak("FATAL: cbc_encrypt, input data length not multiple of %d", blen);
159 blen = 0;
259 XSRETURN_UNDEF;
160260 }
161261
162262 self->direction = 0;
164264 }
165265 OUTPUT:
166266 RETVAL
167
168 SV *
169 _decrypt(Crypt::Mode::CBC self, SV * data)
170 CODE:
171 {
172 int rv, has_tmp_block, blen;
173 unsigned long i;
174 STRLEN in_data_len, in_data_start;
175 unsigned char *in_data, *out_data, tmp_block[MAXBLOCKSIZE];
176
177 if (self->direction != -1) croak("FATAL: decrypt error, call start_decryt first (%d)", self->direction);
178
179 blen = (&self->state)->blocklen;
180 in_data_start = 0;
181 has_tmp_block = 0;
182 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
183 if (in_data_len == 0) {
184 RETVAL = newSVpvn("", 0);
185 }
186 else {
187
188 if (self->padlen == blen) {
189 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
190 if (rv != CRYPT_OK) croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
191 self->padlen = 0;
192 has_tmp_block = 1;
193 } /* padlen == blen */
194 else if (self->padlen > 0) {
195 i = (blen - self->padlen); /* remaining bytes in padding buffer */
196 if (in_data_len >= i) { /* enough data to fill pad */
197 Copy(in_data, self->pad+self->padlen, i, unsigned char);
198 self->padlen += i;
199 in_data_len -= i;
200 in_data_start = i;
201 if (in_data_len>0 || self->padding_mode == 0) {
202 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
203 if (rv != CRYPT_OK) croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
204 self->padlen = 0;
205 has_tmp_block = 1;
206 }
207 }
208 else { /* not enough data to fill pad */
209 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
210 self->padlen += (int)in_data_len;
211 in_data_len = 0;
212 }
213 } /* padlen > 0 */
214
215 /* here: a/ padlen == 1..16 && in_data_len == 0; b/ padlen == 0 && in_data_len > 0 */
216 if (in_data_len>0) {
217 i = (unsigned long)(in_data_len % blen);
218 if (i>0) { /* save tail of data into pad */
219 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
220 self->padlen = i;
221 in_data_len -= i;
222 }
223 }
224
225 if (in_data_len>0) {
226 if (self->padlen == 0 && self->padding_mode !=0) {
227 /* in case of padding keep full pad if no more data */
228 Copy(in_data+in_data_start+in_data_len-blen, self->pad, blen, unsigned char);
229 self->padlen = blen;
230 in_data_len -= blen;
231 }
232 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
233 if (i == 0) {
234 RETVAL = newSVpvn("", 0);
235 }
236 else {
237 RETVAL = NEWSV(0, i);
238 SvPOK_only(RETVAL);
239 SvCUR_set(RETVAL, i);
240 out_data = (unsigned char *)SvPVX(RETVAL);
241 if (has_tmp_block) {
242 Copy(tmp_block, out_data, blen, unsigned char);
243 out_data += blen;
244 }
245 rv = cbc_decrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
246 if (rv != CRYPT_OK) {
247 SvREFCNT_dec(RETVAL);
248 croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
249 }
250 }
251 } /* in_data_len>0 */
252 else if (has_tmp_block) {
253 RETVAL = newSVpvn((char*)tmp_block, blen);
254 }
255 else {
256 RETVAL = newSVpvn("", 0);
257 }
258 }
259
260 }
261 OUTPUT:
262 RETVAL
263
264 SV *
265 _finish_dec(Crypt::Mode::CBC self)
266 CODE:
267 {
268 unsigned char tmp_block[MAXBLOCKSIZE];
269 unsigned char i;
270 int rv, rv_len, blen;
271
272 rv_len = 0;
273 if (self->padlen > 0) {
274 blen = (&self->state)->blocklen;
275 if (self->padlen != blen) croak("FATAL: cipher text length has to be multiple of %d (%d)", blen, self->padlen);
276 rv = cbc_decrypt(self->pad, tmp_block, blen, &self->state);
277 if (rv != CRYPT_OK) croak("FATAL: cbc_decrypt failed: %s", error_to_string(rv));
278 if (self->padding_mode == 0) { /* no padding */
279 rv_len = blen;
280 }
281 else if (self->padding_mode == 1) { /* pkcs5|7 padding */
282 i = tmp_block[blen-1];
283 rv_len = blen - (i>blen ? blen : i);
284 }
285 else if (self->padding_mode == 2) { /* oneandzeroes padding */
286 rv_len = blen;
287 while ((unsigned char)tmp_block[rv_len-1] == 0x00) rv_len--;
288 if ((unsigned char)tmp_block[rv_len-1] == 0x80) rv_len--;
289 if (rv_len<0) rv_len = 0;
290 }
291 }
292
293 self->direction = 0;
294 RETVAL = newSVpvn((char*)tmp_block, rv_len);
295 }
296 OUTPUT:
297 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mode::CFB
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mode::CFB
5 _new(char * cipher_name, int rounds=0)
7 new(Class, char * cipher_name, int rounds=0)
68 CODE:
79 {
810 Newz(0, RETVAL, 1, struct cfb_struct);
911 if (!RETVAL) croak("FATAL: Newz failed");
1012 RETVAL->direction = 0;
1113 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1315 if (RETVAL->cipher_id == -1) {
1416 Safefree(RETVAL);
1517 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2325 CODE:
2426 Safefree(self);
2527
26 int
27 _get_dir(Crypt::Mode::CFB self)
28 CODE:
29 RETVAL = self->direction;
30 OUTPUT:
31 RETVAL
32
3328 void
34 _start(Crypt::Mode::CFB self, int dir, SV * key, SV * iv)
35 CODE:
29 start_decrypt(Crypt::Mode::CFB self, SV * key, SV * iv)
30 ALIAS:
31 start_encrypt = 1
32 PPCODE:
3633 {
3734 STRLEN k_len=0;
3835 unsigned char *k=NULL;
5451 croak("FATAL: cfb_start failed: %s", error_to_string(rv));
5552 }
5653
57 self->direction = dir;
54 self->direction = ix == 1 ? 1 : -1;
55 XPUSHs(ST(0)); /* return self */
5856 }
5957
6058 SV *
61 _crypt(Crypt::Mode::CFB self, SV * data)
59 add(Crypt::Mode::CFB self, ...)
6260 CODE:
6361 {
64 int rv;
65 STRLEN in_data_len;
62 int rv, j;
63 STRLEN in_data_len, out_len = 0;
6664 unsigned char *in_data, *out_data;
6765
68 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
69 if (in_data_len == 0) {
70 RETVAL = newSVpvn("", 0);
71 }
72 else {
73 RETVAL = NEWSV(0, in_data_len);
74 SvPOK_only(RETVAL);
75 SvCUR_set(RETVAL, in_data_len);
76 out_data = (unsigned char *)SvPVX(RETVAL);
77
78 if (self->direction == 1) {
79 rv = cfb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
80 if (rv != CRYPT_OK) {
66 RETVAL = newSVpvn("", 0);
67 for (j = 1; j < items; j++) {
68 in_data = (unsigned char *)SvPVbyte(ST(j), in_data_len);
69 if (in_data_len > 0) {
70 out_data = (unsigned char*)SvGROW(RETVAL, out_len + in_data_len + 1) + out_len;
71 out_len += in_data_len;
72 if (self->direction == 1) {
73 rv = cfb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
74 if (rv != CRYPT_OK) {
75 SvREFCNT_dec(RETVAL);
76 croak("FATAL: cfb_encrypt failed: %s", error_to_string(rv));
77 }
78 }
79 else if (self->direction == -1) {
80 rv = cfb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
81 if (rv != CRYPT_OK) {
82 SvREFCNT_dec(RETVAL);
83 croak("FATAL: cfb_decrypt failed: %s", error_to_string(rv));
84 }
85 }
86 else {
8187 SvREFCNT_dec(RETVAL);
82 croak("FATAL: cfb_encrypt failed: %s", error_to_string(rv));
88 croak("FATAL: cfb_crypt failed: call start_encrypt or start_decrypt first");
8389 }
8490 }
85 else if (self->direction == -1) {
86 rv = cfb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
87 if (rv != CRYPT_OK) {
88 SvREFCNT_dec(RETVAL);
89 croak("FATAL: cfb_decrypt failed: %s", error_to_string(rv));
90 }
91 }
92 else {
93 SvREFCNT_dec(RETVAL);
94 croak("FATAL: cfb_crypt failed: call start_encrypt or start_decrypt first");
95 }
9691 }
92 if (out_len > 0) SvCUR_set(RETVAL, out_len);
9793 }
9894 OUTPUT:
9995 RETVAL
10096
10197 SV *
102 _finish(Crypt::Mode::CFB self)
98 finish(Crypt::Mode::CFB self)
10399 CODE:
104100 self->direction = 0;
105101 RETVAL = newSVpvn("", 0);
00 MODULE = CryptX PACKAGE = Crypt::Mode::CTR
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mode::CTR
5 _new(char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
7 new(Class, char * cipher_name, int ctr_mode=0, int ctr_width=0, int rounds=0)
68 CODE:
79 {
810 Newz(0, RETVAL, 1, struct ctr_struct);
911 if (!RETVAL) croak("FATAL: Newz failed");
1012 RETVAL->direction = 0;
1113 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1315 if (RETVAL->cipher_id == -1) {
1416 Safefree(RETVAL);
1517 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2830 CODE:
2931 Safefree(self);
3032
31 int
32 _get_dir(Crypt::Mode::CTR self)
33 CODE:
34 RETVAL = self->direction;
35 OUTPUT:
36 RETVAL
37
3833 void
39 _start(Crypt::Mode::CTR self, int dir, SV * key, SV * iv)
40 CODE:
34 start_decrypt(Crypt::Mode::CTR self, SV * key, SV * iv)
35 ALIAS:
36 start_encrypt = 1
37 PPCODE:
4138 {
4239 STRLEN k_len=0;
4340 unsigned char *k=NULL;
5956 croak("FATAL: ctr_start failed: %s", error_to_string(rv));
6057 }
6158
62 self->direction = dir;
59 self->direction = ix == 1 ? 1 : -1;
60 XPUSHs(ST(0)); /* return self */
6361 }
6462
6563 SV *
66 _crypt(Crypt::Mode::CTR self, SV * data)
64 add(Crypt::Mode::CTR self, ...)
6765 CODE:
6866 {
69 int rv;
70 STRLEN in_data_len;
67 int rv, j;
68 STRLEN in_data_len, out_len = 0;
7169 unsigned char *in_data, *out_data;
7270
73 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
74 if (in_data_len == 0) {
75 RETVAL = newSVpvn("", 0);
76 }
77 else {
78 RETVAL = NEWSV(0, in_data_len);
79 SvPOK_only(RETVAL);
80 SvCUR_set(RETVAL, in_data_len);
81 out_data = (unsigned char *)SvPVX(RETVAL);
82
83 if (self->direction == 1) {
84 rv = ctr_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
85 if (rv != CRYPT_OK) {
71 RETVAL = newSVpvn("", 0);
72 for (j = 1; j < items; j++) {
73 in_data = (unsigned char *)SvPVbyte(ST(j), in_data_len);
74 if (in_data_len > 0) {
75 out_data = (unsigned char*)SvGROW(RETVAL, out_len + in_data_len + 1) + out_len;
76 out_len += in_data_len;
77 if (self->direction == 1) {
78 rv = ctr_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
79 if (rv != CRYPT_OK) {
80 SvREFCNT_dec(RETVAL);
81 croak("FATAL: ctr_encrypt failed: %s", error_to_string(rv));
82 }
83 }
84 else if (self->direction == -1) {
85 rv = ctr_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
86 if (rv != CRYPT_OK) {
87 SvREFCNT_dec(RETVAL);
88 croak("FATAL: ctr_decrypt failed: %s", error_to_string(rv));
89 }
90 }
91 else {
8692 SvREFCNT_dec(RETVAL);
87 croak("FATAL: ctr_encrypt failed: %s", error_to_string(rv));
93 croak("FATAL: ctr_crypt failed: call start_encrypt or start_decrypt first");
8894 }
8995 }
90 else if (self->direction == -1) {
91 rv = ctr_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
92 if (rv != CRYPT_OK) {
93 SvREFCNT_dec(RETVAL);
94 croak("FATAL: ctr_decrypt failed: %s", error_to_string(rv));
95 }
96 }
97 else {
98 SvREFCNT_dec(RETVAL);
99 croak("FATAL: ctr_crypt failed: call start_encrypt or start_decrypt first");
100 }
10196 }
97 if (out_len > 0) SvCUR_set(RETVAL, out_len);
10298 }
10399 OUTPUT:
104100 RETVAL
105101
106102 SV *
107 _finish(Crypt::Mode::CTR self)
103 finish(Crypt::Mode::CTR self)
108104 CODE:
109105 self->direction = 0;
110106 RETVAL = newSVpvn("", 0);
00 MODULE = CryptX PACKAGE = Crypt::Mode::ECB
11
2 PROTOTYPES: DISABLE
3
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mode::ECB
5 _new(char * cipher_name, int padding=1, int rounds=0)
7 new(Class, char * cipher_name, int padding=1, int rounds=0)
68 CODE:
79 {
810 Newz(0, RETVAL, 1, struct ecb_struct);
1113 RETVAL->padlen = 0;
1214 RETVAL->direction = 0;
1315 RETVAL->cipher_rounds = rounds;
14 RETVAL->cipher_id = find_cipher(cipher_name);
16 RETVAL->cipher_id = _find_cipher(cipher_name);
1517 if (RETVAL->cipher_id == -1) {
1618 Safefree(RETVAL);
1719 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2527 CODE:
2628 Safefree(self);
2729
28 int
29 _get_dir(Crypt::Mode::ECB self)
30 CODE:
31 RETVAL = self->direction;
32 OUTPUT:
33 RETVAL
34
3530 void
36 _start(Crypt::Mode::ECB self, int dir, SV * key)
37 CODE:
31 start_decrypt(Crypt::Mode::ECB self, SV * key)
32 ALIAS:
33 start_encrypt = 1
34 PPCODE:
3835 {
3936 int rv;
4037 STRLEN k_len=0;
4845 croak("FATAL: ecb_start failed: %s", error_to_string(rv));
4946 }
5047
51 self->direction = dir;
48 self->direction = ix == 1 ? 1 : -1;
5249 self->padlen = 0;
50 XPUSHs(ST(0)); /* return self */
5351 }
5452
5553 SV *
56 _encrypt(Crypt::Mode::ECB self, SV * data)
57 CODE:
58 {
59 int rv, has_tmp_block, blen;
54 add(Crypt::Mode::ECB self, ...)
55 CODE:
56 {
57 int rv, has_tmp_block, blen, j;
6058 unsigned long i;
61
62 STRLEN in_data_len, in_data_start;
59 STRLEN in_data_len, in_data_start, out_len = 0;
6360 unsigned char *in_data, *out_data, tmp_block[MAXBLOCKSIZE];
6461
65 if (self->direction != 1) croak("FATAL: encrypt error, call start_encrypt first (%d)", self->direction);
66
67 blen = (&self->state)->blocklen;
68 in_data_start = 0;
69 has_tmp_block = 0;
70 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
71 if (in_data_len == 0) {
72 RETVAL = newSVpvn("", 0);
73 }
74 else {
75 if (self->padlen > 0) {
76 i = (blen - self->padlen);
77 if (in_data_len >= i) { /* enough data to fill pad */
78 Copy(in_data, self->pad+self->padlen, i, unsigned char);
79 in_data_len -= i;
80 in_data_start = i;
81 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
82 if (rv != CRYPT_OK) croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
83 self->padlen = 0;
84 has_tmp_block = 1;
85 }
86 else { /* not enough data to fill pad */
87 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
88 self->padlen += (int)in_data_len;
89 in_data_len = 0;
90 }
91 } /* padlen > 0 */
92
93 i = (unsigned long)(in_data_len % blen);
94 if (in_data_len>0 && i>0) { /* save tail of data into pad */
95 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
96 self->padlen = i;
97 in_data_len -= i;
98 }
99
62 RETVAL = newSVpvn("", 0);
63 for (j = 1; j < items; j++) {
64 in_data = (unsigned char *)SvPVbyte(ST(j), in_data_len);
65 blen = (&self->state)->blocklen;
66 in_data_start = 0;
67 has_tmp_block = 0;
10068 if (in_data_len > 0) {
101 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
102 RETVAL = NEWSV(0, i);
103 SvPOK_only(RETVAL);
104 SvCUR_set(RETVAL, i);
105 out_data = (unsigned char *)SvPVX(RETVAL);
106 if (has_tmp_block) {
107 Copy(tmp_block, out_data, blen, unsigned char);
108 out_data += blen;
109 }
110 rv = ecb_encrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
111 if (rv != CRYPT_OK) {
69 if (self->direction == 1) {
70 /* handle non-empty self->pad buffer */
71 if (self->padlen > 0) {
72 i = (blen - self->padlen);
73 if (in_data_len >= i) { /* enough data to fill pad */
74 Copy(in_data, self->pad+self->padlen, i, unsigned char);
75 in_data_len -= i;
76 in_data_start = i;
77 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
78 if (rv != CRYPT_OK) {
79 SvREFCNT_dec(RETVAL);
80 croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
81 }
82 self->padlen = 0;
83 has_tmp_block = 1;
84 }
85 else { /* not enough data to fill pad */
86 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
87 self->padlen += (int)in_data_len;
88 in_data_len = 0;
89 }
90 }
91
92 i = (unsigned long)(in_data_len % blen);
93 if (in_data_len > 0 && i > 0) { /* save tail of data into pad */
94 Copy(in_data + in_data_start + in_data_len - i, self->pad, i, unsigned char);
95 self->padlen = i;
96 in_data_len -= i;
97 }
98
99 if (in_data_len > 0) {
100 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
101 out_data = (unsigned char*)SvGROW(RETVAL, out_len + i + 1) + out_len;
102 out_len += i;
103 if (has_tmp_block) {
104 Copy(tmp_block, out_data, blen, unsigned char);
105 out_data += blen;
106 }
107 rv = ecb_encrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
108 if (rv != CRYPT_OK) {
109 SvREFCNT_dec(RETVAL);
110 croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
111 }
112 } /* in_data_len > 0 */
113 else if (has_tmp_block) {
114 out_data = (unsigned char*)SvGROW(RETVAL, out_len + blen + 1) + out_len;
115 out_len += blen;
116 Copy(tmp_block, out_data, blen, unsigned char);
117 }
118 }
119 else if (self->direction == -1) {
120 if (self->padlen == blen) {
121 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
122 if (rv != CRYPT_OK) {
123 SvREFCNT_dec(RETVAL);
124 croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
125 }
126 self->padlen = 0;
127 has_tmp_block = 1;
128 } /* padlen == blen */
129 else if (self->padlen > 0) {
130 i = (blen - self->padlen); /* remaining bytes in padding buffer */
131 if (in_data_len >= i) { /* enough data to fill pad */
132 Copy(in_data, self->pad+self->padlen, i, unsigned char);
133 self->padlen += i;
134 in_data_len -= i;
135 in_data_start = i;
136 if (in_data_len>0 || self->padding_mode == 0) {
137 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
138 if (rv != CRYPT_OK) {
139 SvREFCNT_dec(RETVAL);
140 croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
141 }
142 self->padlen = 0;
143 has_tmp_block = 1;
144 }
145 }
146 else { /* not enough data to fill pad */
147 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
148 self->padlen += (int)in_data_len;
149 in_data_len = 0;
150 }
151 } /* padlen > 0 */
152
153 /* here: a/ padlen == 1..16 && in_data_len == 0; b/ padlen == 0 && in_data_len > 0 */
154 if (in_data_len>0) {
155 i = (unsigned long)(in_data_len % blen);
156 if (i>0) { /* save tail of data into pad */
157 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
158 self->padlen = i;
159 in_data_len -= i;
160 }
161 }
162
163 if (in_data_len>0) {
164 if (self->padlen == 0 && self->padding_mode !=0) {
165 /* in case of padding keep full pad if no more data */
166 Copy(in_data+in_data_start+in_data_len-blen, self->pad, blen, unsigned char);
167 self->padlen = blen;
168 in_data_len -= blen;
169 }
170 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
171 if (i > 0) {
172 out_data = (unsigned char*)SvGROW(RETVAL, out_len + i + 1) + out_len;
173 out_len += i;
174 if (has_tmp_block) {
175 Copy(tmp_block, out_data, blen, unsigned char);
176 out_data += blen;
177 }
178 rv = ecb_decrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
179 if (rv != CRYPT_OK) {
180 SvREFCNT_dec(RETVAL);
181 croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
182 }
183 }
184 } /* in_data_len>0 */
185 else if (has_tmp_block) {
186 out_data = (unsigned char*)SvGROW(RETVAL, out_len + blen + 1) + out_len;
187 out_len += blen;
188 Copy(tmp_block, out_data, blen, unsigned char);
189 }
190 }
191 else {
112192 SvREFCNT_dec(RETVAL);
113 croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
114 }
115 } /* in_data_len>0 */
116 else if (has_tmp_block) {
117 RETVAL = newSVpvn((char*)tmp_block, blen);
118 }
119 else {
120 RETVAL = newSVpvn("", 0);
121 }
122 }
193 croak("FATAL: call start_decryt or start_encrpyt first (%d)", self->direction);
194 }
195 }
196 }
197 if (out_len > 0) SvCUR_set(RETVAL, out_len);
123198 }
124199 OUTPUT:
125200 RETVAL
126201
127202 SV *
128 _finish_enc(Crypt::Mode::ECB self)
129 CODE:
130 {
131 unsigned char tmp_block[MAXBLOCKSIZE];
132 int rv, blen, i, j;
133
134 blen = (&self->state)->blocklen;
135 if (self->padlen<0 || self->padlen>=blen) croak("FATAL: invalid padlen");
136
137 if (self->padding_mode == 1) { /* pkcs5|7 padding */
138 i = blen - self->padlen;
139 if (i == 0) i = blen;
140 for(j=self->padlen; j<blen; j++) self->pad[j] = (unsigned char)i;
141 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
142 if (rv != CRYPT_OK) croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
143 }
144 else if (self->padding_mode == 2) { /* oneandzeroes padding */
145 self->pad[self->padlen] = 0x80;
146 for(j=self->padlen+1; j<blen; j++) self->pad[j] = 0;
147 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
148 if (rv != CRYPT_OK) croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
203 finish(Crypt::Mode::ECB self)
204 CODE:
205 {
206 unsigned char tmp_block[MAXBLOCKSIZE], ch;
207 int i, j, rv, blen = (&self->state)->blocklen;
208
209 if (self->direction == 1) {
210 if (self->padlen<0 || self->padlen>=blen) croak("FATAL: invalid padlen");
211 if (self->padding_mode == 1) { /* pkcs5|7 padding */
212 i = blen - self->padlen;
213 if (i == 0) i = blen;
214 for(j=self->padlen; j<blen; j++) self->pad[j] = (unsigned char)i;
215 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
216 if (rv != CRYPT_OK) croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
217 }
218 else if (self->padding_mode == 2) { /* oneandzeroes padding */
219 self->pad[self->padlen] = 0x80;
220 for(j=self->padlen+1; j<blen; j++) self->pad[j] = 0;
221 rv = ecb_encrypt(self->pad, tmp_block, blen, &self->state);
222 if (rv != CRYPT_OK) croak("FATAL: ecb_encrypt failed: %s", error_to_string(rv));
223 }
224 else {
225 if (self->padlen>0) croak("FATAL: ecb_encrypt, input data length not multiple of %d", blen);
226 blen = 0;
227 }
228 }
229 else if (self->direction == -1) {
230 if (self->padlen > 0) {
231 if (self->padlen != blen) croak("FATAL: cipher text length has to be multiple of %d (%d)", blen, self->padlen);
232 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
233 if (rv != CRYPT_OK) croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
234 if (self->padding_mode == 0) { /* no padding */
235 /* we already have blen */
236 }
237 else if (self->padding_mode == 1) { /* pkcs5|7 padding */
238 ch = tmp_block[blen-1];
239 blen = blen - (ch > blen ? blen : ch);
240 }
241 else if (self->padding_mode == 2) { /* oneandzeroes padding */
242 while ((unsigned char)tmp_block[blen - 1] == 0x00) blen--;
243 if ((unsigned char)tmp_block[blen - 1] == 0x80) blen--;
244 if (blen < 0) blen = 0;
245 }
246 }
247 else {
248 blen = 0;
249 }
149250 }
150251 else {
151 if (self->padlen>0) croak("FATAL: ecb_encrypt, input data length not multiple of %d", blen);
152 blen = 0;
252 XSRETURN_UNDEF;
153253 }
154254
155255 self->direction = 0;
157257 }
158258 OUTPUT:
159259 RETVAL
160
161 SV *
162 _decrypt(Crypt::Mode::ECB self, SV * data)
163 CODE:
164 {
165 int rv, has_tmp_block, blen;
166 unsigned long i;
167 STRLEN in_data_len, in_data_start;
168 unsigned char *in_data, *out_data, tmp_block[MAXBLOCKSIZE];
169
170 if (self->direction != -1) croak("FATAL: decrypt error, call start_decryt first (%d)", self->direction);
171
172 blen = (&self->state)->blocklen;
173 in_data_start = 0;
174 has_tmp_block = 0;
175 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
176 if (in_data_len == 0) {
177 RETVAL = newSVpvn("", 0);
178 }
179 else {
180
181 if (self->padlen == blen) {
182 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
183 if (rv != CRYPT_OK) croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
184 self->padlen = 0;
185 has_tmp_block = 1;
186 } /* padlen == blen */
187 else if (self->padlen > 0) {
188 i = (blen - self->padlen); /* remaining bytes in padding buffer */
189 if (in_data_len >= i) { /* enough data to fill pad */
190 Copy(in_data, self->pad+self->padlen, i, unsigned char);
191 self->padlen += i;
192 in_data_len -= i;
193 in_data_start = i;
194 if (in_data_len>0 || self->padding_mode == 0) {
195 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
196 if (rv != CRYPT_OK) croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
197 self->padlen = 0;
198 has_tmp_block = 1;
199 }
200 }
201 else { /* not enough data to fill pad */
202 Copy(in_data, self->pad+self->padlen, in_data_len, unsigned char);
203 self->padlen += (int)in_data_len;
204 in_data_len = 0;
205 }
206 } /* padlen > 0 */
207
208 /* here: a/ padlen == 1..16 && in_data_len == 0; b/ padlen == 0 && in_data_len > 0 */
209 if (in_data_len>0) {
210 i = (unsigned long)(in_data_len % blen);
211 if (i>0) { /* save tail of data into pad */
212 Copy(in_data+in_data_start+in_data_len-i, self->pad, i, unsigned char);
213 self->padlen = i;
214 in_data_len -= i;
215 }
216 }
217
218 if (in_data_len>0) {
219 if (self->padlen == 0 && self->padding_mode !=0) {
220 /* in case of padding keep full pad if no more data */
221 Copy(in_data+in_data_start+in_data_len-blen, self->pad, blen, unsigned char);
222 self->padlen = blen;
223 in_data_len -= blen;
224 }
225 i = (unsigned long)(has_tmp_block ? in_data_len + blen : in_data_len);
226 if (i == 0) {
227 RETVAL = newSVpvn("", 0);
228 }
229 else {
230 RETVAL = NEWSV(0, i);
231 SvPOK_only(RETVAL);
232 SvCUR_set(RETVAL, i);
233 out_data = (unsigned char *)SvPVX(RETVAL);
234 if (has_tmp_block) {
235 Copy(tmp_block, out_data, blen, unsigned char);
236 out_data += blen;
237 }
238 rv = ecb_decrypt(in_data+in_data_start, out_data, (unsigned long)in_data_len, &self->state);
239 if (rv != CRYPT_OK) {
240 SvREFCNT_dec(RETVAL);
241 croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
242 }
243 }
244 } /* in_data_len>0 */
245 else if (has_tmp_block) {
246 RETVAL = newSVpvn((char*)tmp_block, blen);
247 }
248 else {
249 RETVAL = newSVpvn("", 0);
250 }
251 }
252
253 }
254 OUTPUT:
255 RETVAL
256
257 SV *
258 _finish_dec(Crypt::Mode::ECB self)
259 CODE:
260 {
261 unsigned char tmp_block[MAXBLOCKSIZE];
262 unsigned char i;
263 int rv, rv_len, blen;
264
265 rv_len = 0;
266 if (self->padlen > 0) {
267 blen = (&self->state)->blocklen;
268 if (self->padlen != blen) croak("FATAL: cipher text length has to be multiple of %d (%d)", blen, self->padlen);
269 rv = ecb_decrypt(self->pad, tmp_block, blen, &self->state);
270 if (rv != CRYPT_OK) croak("FATAL: ecb_decrypt failed: %s", error_to_string(rv));
271 if (self->padding_mode == 0) { /* no padding */
272 rv_len = blen;
273 }
274 else if (self->padding_mode == 1) { /* pkcs5|7 padding */
275 i = tmp_block[blen-1];
276 rv_len = blen - (i>blen ? blen : i);
277 }
278 else if (self->padding_mode == 2) { /* oneandzeroes padding */
279 rv_len = blen;
280 while ((unsigned char)tmp_block[rv_len-1] == 0x00) rv_len--;
281 if ((unsigned char)tmp_block[rv_len-1] == 0x80) rv_len--;
282 if (rv_len<0) rv_len = 0;
283 }
284 }
285
286 self->direction = 0;
287 RETVAL = newSVpvn((char*)tmp_block, rv_len);
288 }
289 OUTPUT:
290 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::Mode::OFB
1
2 PROTOTYPES: DISABLE
13
24 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
35
46 Crypt::Mode::OFB
5 _new(char * cipher_name, int rounds=0)
7 new(Class, char * cipher_name, int rounds=0)
68 CODE:
79 {
810 Newz(0, RETVAL, 1, struct ofb_struct);
911 if (!RETVAL) croak("FATAL: Newz failed");
1012 RETVAL->direction = 0;
1113 RETVAL->cipher_rounds = rounds;
12 RETVAL->cipher_id = find_cipher(cipher_name);
14 RETVAL->cipher_id = _find_cipher(cipher_name);
1315 if (RETVAL->cipher_id == -1) {
1416 Safefree(RETVAL);
1517 croak("FATAL: find_cipfer failed for '%s'", cipher_name);
2325 CODE:
2426 Safefree(self);
2527
26 int
27 _get_dir(Crypt::Mode::OFB self)
28 CODE:
29 RETVAL = self->direction;
30 OUTPUT:
31 RETVAL
32
3328 void
34 _start(Crypt::Mode::OFB self, int dir, SV * key, SV * iv)
35 CODE:
29 start_decrypt(Crypt::Mode::OFB self, SV * key, SV * iv)
30 ALIAS:
31 start_encrypt = 1
32 PPCODE:
3633 {
3734 STRLEN k_len=0;
3835 unsigned char *k=NULL;
5451 croak("FATAL: ofb_start failed: %s", error_to_string(rv));
5552 }
5653
57 self->direction = dir;
54 self->direction = ix == 1 ? 1 : -1;
55 XPUSHs(ST(0)); /* return self */
5856 }
5957
6058 SV *
61 _crypt(Crypt::Mode::OFB self, SV * data)
59 add(Crypt::Mode::OFB self, ...)
6260 CODE:
6361 {
64 int rv;
65 STRLEN in_data_len;
62 int rv, j;
63 STRLEN in_data_len, out_len = 0;
6664 unsigned char *in_data, *out_data;
6765
68 in_data = (unsigned char *)SvPVbyte(data, in_data_len);
69 if (in_data_len == 0) {
70 RETVAL = newSVpvn("", 0);
71 }
72 else {
73 RETVAL = NEWSV(0, in_data_len);
74 SvPOK_only(RETVAL);
75 SvCUR_set(RETVAL, in_data_len);
76 out_data = (unsigned char *)SvPVX(RETVAL);
77
78 if (self->direction == 1) {
79 rv = ofb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
80 if (rv != CRYPT_OK) {
66 RETVAL = newSVpvn("", 0);
67 for (j = 1; j < items; j++) {
68 in_data = (unsigned char *)SvPVbyte(ST(j), in_data_len);
69 if (in_data_len > 0) {
70 out_data = (unsigned char*)SvGROW(RETVAL, out_len + in_data_len + 1) + out_len;
71 out_len += in_data_len;
72 if (self->direction == 1) {
73 rv = ofb_encrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
74 if (rv != CRYPT_OK) {
75 SvREFCNT_dec(RETVAL);
76 croak("FATAL: ofb_encrypt failed: %s", error_to_string(rv));
77 }
78 }
79 else if (self->direction == -1) {
80 rv = ofb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
81 if (rv != CRYPT_OK) {
82 SvREFCNT_dec(RETVAL);
83 croak("FATAL: ofb_decrypt failed: %s", error_to_string(rv));
84 }
85 }
86 else {
8187 SvREFCNT_dec(RETVAL);
82 croak("FATAL: ofb_encrypt failed: %s", error_to_string(rv));
88 croak("FATAL: ofb_crypt failed: call start_encrypt or start_decrypt first");
8389 }
8490 }
85 else if (self->direction == -1) {
86 rv = ofb_decrypt(in_data, out_data, (unsigned long)in_data_len, &self->state);
87 if (rv != CRYPT_OK) {
88 SvREFCNT_dec(RETVAL);
89 croak("FATAL: ofb_decrypt failed: %s", error_to_string(rv));
90 }
91 }
92 else {
93 SvREFCNT_dec(RETVAL);
94 croak("FATAL: ofb_crypt failed: call start_encrypt or start_decrypt first");
95 }
9691 }
92 if (out_len > 0) SvCUR_set(RETVAL, out_len);
9793 }
9894 OUTPUT:
9995 RETVAL
10096
10197 SV *
102 _finish(Crypt::Mode::OFB self)
98 finish(Crypt::Mode::OFB self)
10399 CODE:
104100 self->direction = 0;
105101 RETVAL = newSVpvn("", 0);
00 MODULE = CryptX PACKAGE = Crypt::PK::DH
11
2 PROTOTYPES: DISABLE
3
24 Crypt::PK::DH
3 _new()
5 _new(Class)
46 CODE:
57 {
68 int rv;
207209 not_used = hv_store(rv_hash, "size", 4, newSViv(dh_get_groupsize(&self->key)), 0);
208210 /* type */
209211 not_used = hv_store(rv_hash, "type", 4, newSViv(self->key.type), 0);
210 if (not_used) not_used = NULL; /* just silence the warning: variable 'not_used' set but not used */
212 LTC_UNUSED_PARAM(not_used);
211213 RETVAL = newRV_noinc((SV*)rv_hash);
212214 OUTPUT:
213215 RETVAL
00 MODULE = CryptX PACKAGE = Crypt::PK::DSA
11
2 PROTOTYPES: DISABLE
3
24 Crypt::PK::DSA
3 _new()
5 _new(Class)
46 CODE:
57 {
68 int rv;
228230 not_used = hv_store(rv_hash, "size", 4, newSViv(qsize), 0);
229231 /* type */
230232 not_used = hv_store(rv_hash, "type", 4, newSViv(self->key.type), 0);
231 if (not_used) not_used = NULL; /* just silence the warning: variable 'not_used' set but not used */
233 LTC_UNUSED_PARAM(not_used);
232234 RETVAL = newRV_noinc((SV*)rv_hash);
233235 OUTPUT:
234236 RETVAL
260262 RETVAL
261263
262264 SV *
263 _encrypt(Crypt::PK::DSA self, SV * data, char * hash_name)
265 encrypt(Crypt::PK::DSA self, SV * data, const char * hash_name = "SHA1")
264266 CODE:
265267 {
266268 int rv, hash_id;
271273
272274 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
273275
274 hash_id = find_hash(hash_name);
276 hash_id = _find_hash(hash_name);
275277 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
276278 rv = dsa_encrypt_key(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
277279 &self->pstate, self->pindex,
283285 RETVAL
284286
285287 SV *
286 _decrypt(Crypt::PK::DSA self, SV * data)
288 decrypt(Crypt::PK::DSA self, SV * data)
287289 CODE:
288290 {
289291 int rv;
302304 RETVAL
303305
304306 SV *
305 _sign(Crypt::PK::DSA self, SV * data)
306 CODE:
307 {
308 int rv;
309 unsigned char *data_ptr=NULL;
310 STRLEN data_len=0;
311 unsigned char buffer[1024];
312 unsigned long buffer_len = 1024;
307 sign_hash(Crypt::PK::DSA self, SV * data, const char * hash_name = "SHA1")
308 ALIAS:
309 sign_message = 1
310 CODE:
311 {
312 int rv, id;
313 unsigned char buffer[1024], tmp[MAXBLOCKSIZE], *data_ptr = NULL;
314 unsigned long tmp_len = MAXBLOCKSIZE, buffer_len = 1024;
315 STRLEN data_len = 0;
313316
314317 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
315
318 if (ix == 1) {
319 id = _find_hash(hash_name);
320 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
321 rv = hash_memory(id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
322 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
323 data_ptr = tmp;
324 data_len = tmp_len;
325 }
316326 rv = dsa_sign_hash(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
317327 &self->pstate, self->pindex,
318328 &self->key);
323333 RETVAL
324334
325335 int
326 _verify(Crypt::PK::DSA self, SV * sig, SV * data)
327 CODE:
328 {
329 int rv, stat;
330 unsigned char *data_ptr=NULL;
331 STRLEN data_len=0;
332 unsigned char *sig_ptr=NULL;
333 STRLEN sig_len=0;
336 verify_hash(Crypt::PK::DSA self, SV * sig, SV * data, const char * hash_name = "SHA1")
337 ALIAS:
338 verify_message = 1
339 CODE:
340 {
341 int rv, stat, id;
342 unsigned char tmp[MAXBLOCKSIZE], *data_ptr = NULL, *sig_ptr = NULL;
343 unsigned long tmp_len = MAXBLOCKSIZE;
344 STRLEN data_len = 0, sig_len = 0;
334345
335346 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
336347 sig_ptr = (unsigned char *)SvPVbyte(sig, sig_len);
337
348 if (ix == 1) {
349 id = _find_hash(hash_name);
350 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
351 rv = hash_memory(id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
352 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
353 data_ptr = tmp;
354 data_len = tmp_len;
355 }
338356 RETVAL = 1;
339357 stat = 0;
340358 rv = dsa_verify_hash(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, &stat, &self->key);
00 MODULE = CryptX PACKAGE = Crypt::PK::ECC
11
2 PROTOTYPES: DISABLE
3
24 Crypt::PK::ECC
3 _new()
5 _new(Class)
46 CODE:
57 {
68 int rv;
810 if (!RETVAL) croak("FATAL: Newz failed");
911 RETVAL->pindex = find_prng("chacha20");
1012 RETVAL->key.type = -1;
11 ecc_dp_init(&RETVAL->dp);
1213 if (RETVAL->pindex == -1) {
1314 Safefree(RETVAL);
1415 croak("FATAL: find_prng('chacha20') failed");
2829 {
2930 int rv;
3031 /* setup dp structure */
31 _ecc_set_dp_from_SV(&self->dp, curve); /* croaks on error */
32 rv = _ecc_set_dp_from_SV(&self->key, curve); /* croaks on error */
33 if (rv != CRYPT_OK) croak("FATAL: ecc_set_dp failed: %s", error_to_string(rv));
3234 /* gen the key */
33 rv = ecc_make_key_ex(&self->pstate, self->pindex, &self->key, &self->dp);
34 if (rv != CRYPT_OK) croak("FATAL: ecc_make_key_ex failed: %s", error_to_string(rv));
35 rv = ecc_generate_key(&self->pstate, self->pindex, &self->key);
36 if (rv != CRYPT_OK) croak("FATAL: ecc_generate_key failed: %s", error_to_string(rv));
3537 XPUSHs(ST(0)); /* return self */
3638 }
3739
4446 STRLEN data_len=0;
4547
4648 data = (unsigned char *)SvPVbyte(key_data, data_len);
47 _ecc_free_key(&self->key, &self->dp);
48 rv = ecc_import_full(data, (unsigned long)data_len, &self->key, &self->dp);
49 if (rv != CRYPT_OK) croak("FATAL: ecc_import_full failed: %s", error_to_string(rv));
49 if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
50 rv = ecc_import_openssl(data, (unsigned long)data_len, &self->key);
51 if (rv != CRYPT_OK) croak("FATAL: ecc_import_openssl failed: %s", error_to_string(rv));
5052 XPUSHs(ST(0)); /* return self */
5153 }
5254
6264 if (SvOK(passwd)) {
6365 pwd = (unsigned char *)SvPVbyte(passwd, pwd_len);
6466 }
65 _ecc_free_key(&self->key, &self->dp);
66 rv = ecc_import_pkcs8(data, (unsigned long)data_len, pwd, (unsigned long)pwd_len, &self->key, &self->dp);
67 if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
68 rv = ecc_import_pkcs8(data, (unsigned long)data_len, pwd, (unsigned long)pwd_len, &self->key);
6769 if (rv != CRYPT_OK) croak("FATAL: ecc_import_pkcs8 failed: %s", error_to_string(rv));
6870 XPUSHs(ST(0)); /* return self */
6971 }
7072
7173 void
74 _import_x509(Crypt::PK::ECC self, SV * key_data)
75 PPCODE:
76 {
77 int rv;
78 unsigned char *data=NULL;
79 STRLEN data_len=0;
80
81 data = (unsigned char *)SvPVbyte(key_data, data_len);
82 if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
83 rv = ecc_import_x509(data, (unsigned long)data_len, &self->key);
84 if (rv != CRYPT_OK) croak("FATAL: ecc_import_x509 failed: %s", error_to_string(rv));
85 XPUSHs(ST(0)); /* return self */
86 }
87
88 void
7289 import_key_raw(Crypt::PK::ECC self, SV * key_data, SV * curve)
7390 PPCODE:
7491 {
75 int rv;
92 int rv, type;
7693 unsigned char *data=NULL;
7794 STRLEN data_len=0;
7895
7996 data = (unsigned char *)SvPVbyte(key_data, data_len);
80 _ecc_free_key(&self->key, &self->dp);
81
82 _ecc_set_dp_from_SV(&self->dp, curve); /* croaks on error */
83
84 rv = ecc_import_raw(data, (unsigned long)data_len, &self->key, &self->dp);
85 if (rv != CRYPT_OK) croak("FATAL: ecc_import_raw failed: %s", error_to_string(rv));
97 if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
98 /* setup dp structure */
99 rv = _ecc_set_dp_from_SV(&self->key, curve); /* croaks on error */
100 if (rv != CRYPT_OK) croak("FATAL: ecc_set_dp failed: %s", error_to_string(rv));
101 /* import key */
102 type = (data_len == (STRLEN)ecc_get_size(&self->key)) ? PK_PRIVATE : PK_PUBLIC;
103 rv = ecc_set_key(data, (unsigned long)data_len, type, &self->key);
104 if (rv != CRYPT_OK) croak("FATAL: ecc_set_key failed: %s", error_to_string(rv));
86105 XPUSHs(ST(0)); /* return self */
87106 }
88107
150169 not_used = hv_store(rv_hash, "pub_y", 5, newSVpv("", 0), 0);
151170 }
152171 /* curve_... */
153 if (self->key.dp) {
154 not_used = hv_store(rv_hash, "curve_cofactor", 14, newSViv(self->key.dp->cofactor), 0);
155 /* prepend leading zero if we have odd number of hexadecimal digits */
156 strncpy(buf, self->key.dp->prime, 20000); str_add_leading_zero(buf, 20000, 0);
157 not_used = hv_store(rv_hash, "curve_prime", 11, newSVpv(buf, strlen(buf)), 0);
158 strncpy(buf, self->key.dp->A, 20000); str_add_leading_zero(buf, 20000, 0);
159 not_used = hv_store(rv_hash, "curve_A", 7, newSVpv(buf, strlen(buf)), 0);
160 strncpy(buf, self->key.dp->B, 20000); str_add_leading_zero(buf, 20000, 0);
161 not_used = hv_store(rv_hash, "curve_B", 7, newSVpv(buf, strlen(buf)), 0);
162 strncpy(buf, self->key.dp->order, 20000); str_add_leading_zero(buf, 20000, 0);
163 not_used = hv_store(rv_hash, "curve_order", 11, newSVpv(buf, strlen(buf)), 0);
164 strncpy(buf, self->key.dp->Gx, 20000); str_add_leading_zero(buf, 20000, 0);
165 not_used = hv_store(rv_hash, "curve_Gx", 8, newSVpv(buf, strlen(buf)), 0);
166 strncpy(buf, self->key.dp->Gy, 20000); str_add_leading_zero(buf, 20000, 0);
167 not_used = hv_store(rv_hash, "curve_Gy", 8, newSVpv(buf, strlen(buf)), 0);
168 /* OLD approach
169 not_used = hv_store(rv_hash, "curve_prime", 11, newSVpv(self->key.dp->prime, strlen(self->key.dp->prime)), 0);
170 not_used = hv_store(rv_hash, "curve_A", 7, newSVpv(self->key.dp->A, strlen(self->key.dp->A)), 0);
171 not_used = hv_store(rv_hash, "curve_B", 7, newSVpv(self->key.dp->B, strlen(self->key.dp->B)), 0);
172 not_used = hv_store(rv_hash, "curve_order", 11, newSVpv(self->key.dp->order, strlen(self->key.dp->order)), 0);
173 not_used = hv_store(rv_hash, "curve_Gx", 8, newSVpv(self->key.dp->Gx, strlen(self->key.dp->Gx)), 0);
174 not_used = hv_store(rv_hash, "curve_Gy", 8, newSVpv(self->key.dp->Gy, strlen(self->key.dp->Gy)), 0);
175 */
176 {
177 mp_int p_num;
178 mp_init(&p_num);
179 mp_read_radix(&p_num, self->key.dp->prime, 16);
180 not_used = hv_store(rv_hash, "curve_bytes", 11, newSViv(mp_unsigned_bin_size(&p_num)), 0);
181 not_used = hv_store(rv_hash, "curve_bits", 10, newSViv(mp_count_bits(&p_num)), 0);
182 mp_clear(&p_num);
183 }
184 {
172 {
173 not_used = hv_store(rv_hash, "curve_cofactor", 14, newSViv(self->key.dp.cofactor), 0);
174 mp_tohex_with_leading_zero(self->key.dp.prime, buf, 20000, 0);
175 not_used = hv_store(rv_hash, "curve_prime", 11, newSVpv(buf, strlen(buf)), 0);
176 mp_tohex_with_leading_zero(self->key.dp.A, buf, 20000, 0);
177 not_used = hv_store(rv_hash, "curve_A", 7, newSVpv(buf, strlen(buf)), 0);
178 mp_tohex_with_leading_zero(self->key.dp.B, buf, 20000, 0);
179 not_used = hv_store(rv_hash, "curve_B", 7, newSVpv(buf, strlen(buf)), 0);
180 mp_tohex_with_leading_zero(self->key.dp.order, buf, 20000, 0);
181 not_used = hv_store(rv_hash, "curve_order", 11, newSVpv(buf, strlen(buf)), 0);
182 mp_tohex_with_leading_zero(self->key.dp.base.x, buf, 20000, 0);
183 not_used = hv_store(rv_hash, "curve_Gx", 8, newSVpv(buf, strlen(buf)), 0);
184 mp_tohex_with_leading_zero(self->key.dp.base.y, buf, 20000, 0);
185 not_used = hv_store(rv_hash, "curve_Gy", 8, newSVpv(buf, strlen(buf)), 0);
186 not_used = hv_store(rv_hash, "curve_bytes", 11, newSViv(mp_unsigned_bin_size(self->key.dp.prime)), 0);
187 not_used = hv_store(rv_hash, "curve_bits", 10, newSViv(mp_count_bits(self->key.dp.prime)), 0);
188
189 if (self->key.dp.oidlen > 0) {
185190 unsigned long i;
186 SV *name;
187 char *name_ptr;
188 STRLEN name_len;
189
190 name = newSVpv(self->key.dp->name, strlen(self->key.dp->name));
191 name_ptr = SvPV(name, name_len);
192 for (i=0; i<name_len && name_ptr[i]>0; i++) name_ptr[i] = toLOWER(name_ptr[i]);
193 not_used = hv_store(rv_hash, "curve_name", 10, name, 0);
194 }
195 if (self->key.dp->oid.OIDlen > 0) {
196 unsigned long i;
191 HV *h;
192 SV **pref, *cname;
193 char *cname_ptr, *oid_ptr;
194 STRLEN cname_len;
195
196 /* OID -> "curve_oid" */
197197 SV *oid = newSVpv("", 0);
198 for(i = 0; i < self->key.dp->oid.OIDlen - 1; i++) sv_catpvf(oid, "%lu.", self->key.dp->oid.OID[i]);
199 sv_catpvf(oid, "%lu", self->key.dp->oid.OID[i]);
198 for(i = 0; i < self->key.dp.oidlen - 1; i++) sv_catpvf(oid, "%lu.", self->key.dp.oid[i]);
199 sv_catpvf(oid, "%lu", self->key.dp.oid[i]);
200 oid_ptr = SvPVX(oid);
200201 not_used = hv_store(rv_hash, "curve_oid", 9, oid, 0);
202
203 /* curve name -> "curve_name" */
204 if ((h = get_hv("Crypt::PK::ECC::curve2ltc", 0)) != NULL) {
205 pref = hv_fetch(h, oid_ptr, (U32)strlen(oid_ptr), 0);
206 if (pref) {
207 cname_ptr = SvPV(*pref, cname_len);
208 cname = newSVpv(cname_ptr, cname_len);
209 cname_ptr = SvPVX(cname);
210 for (i=0; i<cname_len && cname_ptr[i]>0; i++) cname_ptr[i] = toLOWER(cname_ptr[i]);
211 not_used = hv_store(rv_hash, "curve_name", 10, cname, 0);
212 }
213 }
201214 }
202215 }
203216 /* size */
204217 not_used = hv_store(rv_hash, "size", 4, newSViv(esize), 0);
205218 /* type */
206219 not_used = hv_store(rv_hash, "type", 4, newSViv(self->key.type), 0);
207 if (not_used) not_used = NULL; /* just silence the warning: variable 'not_used' set but not used */
220 LTC_UNUSED_PARAM(not_used);
208221 RETVAL = newRV_noinc((SV*)rv_hash);
209222 OUTPUT:
210223 RETVAL
217230 unsigned char out[4096];
218231 unsigned long int out_len = 4096;
219232
220 RETVAL = newSVpvn(NULL, 0); /* undef */
233 if (self->key.type == -1) croak("FATAL: export_key_der no key");
221234 if (strnEQ(type, "private_short", 16)) {
222 rv = ecc_export_full(out, &out_len, PK_PRIVATE|PK_CURVEOID, &self->key);
223 if (rv != CRYPT_OK) croak("FATAL: ecc_export(PK_PRIVATE|PK_CURVEOID) failed: %s", error_to_string(rv));
235 rv = ecc_export_openssl(out, &out_len, PK_PRIVATE|PK_CURVEOID, &self->key);
236 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PRIVATE|PK_CURVEOID) failed: %s", error_to_string(rv));
237 RETVAL = newSVpvn((char*)out, out_len);
238 }
239 else if (strnEQ(type, "private_compressed", 16)) {
240 rv = ecc_export_openssl(out, &out_len, PK_PRIVATE|PK_CURVEOID|PK_COMPRESSED, &self->key);
241 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PRIVATE|PK_CURVEOID|PK_COMPRESSED) failed: %s", error_to_string(rv));
224242 RETVAL = newSVpvn((char*)out, out_len);
225243 }
226244 else if (strnEQ(type, "private", 7)) {
227 rv = ecc_export_full(out, &out_len, PK_PRIVATE, &self->key);
228 if (rv != CRYPT_OK) croak("FATAL: ecc_export(PK_PRIVATE) failed: %s", error_to_string(rv));
245 rv = ecc_export_openssl(out, &out_len, PK_PRIVATE, &self->key);
246 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PRIVATE) failed: %s", error_to_string(rv));
247 RETVAL = newSVpvn((char*)out, out_len);
248 }
249 else if (strnEQ(type, "public_compressed", 15)) {
250 rv = ecc_export_openssl(out, &out_len, PK_PUBLIC|PK_CURVEOID|PK_COMPRESSED, &self->key);
251 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PUBLIC|PK_CURVEOID|PK_COMPRESSED) failed: %s", error_to_string(rv));
229252 RETVAL = newSVpvn((char*)out, out_len);
230253 }
231254 else if (strnEQ(type, "public_short", 15)) {
232 rv = ecc_export_full(out, &out_len, PK_PUBLIC|PK_CURVEOID, &self->key);
233 if (rv != CRYPT_OK) croak("FATAL: ecc_export(PK_PUBLIC|PK_CURVEOID) failed: %s", error_to_string(rv));
255 rv = ecc_export_openssl(out, &out_len, PK_PUBLIC|PK_CURVEOID, &self->key);
256 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PUBLIC|PK_CURVEOID) failed: %s", error_to_string(rv));
234257 RETVAL = newSVpvn((char*)out, out_len);
235258 }
236259 else if (strnEQ(type, "public", 6)) {
237 rv = ecc_export_full(out, &out_len, PK_PUBLIC, &self->key);
238 if (rv != CRYPT_OK) croak("FATAL: ecc_export(PK_PUBLIC) failed: %s", error_to_string(rv));
260 rv = ecc_export_openssl(out, &out_len, PK_PUBLIC, &self->key);
261 if (rv != CRYPT_OK) croak("FATAL: ecc_export_openssl(PK_PUBLIC) failed: %s", error_to_string(rv));
239262 RETVAL = newSVpvn((char*)out, out_len);
240263 }
241264 else {
253276 unsigned char out[4096];
254277 unsigned long int out_len = sizeof(out);
255278
256 RETVAL = newSVpvn(NULL, 0); /* undef */
279 if (self->key.type == -1) croak("FATAL: export_key_der no key");
257280 if (strnEQ(type, "private", 7)) {
258 rv = ecc_export_raw(out, &out_len, PK_PRIVATE, &self->key);
259 if (rv != CRYPT_OK) croak("FATAL: ecc_export_raw(private) failed: %s", error_to_string(rv));
281 rv = ecc_get_key(out, &out_len, PK_PRIVATE, &self->key);
282 if (rv != CRYPT_OK) croak("FATAL: ecc_get_key(private) failed: %s", error_to_string(rv));
260283 RETVAL = newSVpvn((char*)out, out_len);
261284 }
262285 else if (strnEQ(type, "public_compressed", 17)) {
263 rv = ecc_export_raw(out, &out_len, PK_PUBLIC|PK_COMPRESSED, &self->key);
264 if (rv != CRYPT_OK) croak("FATAL: ecc_export_raw(public_compressed) failed: %s", error_to_string(rv));
286 rv = ecc_get_key(out, &out_len, PK_PUBLIC|PK_COMPRESSED, &self->key);
287 if (rv != CRYPT_OK) croak("FATAL: ecc_get_key(public_compressed) failed: %s", error_to_string(rv));
265288 RETVAL = newSVpvn((char*)out, out_len);
266289 }
267290 else if (strnEQ(type, "public", 6)) {
268 rv = ecc_export_raw(out, &out_len, PK_PUBLIC, &self->key);
269 if (rv != CRYPT_OK) croak("FATAL: ecc_export_raw(public) failed: %s", error_to_string(rv));
291 rv = ecc_get_key(out, &out_len, PK_PUBLIC, &self->key);
292 if (rv != CRYPT_OK) croak("FATAL: ecc_get_key(public) failed: %s", error_to_string(rv));
270293 RETVAL = newSVpvn((char*)out, out_len);
271294 }
272295 else {
277300 RETVAL
278301
279302 SV *
280 _encrypt(Crypt::PK::ECC self, SV * data, char * hash_name)
303 encrypt(Crypt::PK::ECC self, SV * data, const char * hash_name = "SHA1")
281304 CODE:
282305 {
283306 int rv, hash_id;
288311
289312 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
290313
291 hash_id = find_hash(hash_name);
314 hash_id = _find_hash(hash_name);
292315 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
293316 rv = ecc_encrypt_key(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
294317 &self->pstate, self->pindex,
300323 RETVAL
301324
302325 SV *
303 _decrypt(Crypt::PK::ECC self, SV * data)
326 decrypt(Crypt::PK::ECC self, SV * data)
304327 CODE:
305328 {
306329 int rv;
319342 RETVAL
320343
321344 SV *
322 _sign(Crypt::PK::ECC self, SV * data)
345 sign_hash(Crypt::PK::ECC self, SV * data, const char * hash_name = "SHA1")
323346 ALIAS:
324 _sign_rfc7518 = 1
325 CODE:
326 {
327 int rv;
328 unsigned char *data_ptr=NULL;
329 STRLEN data_len=0;
330 unsigned char buffer[1024];
331 unsigned long buffer_len = 1024;
347 sign_hash_rfc7518 = 3
348 sign_message = 1
349 sign_message_rfc7518 = 2
350 CODE:
351 {
352 int rv, id;
353 unsigned char buffer[1024], tmp[MAXBLOCKSIZE], *data_ptr = NULL;
354 unsigned long tmp_len = MAXBLOCKSIZE, buffer_len = 1024;
355 STRLEN data_len = 0;
332356
333357 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
334
335 if (ix == 1) {
358 if (ix == 1 || ix == 2) {
359 id = _find_hash(hash_name);
360 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
361 rv = hash_memory(id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
362 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
363 data_ptr = tmp;
364 data_len = tmp_len;
365 }
366 if (ix == 2 || ix == 3) {
336367 rv = ecc_sign_hash_rfc7518(data_ptr, (unsigned long)data_len, buffer, &buffer_len,
337368 &self->pstate, self->pindex,
338369 &self->key);
349380 RETVAL
350381
351382 int
352 _verify(Crypt::PK::ECC self, SV * sig, SV * data)
383 verify_hash(Crypt::PK::ECC self, SV * sig, SV * data, const char * hash_name = "SHA1")
353384 ALIAS:
354 _verify_rfc7518 = 1
355 CODE:
356 {
357 int rv, stat;
358 unsigned char *data_ptr=NULL;
359 STRLEN data_len=0;
360 unsigned char *sig_ptr=NULL;
361 STRLEN sig_len=0;
385 verify_hash_rfc7518 = 3
386 verify_message = 1
387 verify_message_rfc7518 = 2
388 CODE:
389 {
390 int rv, stat, id;
391 unsigned char tmp[MAXBLOCKSIZE], *data_ptr = NULL, *sig_ptr = NULL;
392 unsigned long tmp_len = MAXBLOCKSIZE;
393 STRLEN data_len = 0, sig_len = 0;
362394
363395 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
364396 sig_ptr = (unsigned char *)SvPVbyte(sig, sig_len);
365
397 if (ix == 1 || ix == 2) {
398 id = _find_hash(hash_name);
399 if (id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
400 rv = hash_memory(id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
401 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
402 data_ptr = tmp;
403 data_len = tmp_len;
404 }
366405 RETVAL = 1;
367406 stat = 0;
368 if (ix == 1) {
407 if (ix == 2 || ix == 3) {
369408 rv = ecc_verify_hash_rfc7518(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, &stat, &self->key);
370409 }
371410 else {
394433 void
395434 DESTROY(Crypt::PK::ECC self)
396435 CODE:
397 _ecc_free_key(&self->key, &self->dp);
436 if (self->key.type != -1) { ecc_free(&self->key); self->key.type = -1; }
398437 Safefree(self);
399438
00 MODULE = CryptX PACKAGE = Crypt::PK::RSA
11
2 PROTOTYPES: DISABLE
3
24 Crypt::PK::RSA
3 _new()
5 _new(Class)
46 CODE:
57 {
68 int rv;
260262 not_used = hv_store(rv_hash, "size", 4, newSViv(nsize), 0);
261263 /* type */
262264 not_used = hv_store(rv_hash, "type", 4, newSViv(self->key.type), 0);
263 if (not_used) not_used = NULL; /* just silence the warning: variable 'not_used' set but not used */
265 LTC_UNUSED_PARAM(not_used);
264266 RETVAL = newRV_noinc((SV*)rv_hash);
265267 OUTPUT:
266268 RETVAL
292294 RETVAL
293295
294296 SV *
295 _encrypt(Crypt::PK::RSA self, SV * data, char * padding, char * oaep_hash, SV * oaep_lparam)
297 encrypt(Crypt::PK::RSA self, SV * data, const char * padding = "oaep", const char * oaep_hash = "SHA1", SV * oaep_lparam = NULL)
296298 CODE:
297299 {
298300 int rv, hash_id;
307309
308310 RETVAL = newSVpvn(NULL, 0); /* undef */
309311 if (strnEQ(padding, "oaep", 4)) {
310 hash_id = find_hash(oaep_hash);
312 hash_id = _find_hash(oaep_hash);
311313 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", oaep_hash);
312 lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
314 if (oaep_lparam) lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
313315 rv = rsa_encrypt_key_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, lparam_ptr, (unsigned long)lparam_len,
314316 &self->pstate, self->pindex,
315317 hash_id, LTC_PKCS_1_OAEP, &self->key);
337339 RETVAL
338340
339341 SV *
340 _decrypt(Crypt::PK::RSA self, SV * data, char * padding, char * oaep_hash, SV * oaep_lparam)
342 decrypt(Crypt::PK::RSA self, SV * data, const char * padding = "oaep", const char * oaep_hash = "SHA1", SV * oaep_lparam = NULL)
341343 CODE:
342344 {
343345 int rv, hash_id, stat;
352354
353355 RETVAL = newSVpvn(NULL, 0); /* undef */
354356 if (strnEQ(padding, "oaep", 4)) {
355 hash_id = find_hash(oaep_hash);
357 hash_id = _find_hash(oaep_hash);
356358 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", oaep_hash);
357 lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
359 if (oaep_lparam) lparam_ptr = (unsigned char *)SvPVbyte(oaep_lparam, lparam_len);
358360 rv = rsa_decrypt_key_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, lparam_ptr, (unsigned long)lparam_len,
359361 hash_id, LTC_PKCS_1_OAEP, &stat, &self->key);
360362 if (rv != CRYPT_OK) croak("FATAL: rsa_decrypt_key_ex failed: %s", error_to_string(rv));
382384 RETVAL
383385
384386 SV *
385 _sign(Crypt::PK::RSA self, SV * data, char * padding, char * hash_name=NULL, unsigned long saltlen=12)
387 sign_hash(Crypt::PK::RSA self, SV * data, const char * hash_name = "SHA1", const char * padding = "pss", unsigned long saltlen=12)
388 ALIAS:
389 sign_message = 1
386390 CODE:
387391 {
388392 int rv, hash_id;
389 unsigned char *data_ptr=NULL;
390 STRLEN data_len=0;
391 unsigned char buffer[1024];
392 unsigned long buffer_len = 1024;
393 unsigned char buffer[1024], tmp[MAXBLOCKSIZE], *data_ptr = NULL;
394 unsigned long tmp_len = MAXBLOCKSIZE, buffer_len = 1024;
395 STRLEN data_len = 0;
393396
394397 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
395
396 RETVAL = newSVpvn(NULL, 0); /* undef */
398 if (ix == 1) {
399 hash_id = _find_hash(hash_name);
400 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
401 rv = hash_memory(hash_id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
402 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
403 data_ptr = tmp;
404 data_len = tmp_len;
405 }
397406 if (strnEQ(padding, "pss", 3)) {
398 hash_id = find_hash(hash_name);
407 hash_id = _find_hash(hash_name);
399408 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
400409 rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_PSS,
401410 &self->pstate, self->pindex,
404413 RETVAL = newSVpvn((char*)buffer, buffer_len);
405414 }
406415 else if (strnEQ(padding, "v1.5", 4)) {
407 hash_id = find_hash(hash_name);
416 hash_id = _find_hash(hash_name);
408417 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
409418 rv = rsa_sign_hash_ex(data_ptr, (unsigned long)data_len, buffer, &buffer_len, LTC_PKCS_1_V1_5,
410419 &self->pstate, self->pindex,
426435 RETVAL
427436
428437 int
429 _verify(Crypt::PK::RSA self, SV * sig, SV * data, char * padding, char * hash_name=NULL, unsigned long saltlen=12)
438 verify_hash(Crypt::PK::RSA self, SV * sig, SV * data, const char * hash_name = "SHA1", const char * padding = "pss", unsigned long saltlen = 12)
439 ALIAS:
440 verify_message = 1
430441 CODE:
431442 {
432443 int rv, hash_id, stat;
433 unsigned char *data_ptr=NULL;
434 STRLEN data_len=0;
435 unsigned char *sig_ptr=NULL;
436 STRLEN sig_len=0;
437 unsigned char buffer[1024];
438 unsigned long i, buffer_len = 1024;
444 unsigned char tmp[MAXBLOCKSIZE], buffer[1024], *data_ptr = NULL, *sig_ptr = NULL;
445 unsigned long i, tmp_len = MAXBLOCKSIZE, buffer_len = 1024;
446 STRLEN data_len = 0, sig_len = 0;
439447
440448 data_ptr = (unsigned char *)SvPVbyte(data, data_len);
441449 sig_ptr = (unsigned char *)SvPVbyte(sig, sig_len);
442
450 if (ix == 1) {
451 hash_id = _find_hash(hash_name);
452 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
453 rv = hash_memory(hash_id, data_ptr, (unsigned long)data_len, tmp, &tmp_len);
454 if (rv != CRYPT_OK) croak("FATAL: hash_memory failed: %s", error_to_string(rv));
455 data_ptr = tmp;
456 data_len = tmp_len;
457 }
443458 RETVAL = 1;
444459 stat = 0;
445460 if (strnEQ(padding, "pss", 3)) {
446 hash_id = find_hash(hash_name);
461 hash_id = _find_hash(hash_name);
447462 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
448463 rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_PSS,
449464 hash_id, saltlen, &stat, &self->key);
450465 if (rv != CRYPT_OK || stat != 1) RETVAL = 0;
451466 }
452467 else if (strnEQ(padding, "v1.5", 4)) {
453 hash_id = find_hash(hash_name);
468 hash_id = _find_hash(hash_name);
454469 if (hash_id == -1) croak("FATAL: find_hash failed for '%s'", hash_name);
455470 rv = rsa_verify_hash_ex(sig_ptr, (unsigned long)sig_len, data_ptr, (unsigned long)data_len, LTC_PKCS_1_V1_5,
456471 hash_id, 0, &stat, &self->key);
00 MODULE = CryptX PACKAGE = Crypt::PRNG
11
2 PROTOTYPES: DISABLE
3
24 Crypt::PRNG
3 _new(IV curpid, char * prng_name, SV * entropy=&PL_sv_undef)
4 CODE:
5 {
6 int rv, id;
5 new(char * class, ...)
6 CODE:
7 {
8 IV curpid = (IV)PerlProc_getpid();
9 int rv, id, idx;
710 unsigned char *ent=NULL;
811 STRLEN ent_len=0;
912 unsigned char entropy_buf[40];
13 char *prng_name = (char *)"ChaCha20";
14 SV *entropy = &PL_sv_undef;
15
16 /* we need to handle:
17 Crypt::PRNG->new('RC4');
18 Crypt::Cipher::RC4->new();
19 */
20 idx = strcmp("Crypt::PRNG", class) == 0 ? 1 : 0;
21 if (idx + 1 <= items) prng_name = SvPVX(ST(idx));
22 if (idx + 2 <= items) entropy = ST(idx + 1);
1023
1124 Newz(0, RETVAL, 1, struct prng_struct);
1225 if (!RETVAL) croak("FATAL: Newz failed");
1326
14 id = find_prng(prng_name);
27 id = _find_prng(prng_name);
1528 if (id == -1) {
1629 Safefree(RETVAL);
1730 croak("FATAL: find_prng failed for '%s'", prng_name);
1831 }
19 RETVAL->id = id;
2032 RETVAL->last_pid = curpid;
2133 RETVAL->desc = &prng_descriptor[id];
2234
5769 void
5870 DESTROY(Crypt::PRNG self)
5971 CODE:
60 {
6172 Safefree(self);
62 }
6373
6474 void
6575 add_entropy(Crypt::PRNG self, SV * entropy=&PL_sv_undef)
8494 }
8595
8696 SV *
87 _bytes(Crypt::PRNG self, IV curpid, STRLEN output_len)
88 CODE:
89 {
90 int rv_len;
91 unsigned char *rdata;
97 bytes(Crypt::PRNG self, unsigned long output_len)
98 ALIAS:
99 bytes_hex = 1
100 bytes_b64 = 2
101 bytes_b64u = 3
102 CODE:
103 {
104 IV curpid = (IV)PerlProc_getpid();
105 int rv_len, rv;
106 unsigned long len;
107 unsigned char *rdata, *tmp;
108 unsigned char entropy_buf[40];
109
110 if (output_len == 0) {
111 RETVAL = newSVpvn("", 0);
112 }
113 else {
114 if (self->last_pid != curpid) {
115 if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed");
116 self->desc->add_entropy(entropy_buf, 40, &self->state);
117 self->desc->ready(&self->state);
118 self->last_pid = curpid;
119 }
120 if (ix == 1) {
121 /* HEX */
122 Newz(0, tmp, output_len, unsigned char);
123 if (tmp == NULL) croak("FATAL: Newz failed");
124 rv_len = (self->desc->read)(tmp, (unsigned long)output_len, &self->state);
125 if ((UV)rv_len != output_len) croak("FATAL: PRNG_read failed");
126 RETVAL = NEWSV(0, output_len * 2); /* avoid zero! */
127 SvPOK_only(RETVAL);
128 SvCUR_set(RETVAL, output_len * 2);
129 rdata = (unsigned char *)SvPVX(RETVAL);
130 len = output_len * 2;
131 rv = _base16_encode(tmp, output_len, rdata, &len);
132 Safefree(tmp);
133 if (rv != CRYPT_OK) {
134 SvREFCNT_dec(RETVAL);
135 croak("FATAL: base16_encode failed");
136 }
137 }
138 else if (ix == 2 || ix == 3) {
139 /* BASE64 or BASE64URL */
140 Newz(0, tmp, output_len, unsigned char);
141 if (tmp == NULL) croak("FATAL: Newz failed");
142 rv_len = (self->desc->read)(tmp, (unsigned long)output_len, &self->state);
143 if ((UV)rv_len != output_len) croak("FATAL: PRNG_read failed");
144 RETVAL = NEWSV(0, output_len * 2); /* avoid zero! */
145 SvPOK_only(RETVAL);
146 SvCUR_set(RETVAL, output_len * 2);
147 rdata = (unsigned char *)SvPVX(RETVAL);
148 len = output_len * 2;
149 rv = ix == 3 ? base64url_encode(tmp, output_len, rdata, &len) :
150 base64_encode(tmp, output_len, rdata, &len);
151 SvCUR_set(RETVAL, len);
152 Safefree(tmp);
153 if (rv != CRYPT_OK) {
154 SvREFCNT_dec(RETVAL);
155 croak(ix == 3 ? "FATAL: base64url_encode failed" : "FATAL: base64_encode failed");
156 }
157 }
158 else {
159 /* RAW BYTES */
160 RETVAL = NEWSV(0, output_len); /* avoid zero! */
161 SvPOK_only(RETVAL);
162 SvCUR_set(RETVAL, output_len);
163 rdata = (unsigned char *)SvPVX(RETVAL);
164 rv_len = (self->desc->read)(rdata, (unsigned long)output_len, &self->state);
165 if ((UV)rv_len != output_len) {
166 SvREFCNT_dec(RETVAL);
167 croak("FATAL: PRNG_read failed");
168 }
169 }
170 }
171 }
172 OUTPUT:
173 RETVAL
174
175 UV
176 int32(Crypt::PRNG self)
177 CODE:
178 {
179 IV curpid = (IV)PerlProc_getpid();
180 int i;
181 unsigned char rdata[4];
92182 unsigned char entropy_buf[40];
93183
94184 if (self->last_pid != curpid) {
98188 self->last_pid = curpid;
99189 }
100190
101 RETVAL = NEWSV(0, output_len);
102 SvPOK_only(RETVAL);
103 SvCUR_set(RETVAL, output_len);
104 rdata = (unsigned char *)SvPVX(RETVAL);
105 rv_len = (self->desc->read)(rdata, (unsigned long)output_len, &self->state);
106 if ((UV)rv_len != output_len) {
107 SvREFCNT_dec(RETVAL);
108 croak("FATAL: PRNG_read failed");
109 }
110 }
111 OUTPUT:
112 RETVAL
113
114 UV
115 _int32(Crypt::PRNG self, IV curpid)
116 CODE:
117 {
191 i = (self->desc->read)(rdata, 4, &self->state);
192 if (i != 4) croak("FATAL: PRNG_read failed");
193 RETVAL = ((UV)(rdata[0])<<24) + ((UV)(rdata[1])<<16) + ((UV)(rdata[2])<<8) + ((UV)(rdata[3]));
194 }
195 OUTPUT:
196 RETVAL
197
198 NV
199 double(Crypt::PRNG self, SV * limit_sv = NULL)
200 CODE:
201 {
202 IV curpid = (IV)PerlProc_getpid();
118203 int i;
119 unsigned char rdata[4];
204 unsigned long a, b; /* 32bit is enough */
205 unsigned char rdata[7]; /* for double we need 53 bits */
120206 unsigned char entropy_buf[40];
121207
122208 if (self->last_pid != curpid) {
126212 self->last_pid = curpid;
127213 }
128214
129 i = (self->desc->read)(rdata, 4, &self->state);
130 if (i != 4) croak("FATAL: PRNG_read failed");
131 RETVAL = ((UV)(rdata[0])<<24) + ((UV)(rdata[1])<<16) + ((UV)(rdata[2])<<8) + ((UV)(rdata[3]));
132 }
133 OUTPUT:
134 RETVAL
135
136 NV
137 _double(Crypt::PRNG self, IV curpid, ...)
138 CODE:
139 {
140 int i;
141 unsigned long a, b; /* 32bit is enough */
142 unsigned char rdata[7]; /* for double we need 53 bits */
143 unsigned char entropy_buf[40];
144 NV limit;
145
146 if (self->last_pid != curpid) {
147 if (rng_get_bytes(entropy_buf, 40, NULL) != 40) croak("FATAL: rng_get_bytes failed");
148 self->desc->add_entropy(entropy_buf, 40, &self->state);
149 self->desc->ready(&self->state);
150 self->last_pid = curpid;
151 }
152
153215 i = (self->desc->read)(rdata, 7, &self->state);
154216 if (i != 7) croak("FATAL: PRNG_read failed");
155217 a = (((unsigned long)(rdata[0])<<16) + ((unsigned long)(rdata[1])<<8) + ((unsigned long)(rdata[2]))) & 0x1FFFFF; /* 21 bits */
156218 b = ((unsigned long)(rdata[3])<<24) + ((unsigned long)(rdata[4])<<16) + ((unsigned long)(rdata[5])<<8) + ((unsigned long)(rdata[6])); /* 32 bits */
157219 RETVAL = ( (NV)a * 4294967296.0 + (NV)b ) / 9007199254740992.0; /* (a * 2^32 + b) / 2^53 */
158 if (items>2 && SvOK(ST(2))) {
159 limit = SvNV(ST(2));
220 if (limit_sv && SvOK(limit_sv)) {
221 NV limit = SvNV(limit_sv);
160222 if (limit > 0 || limit < 0) RETVAL = RETVAL * limit;
161223 }
162224 }
00 MODULE = CryptX PACKAGE = Crypt::Stream::ChaCha
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::ChaCha
35 new(Class, SV * key, SV * nonce, UV counter = 0, int rounds = 20)
1214 k = (unsigned char *) SvPVbyte(key, k_len);
1315 iv = (unsigned char *) SvPVbyte(nonce, iv_len);
1416
15 Newz(0, RETVAL, 1, struct chacha_struct);
17 Newz(0, RETVAL, 1, chacha_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = chacha_setup(&RETVAL->state, k, (unsigned long)k_len, rounds);
20 rv = chacha_setup(RETVAL, k, (unsigned long)k_len, rounds);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: chacha_setup failed: %s", error_to_string(rv));
2224 }
2325
2426 if (iv_len == 12) {
25 rv = chacha_ivctr32(&RETVAL->state, iv, (unsigned long)iv_len, (ulong32)counter);
27 rv = chacha_ivctr32(RETVAL, iv, (unsigned long)iv_len, (ulong32)counter);
2628 if (rv != CRYPT_OK) {
2729 Safefree(RETVAL);
2830 croak("FATAL: chacha_ivctr32 failed: %s", error_to_string(rv));
2931 }
3032 }
3133 else if (iv_len == 8) {
32 rv = chacha_ivctr64(&RETVAL->state, iv, (unsigned long)iv_len, (ulong64)counter);
34 rv = chacha_ivctr64(RETVAL, iv, (unsigned long)iv_len, (ulong64)counter);
3335 if (rv != CRYPT_OK) {
3436 Safefree(RETVAL);
3537 croak("FATAL: chacha_ivctr64 failed: %s", error_to_string(rv));
4648 void
4749 DESTROY(Crypt::Stream::ChaCha self)
4850 CODE:
49 chacha_done(&self->state);
51 chacha_done(self);
5052 Safefree(self);
5153
5254 Crypt::Stream::ChaCha
5355 clone(Crypt::Stream::ChaCha self)
5456 CODE:
55 Newz(0, RETVAL, 1, struct chacha_struct);
57 Newz(0, RETVAL, 1, chacha_state);
5658 if (!RETVAL) croak("FATAL: Newz failed");
57 Copy(&self->state, &RETVAL->state, 1, struct chacha_struct);
59 Copy(self, RETVAL, 1, chacha_state);
5860 OUTPUT:
5961 RETVAL
6062
6567 int rv;
6668 unsigned char *out_data;
6769
68 RETVAL = NEWSV(0, out_len);
69 SvPOK_only(RETVAL);
70 SvCUR_set(RETVAL, out_len);
71 out_data = (unsigned char *)SvPVX(RETVAL);
72 rv = chacha_keystream(&self->state, out_data, (unsigned long)out_len);
73 if (rv != CRYPT_OK) {
74 SvREFCNT_dec(RETVAL);
75 croak("FATAL: chacha_keystream failed: %s", error_to_string(rv));
70 if (out_len == 0) {
71 RETVAL = newSVpvn("", 0);
72 }
73 else {
74 RETVAL = NEWSV(0, out_len); /* avoid zero! */
75 SvPOK_only(RETVAL);
76 SvCUR_set(RETVAL, out_len);
77 out_data = (unsigned char *)SvPVX(RETVAL);
78 rv = chacha_keystream(self, out_data, (unsigned long)out_len);
79 if (rv != CRYPT_OK) {
80 SvREFCNT_dec(RETVAL);
81 croak("FATAL: chacha_keystream failed: %s", error_to_string(rv));
82 }
7683 }
7784 }
7885 OUTPUT:
9198 RETVAL = newSVpvn("", 0);
9299 }
93100 else {
94 RETVAL = NEWSV(0, in_data_len);
101 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
95102 SvPOK_only(RETVAL);
96103 SvCUR_set(RETVAL, in_data_len);
97104 out_data = (unsigned char *)SvPVX(RETVAL);
98 rv = chacha_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
105 rv = chacha_crypt(self, in_data, (unsigned long)in_data_len, out_data);
99106 if (rv != CRYPT_OK) {
100107 SvREFCNT_dec(RETVAL);
101108 croak("FATAL: chacha_crypt failed: %s", error_to_string(rv));
00 MODULE = CryptX PACKAGE = Crypt::Stream::RC4
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::RC4
35 new(Class, SV * key)
1012 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1113 k = (unsigned char *) SvPVbyte(key, k_len);
1214
13 Newz(0, RETVAL, 1, struct rc4_struct);
15 Newz(0, RETVAL, 1, rc4_state);
1416 if (!RETVAL) croak("FATAL: Newz failed");
1517
16 rv = rc4_stream_setup(&RETVAL->state, k, (unsigned long)k_len);
18 rv = rc4_stream_setup(RETVAL, k, (unsigned long)k_len);
1719 if (rv != CRYPT_OK) {
1820 Safefree(RETVAL);
1921 croak("FATAL: rc4_stream_setup failed: %s", error_to_string(rv));
2527 void
2628 DESTROY(Crypt::Stream::RC4 self)
2729 CODE:
28 rc4_stream_done(&self->state);
30 rc4_stream_done(self);
2931 Safefree(self);
3032
3133 Crypt::Stream::RC4
3234 clone(Crypt::Stream::RC4 self)
3335 CODE:
34 Newz(0, RETVAL, 1, struct rc4_struct);
36 Newz(0, RETVAL, 1, rc4_state);
3537 if (!RETVAL) croak("FATAL: Newz failed");
36 Copy(&self->state, &RETVAL->state, 1, struct rc4_struct);
38 Copy(self, RETVAL, 1, rc4_state);
3739 OUTPUT:
3840 RETVAL
3941
4446 int rv;
4547 unsigned char *out_data;
4648
47 RETVAL = NEWSV(0, out_len);
48 SvPOK_only(RETVAL);
49 SvCUR_set(RETVAL, out_len);
50 out_data = (unsigned char *)SvPVX(RETVAL);
51 rv = rc4_stream_keystream(&self->state, out_data, (unsigned long)out_len);
52 if (rv != CRYPT_OK) {
53 SvREFCNT_dec(RETVAL);
54 croak("FATAL: rc4_stream_keystream failed: %s", error_to_string(rv));
49 if (out_len == 0) {
50 RETVAL = newSVpvn("", 0);
51 }
52 else {
53 RETVAL = NEWSV(0, out_len); /* avoid zero! */
54 SvPOK_only(RETVAL);
55 SvCUR_set(RETVAL, out_len);
56 out_data = (unsigned char *)SvPVX(RETVAL);
57 rv = rc4_stream_keystream(self, out_data, (unsigned long)out_len);
58 if (rv != CRYPT_OK) {
59 SvREFCNT_dec(RETVAL);
60 croak("FATAL: rc4_stream_keystream failed: %s", error_to_string(rv));
61 }
5562 }
5663 }
5764 OUTPUT:
7077 RETVAL = newSVpvn("", 0);
7178 }
7279 else {
73 RETVAL = NEWSV(0, in_data_len);
80 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
7481 SvPOK_only(RETVAL);
7582 SvCUR_set(RETVAL, in_data_len);
7683 out_data = (unsigned char *)SvPVX(RETVAL);
77 rv = rc4_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
84 rv = rc4_stream_crypt(self, in_data, (unsigned long)in_data_len, out_data);
7885 if (rv != CRYPT_OK) {
7986 SvREFCNT_dec(RETVAL);
8087 croak("FATAL: rc4_stream_crypt failed: %s", error_to_string(rv));
00 MODULE = CryptX PACKAGE = Crypt::Stream::Rabbit
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::Rabbit
35 new(Class, SV * key, SV * nonce=&PL_sv_undef)
1012 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1113 k = (unsigned char *)SvPVbyte(key, k_len);
1214
13 Newz(0, RETVAL, 1, struct rabbit_struct);
15 Newz(0, RETVAL, 1, rabbit_state);
1416 if (!RETVAL) croak("FATAL: Newz failed");
1517
16 rv = rabbit_setup(&RETVAL->state, k, (unsigned long)k_len);
18 rv = rabbit_setup(RETVAL, k, (unsigned long)k_len);
1719 if (rv != CRYPT_OK) {
1820 Safefree(RETVAL);
1921 croak("FATAL: rabbit_setup failed: %s", error_to_string(rv));
2224 if (SvOK(nonce)) {
2325 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
2426 iv = (unsigned char *)SvPVbyte(nonce, iv_len);
25 rv = rabbit_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
27 rv = rabbit_setiv(RETVAL, iv, (unsigned long)iv_len);
2628 if (rv != CRYPT_OK) {
2729 Safefree(RETVAL);
2830 croak("FATAL: rabbit_setiv failed: %s", error_to_string(rv));
3638 void
3739 DESTROY(Crypt::Stream::Rabbit self)
3840 CODE:
39 rabbit_done(&self->state);
41 rabbit_done(self);
4042 Safefree(self);
4143
4244 Crypt::Stream::Rabbit
4345 clone(Crypt::Stream::Rabbit self)
4446 CODE:
45 Newz(0, RETVAL, 1, struct rabbit_struct);
47 Newz(0, RETVAL, 1, rabbit_state);
4648 if (!RETVAL) croak("FATAL: Newz failed");
47 Copy(&self->state, &RETVAL->state, 1, struct rabbit_struct);
49 Copy(self, RETVAL, 1, rabbit_state);
4850 OUTPUT:
4951 RETVAL
5052
5557 int rv;
5658 unsigned char *out_data;
5759
58 RETVAL = NEWSV(0, out_len);
59 SvPOK_only(RETVAL);
60 SvCUR_set(RETVAL, out_len);
61 out_data = (unsigned char *)SvPVX(RETVAL);
62 rv = rabbit_keystream(&self->state, out_data, (unsigned long)out_len);
63 if (rv != CRYPT_OK) {
64 SvREFCNT_dec(RETVAL);
65 croak("FATAL: rabbit_keystream failed: %s", error_to_string(rv));
60 if (out_len == 0) {
61 RETVAL = newSVpvn("", 0);
62 }
63 else {
64 RETVAL = NEWSV(0, out_len); /* avoid zero! */
65 SvPOK_only(RETVAL);
66 SvCUR_set(RETVAL, out_len);
67 out_data = (unsigned char *)SvPVX(RETVAL);
68 rv = rabbit_keystream(self, out_data, (unsigned long)out_len);
69 if (rv != CRYPT_OK) {
70 SvREFCNT_dec(RETVAL);
71 croak("FATAL: rabbit_keystream failed: %s", error_to_string(rv));
72 }
6673 }
6774 }
6875 OUTPUT:
8188 RETVAL = newSVpvn("", 0);
8289 }
8390 else {
84 RETVAL = NEWSV(0, in_data_len);
91 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
8592 SvPOK_only(RETVAL);
8693 SvCUR_set(RETVAL, in_data_len);
8794 out_data = (unsigned char *)SvPVX(RETVAL);
88 rv = rabbit_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
95 rv = rabbit_crypt(self, in_data, (unsigned long)in_data_len, out_data);
8996 if (rv != CRYPT_OK) {
9097 SvREFCNT_dec(RETVAL);
9198 croak("FATAL: rabbit_crypt failed: %s", error_to_string(rv));
00 MODULE = CryptX PACKAGE = Crypt::Stream::Salsa20
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::Salsa20
35 new(Class, SV * key, SV * nonce, UV counter = 0, int rounds = 20)
1214 k = (unsigned char *)SvPVbyte(key, k_len);
1315 iv = (unsigned char *)SvPVbyte(nonce, iv_len);
1416
15 Newz(0, RETVAL, 1, struct salsa20_struct);
17 Newz(0, RETVAL, 1, salsa20_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = salsa20_setup(&RETVAL->state, k, (unsigned long)k_len, rounds);
20 rv = salsa20_setup(RETVAL, k, (unsigned long)k_len, rounds);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: salsa20_setup failed: %s", error_to_string(rv));
2224 }
2325
24 rv = salsa20_ivctr64(&RETVAL->state, iv, (unsigned long)iv_len, (ulong64)counter);
26 rv = salsa20_ivctr64(RETVAL, iv, (unsigned long)iv_len, (ulong64)counter);
2527 if (rv != CRYPT_OK) {
2628 Safefree(RETVAL);
2729 croak("FATAL: salsa20_ivctr64 failed: %s", error_to_string(rv));
3335 void
3436 DESTROY(Crypt::Stream::Salsa20 self)
3537 CODE:
36 salsa20_done(&self->state);
38 salsa20_done(self);
3739 Safefree(self);
3840
3941 Crypt::Stream::Salsa20
4042 clone(Crypt::Stream::Salsa20 self)
4143 CODE:
42 Newz(0, RETVAL, 1, struct salsa20_struct);
44 Newz(0, RETVAL, 1, salsa20_state);
4345 if (!RETVAL) croak("FATAL: Newz failed");
44 Copy(&self->state, &RETVAL->state, 1, struct salsa20_struct);
46 Copy(self, RETVAL, 1, salsa20_state);
4547 OUTPUT:
4648 RETVAL
4749
5254 int rv;
5355 unsigned char *out_data;
5456
55 RETVAL = NEWSV(0, out_len);
56 SvPOK_only(RETVAL);
57 SvCUR_set(RETVAL, out_len);
58 out_data = (unsigned char *)SvPVX(RETVAL);
59 rv = salsa20_keystream(&self->state, out_data, (unsigned long)out_len);
60 if (rv != CRYPT_OK) {
61 SvREFCNT_dec(RETVAL);
62 croak("FATAL: salsa20_keystream failed: %s", error_to_string(rv));
57 if (out_len == 0) {
58 RETVAL = newSVpvn("", 0);
59 }
60 else {
61 RETVAL = NEWSV(0, out_len); /* avoid zero! */
62 SvPOK_only(RETVAL);
63 SvCUR_set(RETVAL, out_len);
64 out_data = (unsigned char *)SvPVX(RETVAL);
65 rv = salsa20_keystream(self, out_data, (unsigned long)out_len);
66 if (rv != CRYPT_OK) {
67 SvREFCNT_dec(RETVAL);
68 croak("FATAL: salsa20_keystream failed: %s", error_to_string(rv));
69 }
6370 }
6471 }
6572 OUTPUT:
7885 RETVAL = newSVpvn("", 0);
7986 }
8087 else {
81 RETVAL = NEWSV(0, in_data_len);
88 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
8289 SvPOK_only(RETVAL);
8390 SvCUR_set(RETVAL, in_data_len);
8491 out_data = (unsigned char *)SvPVX(RETVAL);
85 rv = salsa20_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
92 rv = salsa20_crypt(self, in_data, (unsigned long)in_data_len, out_data);
8693 if (rv != CRYPT_OK) {
8794 SvREFCNT_dec(RETVAL);
8895 croak("FATAL: salsa20_crypt failed: %s", error_to_string(rv));
00 MODULE = CryptX PACKAGE = Crypt::Stream::Sober128
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::Sober128
35 new(Class, SV * key, SV * nonce)
1214 k = (unsigned char *) SvPVbyte(key, k_len);
1315 iv = (unsigned char *) SvPVbyte(nonce, iv_len);
1416
15 Newz(0, RETVAL, 1, struct sober128_struct);
17 Newz(0, RETVAL, 1, sober128_state);
1618 if (!RETVAL) croak("FATAL: Newz failed");
1719
18 rv = sober128_stream_setup(&RETVAL->state, k, (unsigned long)k_len);
20 rv = sober128_stream_setup(RETVAL, k, (unsigned long)k_len);
1921 if (rv != CRYPT_OK) {
2022 Safefree(RETVAL);
2123 croak("FATAL: sober128_stream_setup failed: %s", error_to_string(rv));
2224 }
2325
24 rv = sober128_stream_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
26 rv = sober128_stream_setiv(RETVAL, iv, (unsigned long)iv_len);
2527 if (rv != CRYPT_OK) {
2628 Safefree(RETVAL);
2729 croak("FATAL: sober128_stream_setiv failed: %s", error_to_string(rv));
3335 void
3436 DESTROY(Crypt::Stream::Sober128 self)
3537 CODE:
36 sober128_stream_done(&self->state);
38 sober128_stream_done(self);
3739 Safefree(self);
3840
3941 Crypt::Stream::Sober128
4042 clone(Crypt::Stream::Sober128 self)
4143 CODE:
42 Newz(0, RETVAL, 1, struct sober128_struct);
44 Newz(0, RETVAL, 1, sober128_state);
4345 if (!RETVAL) croak("FATAL: Newz failed");
44 Copy(&self->state, &RETVAL->state, 1, struct sober128_struct);
46 Copy(self, RETVAL, 1, sober128_state);
4547 OUTPUT:
4648 RETVAL
4749
5254 int rv;
5355 unsigned char *out_data;
5456
55 RETVAL = NEWSV(0, out_len);
56 SvPOK_only(RETVAL);
57 SvCUR_set(RETVAL, out_len);
58 out_data = (unsigned char *)SvPVX(RETVAL);
59 rv = sober128_stream_keystream(&self->state, out_data, (unsigned long)out_len);
60 if (rv != CRYPT_OK) {
61 SvREFCNT_dec(RETVAL);
62 croak("FATAL: sober128_stream_keystream failed: %s", error_to_string(rv));
57 if (out_len == 0) {
58 RETVAL = newSVpvn("", 0);
59 }
60 else {
61 RETVAL = NEWSV(0, out_len); /* avoid zero! */
62 SvPOK_only(RETVAL);
63 SvCUR_set(RETVAL, out_len);
64 out_data = (unsigned char *)SvPVX(RETVAL);
65 rv = sober128_stream_keystream(self, out_data, (unsigned long)out_len);
66 if (rv != CRYPT_OK) {
67 SvREFCNT_dec(RETVAL);
68 croak("FATAL: sober128_stream_keystream failed: %s", error_to_string(rv));
69 }
6370 }
6471 }
6572 OUTPUT:
7885 RETVAL = newSVpvn("", 0);
7986 }
8087 else {
81 RETVAL = NEWSV(0, in_data_len);
88 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
8289 SvPOK_only(RETVAL);
8390 SvCUR_set(RETVAL, in_data_len);
8491 out_data = (unsigned char *)SvPVX(RETVAL);
85 rv = sober128_stream_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
92 rv = sober128_stream_crypt(self, in_data, (unsigned long)in_data_len, out_data);
8693 if (rv != CRYPT_OK) {
8794 SvREFCNT_dec(RETVAL);
8895 croak("FATAL: sober128_stream_crypt failed: %s", error_to_string(rv));
00 MODULE = CryptX PACKAGE = Crypt::Stream::Sosemanuk
1
2 PROTOTYPES: DISABLE
13
24 Crypt::Stream::Sosemanuk
35 new(Class, SV * key, SV * nonce=&PL_sv_undef)
1012 if (!SvPOK(key)) croak("FATAL: key must be string/buffer scalar");
1113 k = (unsigned char *)SvPVbyte(key, k_len);
1214
13 Newz(0, RETVAL, 1, struct sosemanuk_struct);
15 Newz(0, RETVAL, 1, sosemanuk_state);
1416 if (!RETVAL) croak("FATAL: Newz failed");
1517
16 rv = sosemanuk_setup(&RETVAL->state, k, (unsigned long)k_len);
18 rv = sosemanuk_setup(RETVAL, k, (unsigned long)k_len);
1719 if (rv != CRYPT_OK) {
1820 Safefree(RETVAL);
1921 croak("FATAL: sosemanuk_setup failed: %s", error_to_string(rv));
2224 if (SvOK(nonce)) {
2325 if (!SvPOK(nonce)) croak("FATAL: nonce must be string/buffer scalar");
2426 iv = (unsigned char *)SvPVbyte(nonce, iv_len);
25 rv = sosemanuk_setiv(&RETVAL->state, iv, (unsigned long)iv_len);
27 rv = sosemanuk_setiv(RETVAL, iv, (unsigned long)iv_len);
2628 }
2729 else {
28 rv = sosemanuk_setiv(&RETVAL->state, NULL, 0);
30 rv = sosemanuk_setiv(RETVAL, NULL, 0);
2931 }
3032 if (rv != CRYPT_OK) {
3133 Safefree(RETVAL);
3941 void
4042 DESTROY(Crypt::Stream::Sosemanuk self)
4143 CODE:
42 sosemanuk_done(&self->state);
44 sosemanuk_done(self);
4345 Safefree(self);
4446
4547 Crypt::Stream::Sosemanuk
4648 clone(Crypt::Stream::Sosemanuk self)
4749 CODE:
48 Newz(0, RETVAL, 1, struct sosemanuk_struct);
50 Newz(0, RETVAL, 1, sosemanuk_state);
4951 if (!RETVAL) croak("FATAL: Newz failed");
50 Copy(&self->state, &RETVAL->state, 1, struct sosemanuk_struct);
52 Copy(self, RETVAL, 1, sosemanuk_state);
5153 OUTPUT:
5254 RETVAL
5355
5860 int rv;
5961 unsigned char *out_data;
6062
61 RETVAL = NEWSV(0, out_len);
62 SvPOK_only(RETVAL);
63 SvCUR_set(RETVAL, out_len);
64 out_data = (unsigned char *)SvPVX(RETVAL);
65 rv = sosemanuk_keystream(&self->state, out_data, (unsigned long)out_len);
66 if (rv != CRYPT_OK) {
67 SvREFCNT_dec(RETVAL);
68 croak("FATAL: sosemanuk_keystream failed: %s", error_to_string(rv));
63 if (out_len == 0) {
64 RETVAL = newSVpvn("", 0);
65 }
66 else {
67 RETVAL = NEWSV(0, out_len); /* avoid zero! */
68 SvPOK_only(RETVAL);
69 SvCUR_set(RETVAL, out_len);
70 out_data = (unsigned char *)SvPVX(RETVAL);
71 rv = sosemanuk_keystream(self, out_data, (unsigned long)out_len);
72 if (rv != CRYPT_OK) {
73 SvREFCNT_dec(RETVAL);
74 croak("FATAL: sosemanuk_keystream failed: %s", error_to_string(rv));
75 }
6976 }
7077 }
7178 OUTPUT:
8491 RETVAL = newSVpvn("", 0);
8592 }
8693 else {
87 RETVAL = NEWSV(0, in_data_len);
94 RETVAL = NEWSV(0, in_data_len); /* avoid zero! */
8895 SvPOK_only(RETVAL);
8996 SvCUR_set(RETVAL, in_data_len);
9097 out_data = (unsigned char *)SvPVX(RETVAL);
91 rv = sosemanuk_crypt(&self->state, in_data, (unsigned long)in_data_len, out_data);
98 rv = sosemanuk_crypt(self, in_data, (unsigned long)in_data_len, out_data);
9299 if (rv != CRYPT_OK) {
93100 SvREFCNT_dec(RETVAL);
94101 croak("FATAL: sosemanuk_crypt failed: %s", error_to_string(rv));
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 use base qw(Crypt::AuthEnc Exporter);
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( ccm_encrypt_authenticate ccm_decrypt_verify )] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14 use Crypt::Cipher;
1514
16 sub new {
17 my $class = shift;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
20 }
21
22 sub ccm_encrypt_authenticate {
23 my $cipher_name = shift;
24 my $key = shift;
25 my $iv = shift;
26 my $adata = shift;
27 my $tag_len = shift;
28 my $plaintext = shift;
29
30 $iv = "" if !defined $iv;
31 $adata = "" if !defined $adata;
32 $plaintext = "" if !defined $plaintext;
33
34 local $SIG{__DIE__} = \&CryptX::_croak;
35 my $m = Crypt::AuthEnc::CCM->new($cipher_name, $key, $iv, $adata, $tag_len, length($plaintext));
36 my $ct = $m->encrypt_add($plaintext);
37 my $tag = $m->encrypt_done();
38 return ($ct, $tag);
39 }
40
41 sub ccm_decrypt_verify {
42 my $cipher_name = shift;
43 my $key = shift;
44 my $iv = shift;
45 my $adata = shift;
46 my $ciphertext = shift;
47 my $tag = shift;
48
49 $iv = "" if !defined $iv;
50 $adata = "" if !defined $adata;
51 $ciphertext = "" if !defined $ciphertext;
52
53 local $SIG{__DIE__} = \&CryptX::_croak;
54 my $m = Crypt::AuthEnc::CCM->new($cipher_name, $key, $iv, $adata, length($tag), length($ciphertext));
55 my $pt = $m->decrypt_add($ciphertext);
56 return $m->decrypt_done($tag) ? $pt : undef;
57 }
15 sub CLONE_SKIP { 1 } # prevent cloning
5816
5917 1;
6018
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 use base qw(Crypt::AuthEnc Exporter);
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( chacha20poly1305_encrypt_authenticate chacha20poly1305_decrypt_verify )] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
1414
15 sub new {
16 my $class = shift;
17 local $SIG{__DIE__} = \&CryptX::_croak;
18 return _new(@_);
19 }
20
21 sub chacha20poly1305_encrypt_authenticate {
22 my $key = shift;
23 my $iv = shift;
24 my $adata = shift;
25 my $plaintext = shift;
26
27 local $SIG{__DIE__} = \&CryptX::_croak;
28 my $m = Crypt::AuthEnc::ChaCha20Poly1305->new($key, $iv);
29 $m->adata_add(defined $adata ? $adata : ''); #XXX-TODO if no aad we have to pass empty string
30 my $ct = $m->encrypt_add($plaintext);
31 my $tag = $m->encrypt_done;
32 return ($ct, $tag);
33 }
34
35 sub chacha20poly1305_decrypt_verify {
36 my $key = shift;
37 my $iv = shift;
38 my $adata = shift;
39 my $ciphertext = shift;
40 my $tag = shift;
41
42 local $SIG{__DIE__} = \&CryptX::_croak;
43 my $m = Crypt::AuthEnc::ChaCha20Poly1305->new($key, $iv);
44 $m->adata_add(defined $adata ? $adata : ''); #XXX-TODO if no aad we have to pass empty string
45 my $ct = $m->decrypt_add($ciphertext);
46 return $m->decrypt_done($tag) ? $ct : undef;
47 }
15 sub CLONE_SKIP { 1 } # prevent cloning
4816
4917 1;
5018
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 use base qw(Crypt::AuthEnc Exporter);
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( eax_encrypt_authenticate eax_decrypt_verify )] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14 use Crypt::Cipher;
15
16 ### the following methods/functions are implemented in XS:
17 # - _new
18 # - DESTROY
19 # - clone
20 # - encrypt_add
21 # - encrypt_done
22 # - decrypt_add
23 # - decrypt_done
24 # - adata_add
25
26 sub new {
27 my $class = shift;
28 local $SIG{__DIE__} = \&CryptX::_croak;
29 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
30 }
31
32 sub eax_encrypt_authenticate {
33 my $cipher_name = shift;
34 my $key = shift;
35 my $iv = shift;
36 my $adata = shift;
37 my $plaintext = shift;
38
39 local $SIG{__DIE__} = \&CryptX::_croak;
40 my $m = Crypt::AuthEnc::EAX->new($cipher_name, $key, $iv);
41 $m->adata_add($adata) if defined $adata;
42 my $ct = $m->encrypt_add($plaintext);
43 my $tag = $m->encrypt_done;
44 return ($ct, $tag);
45 }
46
47 sub eax_decrypt_verify {
48 my $cipher_name = shift;
49 my $key = shift;
50 my $iv = shift;
51 my $adata = shift;
52 my $ciphertext = shift;
53 my $tag = shift;
54
55 local $SIG{__DIE__} = \&CryptX::_croak;
56 my $m = Crypt::AuthEnc::EAX->new($cipher_name, $key, $iv);
57 $m->adata_add($adata) if defined $adata;
58 my $ct = $m->decrypt_add($ciphertext);
59 return $m->decrypt_done($tag) ? $ct : undef;
60 }
6114
6215 # obsolete, only for backwards compatibility
6316 sub header_add { goto &adata_add }
6417 sub aad_add { goto &adata_add }
18
19 sub CLONE_SKIP { 1 } # prevent cloning
6520
6621 1;
6722
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 use base qw(Crypt::AuthEnc Exporter);
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( gcm_encrypt_authenticate gcm_decrypt_verify )] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14 use Crypt::Cipher;
1514
16 sub new {
17 my ($class, $cipher, $key, $iv) = @_;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 my $self = _new(Crypt::Cipher::_trans_cipher_name($cipher), $key);
20 # for backwards compatibility the $iv is optional
21 $self->iv_add($iv) if defined $iv;
22 return $self;
23 }
24
25 sub gcm_encrypt_authenticate {
26 my $cipher_name = shift;
27 my $key = shift;
28 my $iv = shift;
29 my $adata = shift;
30 my $plaintext = shift;
31
32 local $SIG{__DIE__} = \&CryptX::_croak;
33 my $m = Crypt::AuthEnc::GCM->new($cipher_name, $key);
34 $m->iv_add($iv);
35 $m->adata_add(defined $adata ? $adata : ''); #XXX-TODO if no aad we have to pass empty string
36 my $ct = $m->encrypt_add($plaintext);
37 my $tag = $m->encrypt_done;
38 return ($ct, $tag);
39 }
40
41 sub gcm_decrypt_verify {
42 my $cipher_name = shift;
43 my $key = shift;
44 my $iv = shift;
45 my $adata = shift;
46 my $ciphertext = shift;
47 my $tag = shift;
48
49 local $SIG{__DIE__} = \&CryptX::_croak;
50 my $m = Crypt::AuthEnc::GCM->new($cipher_name, $key);
51 $m->iv_add($iv);
52 $m->adata_add(defined $adata ? $adata : ''); #XXX-TODO if no aad we have to pass empty string
53 my $ct = $m->decrypt_add($ciphertext);
54 return $m->decrypt_done($tag) ? $ct : undef;
55 }
15 sub CLONE_SKIP { 1 } # prevent cloning
5616
5717 1;
5818
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 use base qw(Crypt::AuthEnc Exporter);
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( ocb_encrypt_authenticate ocb_decrypt_verify )] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14 use Crypt::Cipher;
15
16 sub new {
17 my $class = shift;
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 return _new(Crypt::Cipher::_trans_cipher_name(shift), @_);
20 }
21
22 sub ocb_encrypt_authenticate {
23 my $cipher_name = shift;
24 my $key = shift;
25 my $nonce = shift;
26 my $adata = shift;
27 my $tag_len = shift;
28 my $plaintext = shift;
29
30 local $SIG{__DIE__} = \&CryptX::_croak;
31 my $m = Crypt::AuthEnc::OCB->new($cipher_name, $key, $nonce, $tag_len);
32 $m->adata_add($adata) if defined $adata;
33 my $ct = $m->encrypt_last($plaintext);
34 my $tag = $m->encrypt_done;
35 return ($ct, $tag);
36 }
37
38 sub ocb_decrypt_verify {
39 my $cipher_name = shift;
40 my $key = shift;
41 my $nonce = shift;
42 my $adata = shift;
43 my $ciphertext = shift;
44 my $tag = shift;
45
46 local $SIG{__DIE__} = \&CryptX::_croak;
47 my $m = Crypt::AuthEnc::OCB->new($cipher_name, $key, $nonce, length($tag));
48 $m->adata_add($adata) if defined $adata;
49 my $ct = $m->decrypt_last($ciphertext);
50 return $m->decrypt_done($tag) ? $ct : undef;
51 }
5214
5315 # obsolete, only for backwards compatibility
5416 sub aad_add { goto &adata_add }
5517 sub blocksize { return 16 }
18
19 sub CLONE_SKIP { 1 } # prevent cloning
5620
5721 1;
5822
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 sub CLONE_SKIP { 1 } # prevent cloning
6 ### not used
77
88 1;
99
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
5
6 use base qw(Crypt::Checksum Exporter);
7 our %EXPORT_TAGS = ( all => [qw( adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int )] );
8 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
9 our @EXPORT = qw();
510
611 use Carp;
712 $Carp::Internal{(__PACKAGE__)}++;
813 use CryptX;
914
10 sub addfile {
11 my ($self, $file) = @_;
12
13 my $handle;
14 if (ref(\$file) eq 'SCALAR') { #filename
15 open($handle, "<", $file) || croak "FATAL: cannot open '$file': $!";
16 binmode($handle);
17 }
18 else { #handle
19 $handle = $file
20 }
21 croak "FATAL: invalid handle" unless defined $handle;
22
23 my $n;
24 my $buf = "";
25 while (($n = read($handle, $buf, 32*1024))) {
26 $self->add($buf)
27 }
28 croak "FATAL: read failed: $!" unless defined $n;
29
30 return $self;
31 }
32
33 sub CLONE_SKIP { 1 } # prevent cloning
15 sub adler32_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->addfile(@_)->digest }
16 sub adler32_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->addfile(@_)->hexdigest }
17 sub adler32_file_int { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->addfile(@_)->intdigest }
3418
3519 1;
3620
4226
4327 =head1 SYNOPSIS
4428
29 ### Functional interface:
30 use Crypt::Checksum::Adler32 ':all';
31
32 # calculate Adler32 checksum from string/buffer
33 $checksum_raw = adler32_data($data);
34 $checksum_hex = adler32_data_hex($data);
35 $checksum_int = adler32_data_int($data);
36 # calculate Adler32 checksum from file
37 $checksum_raw = adler32_file('filename.dat');
38 $checksum_hex = adler32_file_hex('filename.dat');
39 $checksum_int = adler32_file_int('filename.dat');
40 # calculate Adler32 checksum from filehandle
41 $checksum_raw = adler32_file(*FILEHANDLE);
42 $checksum_hex = adler32_file_hex(*FILEHANDLE);
43 $checksum_int = adler32_file_int(*FILEHANDLE);
44
45 ### OO interface:
4546 use Crypt::Checksum::Adler32;
4647
4748 $d = Crypt::Checksum::Adler32->new;
4849 $d->add('any data');
50 $d->add('another data');
4951 $d->addfile('filename.dat');
5052 $d->addfile(*FILEHANDLE);
51 $checksum_raw = $d->digest; # raw bytes
53 $checksum_raw = $d->digest; # raw 4 bytes
5254 $checksum_hex = $d->hexdigest; # hexadecimal form
55 $checksum_int = $d->intdigest; # 32bit unsigned integer
5356
5457 =head1 DESCRIPTION
5558
56 Calculating Adler32 checksums (OO interface);
59 Calculating Adler32 checksums.
5760
58 I<Since: CryptX-0.032>
61 I<Updated: v0.057>
62
63 =head1 EXPORT
64
65 Nothing is exported by default.
66
67 You can export selected functions:
68
69 use Crypt::Checksum::Adler32 qw(adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int);
70
71 Or all of them at once:
72
73 use Crypt::Checksum::Adler32 ':all';
74
75 =head1 FUNCTIONS
76
77 =head2 adler32_data
78
79 Returns checksum as raw octects.
80
81 $checksum_raw = adler32_data('data string');
82 #or
83 $checksum_raw = adler32_data('any data', 'more data', 'even more data');
84
85 =head2 adler32_data_hex
86
87 Returns checksum as a hexadecimal string.
88
89 $checksum_hex = adler32_data_hex('data string');
90 #or
91 $checksum_hex = adler32_data_hex('any data', 'more data', 'even more data');
92
93 =head2 adler32_data_int
94
95 Returns checksum as unsigned 32bit integer.
96
97 $checksum_int = adler32_data_int('data string');
98 #or
99 $checksum_int = adler32_data_int('any data', 'more data', 'even more data');
100
101 =head2 adler32_file
102
103 Returns checksum as raw octects.
104
105 $checksum_raw = adler32_file('filename.dat');
106 #or
107 $checksum_raw = adler32_file(*FILEHANDLE);
108
109 =head2 adler32_file_hex
110
111 Returns checksum as a hexadecimal string.
112
113 $checksum_hex = adler32_file_hex('filename.dat');
114 #or
115 $checksum_hex = adler32_file_hex(*FILEHANDLE);
116
117 =head2 adler32_file_int
118
119 Returns checksum as unsigned 32bit integer.
120
121 $checksum_int = adler32_file_int('filename.dat');
122 #or
123 $checksum_int = adler32_file_int(*FILEHANDLE);
59124
60125 =head1 METHODS
61126
109174
110175 $result_hex = $d->hexdigest();
111176
177 =head2 intdigest
178
179 Returns the checksum encoded as unsigned 32bit integer.
180
181 $result_int = $d->intdigest();
182
112183 =head1 SEE ALSO
113184
114185 =over
115186
116 =item * L<CryptX|CryptX>, L<Crypt::Checksum>
187 =item * L<CryptX|CryptX>
117188
118189 =item * L<https://en.wikipedia.org/wiki/Adler-32>
119190
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
5
6 use base qw(Crypt::Checksum Exporter);
7 our %EXPORT_TAGS = ( all => [qw( crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int )] );
8 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
9 our @EXPORT = qw();
510
611 use Carp;
712 $Carp::Internal{(__PACKAGE__)}++;
813 use CryptX;
914
10 sub addfile {
11 my ($self, $file) = @_;
12
13 my $handle;
14 if (ref(\$file) eq 'SCALAR') { #filename
15 open($handle, "<", $file) || croak "FATAL: cannot open '$file': $!";
16 binmode($handle);
17 }
18 else { #handle
19 $handle = $file
20 }
21 croak "FATAL: invalid handle" unless defined $handle;
22
23 my $n;
24 my $buf = "";
25 while (($n = read($handle, $buf, 32*1024))) {
26 $self->add($buf)
27 }
28 croak "FATAL: read failed: $!" unless defined $n;
29
30 return $self;
31 }
32
33 sub CLONE_SKIP { 1 } # prevent cloning
15 sub crc32_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->digest }
16 sub crc32_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->hexdigest }
17 sub crc32_file_int { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->intdigest }
3418
3519 1;
3620
4226
4327 =head1 SYNOPSIS
4428
29 ### Functional interface:
30 use Crypt::Checksum::CRC32 ':all';
31
32 # calculate CRC32 checksum from string/buffer
33 $checksum_raw = crc32_data($data);
34 $checksum_hex = crc32_data_hex($data);
35 $checksum_int = crc32_data_int($data);
36 # calculate CRC32 checksum from file
37 $checksum_raw = crc32_file('filename.dat');
38 $checksum_hex = crc32_file_hex('filename.dat');
39 $checksum_int = crc32_file_int('filename.dat');
40 # calculate CRC32 checksum from filehandle
41 $checksum_raw = crc32_file(*FILEHANDLE);
42 $checksum_hex = crc32_file_hex(*FILEHANDLE);
43 $checksum_int = crc32_file_int(*FILEHANDLE);
44
45 ### OO interface:
4546 use Crypt::Checksum::CRC32;
4647
4748 $d = Crypt::Checksum::CRC32->new;
4849 $d->add('any data');
50 $d->add('another data');
4951 $d->addfile('filename.dat');
5052 $d->addfile(*FILEHANDLE);
51 $checksum_raw = $d->digest; # raw bytes
53 $checksum_raw = $d->digest; # raw 4 bytes
5254 $checksum_hex = $d->hexdigest; # hexadecimal form
55 $checksum_int = $d->intdigest; # 32bit unsigned integer
5356
5457 =head1 DESCRIPTION
5558
56 Calculating CRC32 checksums (OO interface);
59 Calculating CRC32 checksums.
5760
58 I<Since: CryptX-0.032>
61 I<Updated: v0.057>
62
63 =head1 EXPORT
64
65 Nothing is exported by default.
66
67 You can export selected functions:
68
69 use Crypt::Checksum::CRC32 qw(crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int);
70
71 Or all of them at once:
72
73 use Crypt::Checksum::CRC32 ':all';
74
75 =head1 FUNCTIONS
76
77 =head2 crc32_data
78
79 Returns checksum as raw octects.
80
81 $checksum_raw = crc32_data('data string');
82 #or
83 $checksum_raw = crc32_data('any data', 'more data', 'even more data');
84
85 =head2 crc32_data_hex
86
87 Returns checksum as a hexadecimal string.
88
89 $checksum_hex = crc32_data_hex('data string');
90 #or
91 $checksum_hex = crc32_data_hex('any data', 'more data', 'even more data');
92
93 =head2 crc32_data_int
94
95 Returns checksum as unsigned 32bit integer.
96
97 $checksum_int = crc32_data_int('data string');
98 #or
99 $checksum_int = crc32_data_int('any data', 'more data', 'even more data');
100
101 =head2 crc32_file
102
103 Returns checksum as raw octects.
104
105 $checksum_raw = crc32_file('filename.dat');
106 #or
107 $checksum_raw = crc32_file(*FILEHANDLE);
108
109 =head2 crc32_file_hex
110
111 Returns checksum as a hexadecimal string.
112
113 $checksum_hex = crc32_file_hex('filename.dat');
114 #or
115 $checksum_hex = crc32_file_hex(*FILEHANDLE);
116
117 =head2 crc32_file_int
118
119 Returns checksum as unsigned 32bit integer.
120
121 $checksum_int = crc32_file_int('filename.dat');
122 #or
123 $checksum_int = crc32_file_int(*FILEHANDLE);
59124
60125 =head1 METHODS
61126
109174
110175 $result_hex = $d->hexdigest();
111176
177 =head2 intdigest
178
179 Returns the checksum encoded as unsigned 32bit integer.
180
181 $result_int = $d->intdigest();
182
112183 =head1 SEE ALSO
113184
114185 =over
115186
116 =item * L<CryptX|CryptX>, L<Crypt::Checksum>
187 =item * L<CryptX|CryptX>
117188
118189 =item * L<https://en.wikipedia.org/wiki/Cyclic_redundancy_check>
119190
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
7 our %EXPORT_TAGS = ( all => [qw/
8 adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int
9 crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int
10 /] );
7 our %EXPORT_TAGS = ( all => [qw/ adler32_data adler32_data_hex adler32_data_int adler32_file adler32_file_hex adler32_file_int
8 crc32_data crc32_data_hex crc32_data_int crc32_file crc32_file_hex crc32_file_int /] );
119 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1210 our @EXPORT = qw();
1311
1412 use Carp;
1513 $Carp::Internal{(__PACKAGE__)}++;
16 use CryptX;
14
15 # obsolete since v0.057, only for backwards compatibility
16 use Crypt::Checksum::CRC32;
1717 use Crypt::Checksum::Adler32;
18 use Crypt::Checksum::CRC32;
18 sub adler32_data { goto \&Crypt::Checksum::Adler32::adler32_data }
19 sub adler32_data_hex { goto \&Crypt::Checksum::Adler32::adler32_data_hex }
20 sub adler32_data_int { goto \&Crypt::Checksum::Adler32::adler32_data_int }
21 sub adler32_file { goto \&Crypt::Checksum::Adler32::adler32_file }
22 sub adler32_file_hex { goto \&Crypt::Checksum::Adler32::adler32_file_hex }
23 sub adler32_file_int { goto \&Crypt::Checksum::Adler32::adler32_file_int }
24 sub crc32_data { goto \&Crypt::Checksum::CRC32::crc32_data }
25 sub crc32_data_hex { goto \&Crypt::Checksum::CRC32::crc32_data_hex }
26 sub crc32_data_int { goto \&Crypt::Checksum::CRC32::crc32_data_int }
27 sub crc32_file { goto \&Crypt::Checksum::CRC32::crc32_file }
28 sub crc32_file_hex { goto \&Crypt::Checksum::CRC32::crc32_file_hex }
29 sub crc32_file_int { goto \&Crypt::Checksum::CRC32::crc32_file_int }
1930
20 sub adler32_data { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->add(@_)->digest }
21 sub adler32_data_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->add(@_)->hexdigest }
22 sub adler32_data_int { local $SIG{__DIE__} = \&CryptX::_croak; unpack("N", Crypt::Checksum::Adler32->new->add(@_)->digest) }
23 sub adler32_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->addfile(@_)->digest }
24 sub adler32_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::Adler32->new->addfile(@_)->hexdigest }
25 sub adler32_file_int { local $SIG{__DIE__} = \&CryptX::_croak; unpack("N", Crypt::Checksum::Adler32->new->addfile(@_)->digest) }
26 sub crc32_data { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->add(@_)->digest }
27 sub crc32_data_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->add(@_)->hexdigest }
28 sub crc32_data_int { local $SIG{__DIE__} = \&CryptX::_croak; unpack("N", Crypt::Checksum::CRC32->new->add(@_)->digest) }
29 sub crc32_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->digest }
30 sub crc32_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Checksum::CRC32->new->addfile(@_)->hexdigest }
31 sub crc32_file_int { local $SIG{__DIE__} = \&CryptX::_croak; unpack("N", Crypt::Checksum::CRC32->new->addfile(@_)->digest) }
31 sub addfile {
32 my ($self, $file) = @_;
33
34 my $handle;
35 if (ref(\$file) eq 'SCALAR') { #filename
36 open($handle, "<", $file) || croak "FATAL: cannot open '$file': $!";
37 binmode($handle);
38 }
39 else { #handle
40 $handle = $file
41 }
42 croak "FATAL: invalid handle" unless defined $handle;
43
44 my $n;
45 my $buf = "";
46 while (($n = read($handle, $buf, 32*1024))) {
47 $self->add($buf)
48 }
49 croak "FATAL: read failed: $!" unless defined $n;
50
51 return $self;
52 }
53
54 sub CLONE_SKIP { 1 } # prevent cloning
3255
3356 1;
3457
3659
3760 =head1 NAME
3861
39 Crypt::Checksum - functional interface to CRC32 and Adler32 checksums
40
41 =head1 SYNOPSIS
42
43 use Crypt::Checksum ':all';
44
45 # calculate Adler32 checksum from string/buffer
46 $checksum_raw = adler32_data($data);
47 $checksum_hex = adler32_data_hex($data);
48
49 # calculate Adler32 checksum from file
50 $checksum_raw = adler32_file('filename.dat');
51 $checksum_hex = adler32_file_hex('filename.dat');
52
53 # calculate Adler32 checksum from filehandle
54 $checksum_raw = adler32_file(*FILEHANDLE);
55 $checksum_hex = adler32_file_hex(*FILEHANDLE);
56
57 # calculate CRC32 checksum from string/buffer
58 $checksum_raw = crc32_data($data);
59 $checksum_hex = crc32_data_hex($data);
60
61 # calculate CRC32 checksum from file
62 $checksum_raw = crc32_file('filename.dat');
63 $checksum_hex = crc32_file_hex('filename.dat');
64
65 # calculate CRC32 checksum from filehandle
66 $checksum_raw = crc32_file(*FILEHANDLE);
67 $checksum_hex = crc32_file_hex(*FILEHANDLE);
62 Crypt::Checksum - [internal only]
6863
6964 =head1 DESCRIPTION
7065
71 Calculating CRC32 and Adler32 checksums (functional interface);
72
73 I<Since: CryptX-0.032>
74
75 =head1 EXPORT
76
77 Nothing is exported by default.
78
79 You can export selected functions:
80
81 use Crypt::Checksum qw( adler32_data adler32_data_hex adler32_file adler32_file_hex
82 crc32_data crc32_data_hex crc32_file crc32_file_hex );
83
84 Or all of them at once:
85
86 use Crypt::Checksum ':all';
87
88 =head1 FUNCTIONS
89
90 =head2 adler32_data
91
92 Returns checksum as raw octects.
93
94 $checksum_raw = adler32_data('data string');
95 #or
96 $checksum_raw = adler32_data('any data', 'more data', 'even more data');
97
98 =head2 adler32_data_hex
99
100 Returns checksum as a hexadecimal string.
101
102 $checksum_hex = adler32_data_hex('data string');
103 #or
104 $checksum_hex = adler32_data_hex('any data', 'more data', 'even more data');
105
106 =head2 adler32_data_int
107
108 Returns checksum as unsigned 32bit integer.
109
110 $checksum_hex = adler32_data_int('data string');
111 #or
112 $checksum_hex = adler32_data_int('any data', 'more data', 'even more data');
113
114 =head2 adler32_file
115
116 Returns checksum as raw octects.
117
118 $checksum_raw = adler32_file('filename.dat');
119 #or
120 $checksum_raw = adler32_file(*FILEHANDLE);
121
122 =head2 adler32_file_hex
123
124 Returns checksum as a hexadecimal string.
125
126 $checksum_hex = adler32_file_hex('filename.dat');
127 #or
128 $checksum_hex = adler32_file_hex(*FILEHANDLE);
129
130 =head2 adler32_file_int
131
132 Returns checksum as unsigned 32bit integer.
133
134 $checksum_hex = adler32_file_int('filename.dat');
135 #or
136 $checksum_hex = adler32_file_int(*FILEHANDLE);
137
138 =head2 crc32_data
139
140 Returns checksum as raw octects.
141
142 $checksum_raw = crc32_data('data string');
143 #or
144 $checksum_raw = crc32_data('any data', 'more data', 'even more data');
145
146 =head2 crc32_data_hex
147
148 Returns checksum as a hexadecimal string.
149
150 $checksum_hex = crc32_data_hex('data string');
151 #or
152 $checksum_hex = crc32_data_hex('any data', 'more data', 'even more data');
153
154 =head2 crc32_data_int
155
156 Returns checksum as unsigned 32bit integer.
157
158 $checksum_hex = crc32_data_int('data string');
159 #or
160 $checksum_hex = crc32_data_int('any data', 'more data', 'even more data');
161
162 =head2 crc32_file
163
164 Returns checksum as raw octects.
165
166 $checksum_raw = crc32_file('filename.dat');
167 #or
168 $checksum_raw = crc32_file(*FILEHANDLE);
169
170 =head2 crc32_file_hex
171
172 Returns checksum as a hexadecimal string.
173
174 $checksum_hex = crc32_file_hex('filename.dat');
175 #or
176 $checksum_hex = crc32_file_hex(*FILEHANDLE);
177
178 =head2 crc32_file_int
179
180 Returns checksum as unsigned 32bit integer.
181
182 $checksum_hex = crc32_file_int('filename.dat');
183 #or
184 $checksum_hex = crc32_file_int(*FILEHANDLE);
185
186 =head1 SEE ALSO
187
188 =over
189
190 =item * L<CryptX|CryptX>, L<Crypt::Checksum::Adler32>, L<Crypt::Checksum::CRC32>
191
192 =item * L<https://en.wikipedia.org/wiki/Adler-32>
193
194 =item * L<https://en.wikipedia.org/wiki/Cyclic_redundancy_check>
195
196 =back
66 You are probably looking for L<Crypt::Checksum::CRC32> or L<Crypt::Checksum::Adler32>.
19767
19868 =cut
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('AES') }
11 sub keysize { Crypt::Cipher::keysize('AES') }
12 sub max_keysize { Crypt::Cipher::max_keysize('AES') }
13 sub min_keysize { Crypt::Cipher::min_keysize('AES') }
14 sub default_rounds { Crypt::Cipher::default_rounds('AES') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Anubis') }
11 sub keysize { Crypt::Cipher::keysize('Anubis') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Anubis') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Anubis') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Anubis') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Blowfish') }
11 sub keysize { Crypt::Cipher::keysize('Blowfish') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Blowfish') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Blowfish') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Blowfish') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('CAST5') }
11 sub keysize { Crypt::Cipher::keysize('CAST5') }
12 sub max_keysize { Crypt::Cipher::max_keysize('CAST5') }
13 sub min_keysize { Crypt::Cipher::min_keysize('CAST5') }
14 sub default_rounds { Crypt::Cipher::default_rounds('CAST5') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Camellia') }
11 sub keysize { Crypt::Cipher::keysize('Camellia') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Camellia') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Camellia') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Camellia') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('DES') }
11 sub keysize { Crypt::Cipher::keysize('DES') }
12 sub max_keysize { Crypt::Cipher::max_keysize('DES') }
13 sub min_keysize { Crypt::Cipher::min_keysize('DES') }
14 sub default_rounds { Crypt::Cipher::default_rounds('DES') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('DES_EDE') }
11 sub keysize { Crypt::Cipher::keysize('DES_EDE') }
12 sub max_keysize { Crypt::Cipher::max_keysize('DES_EDE') }
13 sub min_keysize { Crypt::Cipher::min_keysize('DES_EDE') }
14 sub default_rounds { Crypt::Cipher::default_rounds('DES_EDE') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('IDEA') }
11 sub keysize { Crypt::Cipher::keysize('IDEA') }
12 sub max_keysize { Crypt::Cipher::max_keysize('IDEA') }
13 sub min_keysize { Crypt::Cipher::min_keysize('IDEA') }
14 sub default_rounds { Crypt::Cipher::default_rounds('IDEA') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('KASUMI') }
11 sub keysize { Crypt::Cipher::keysize('KASUMI') }
12 sub max_keysize { Crypt::Cipher::max_keysize('KASUMI') }
13 sub min_keysize { Crypt::Cipher::min_keysize('KASUMI') }
14 sub default_rounds { Crypt::Cipher::default_rounds('KASUMI') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Khazad') }
11 sub keysize { Crypt::Cipher::keysize('Khazad') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Khazad') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Khazad') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Khazad') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('MULTI2') }
11 sub keysize { Crypt::Cipher::keysize('MULTI2') }
12 sub max_keysize { Crypt::Cipher::max_keysize('MULTI2') }
13 sub min_keysize { Crypt::Cipher::min_keysize('MULTI2') }
14 sub default_rounds { Crypt::Cipher::default_rounds('MULTI2') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Noekeon') }
11 sub keysize { Crypt::Cipher::keysize('Noekeon') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Noekeon') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Noekeon') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Noekeon') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('RC2') }
11 sub keysize { Crypt::Cipher::keysize('RC2') }
12 sub max_keysize { Crypt::Cipher::max_keysize('RC2') }
13 sub min_keysize { Crypt::Cipher::min_keysize('RC2') }
14 sub default_rounds { Crypt::Cipher::default_rounds('RC2') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('RC5') }
11 sub keysize { Crypt::Cipher::keysize('RC5') }
12 sub max_keysize { Crypt::Cipher::max_keysize('RC5') }
13 sub min_keysize { Crypt::Cipher::min_keysize('RC5') }
14 sub default_rounds { Crypt::Cipher::default_rounds('RC5') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('RC6') }
11 sub keysize { Crypt::Cipher::keysize('RC6') }
12 sub max_keysize { Crypt::Cipher::max_keysize('RC6') }
13 sub min_keysize { Crypt::Cipher::min_keysize('RC6') }
14 sub default_rounds { Crypt::Cipher::default_rounds('RC6') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SAFERP') }
11 sub keysize { Crypt::Cipher::keysize('SAFERP') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SAFERP') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SAFERP') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SAFERP') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SAFER_K128') }
11 sub keysize { Crypt::Cipher::keysize('SAFER_K128') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SAFER_K128') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SAFER_K128') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SAFER_K128') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SAFER_K64') }
11 sub keysize { Crypt::Cipher::keysize('SAFER_K64') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SAFER_K64') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SAFER_K64') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SAFER_K64') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SAFER_SK128') }
11 sub keysize { Crypt::Cipher::keysize('SAFER_SK128') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SAFER_SK128') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SAFER_SK128') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SAFER_SK128') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SAFER_SK64') }
11 sub keysize { Crypt::Cipher::keysize('SAFER_SK64') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SAFER_SK64') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SAFER_SK64') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SAFER_SK64') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('SEED') }
11 sub keysize { Crypt::Cipher::keysize('SEED') }
12 sub max_keysize { Crypt::Cipher::max_keysize('SEED') }
13 sub min_keysize { Crypt::Cipher::min_keysize('SEED') }
14 sub default_rounds { Crypt::Cipher::default_rounds('SEED') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Serpent') }
11 sub keysize { Crypt::Cipher::keysize('Serpent') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Serpent') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Serpent') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Serpent') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Skipjack') }
11 sub keysize { Crypt::Cipher::keysize('Skipjack') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Skipjack') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Skipjack') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Skipjack') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('Twofish') }
11 sub keysize { Crypt::Cipher::keysize('Twofish') }
12 sub max_keysize { Crypt::Cipher::max_keysize('Twofish') }
13 sub min_keysize { Crypt::Cipher::min_keysize('Twofish') }
14 sub default_rounds { Crypt::Cipher::default_rounds('Twofish') }
1615
1716 1;
1817
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
8 use CryptX;
9 use base 'Crypt::Cipher';
8 use base qw(Crypt::Cipher);
109
11 sub blocksize { Crypt::Cipher::blocksize(__PACKAGE__) }
12 sub keysize { Crypt::Cipher::keysize(__PACKAGE__) }
13 sub max_keysize { Crypt::Cipher::max_keysize(__PACKAGE__) }
14 sub min_keysize { Crypt::Cipher::min_keysize(__PACKAGE__) }
15 sub default_rounds { Crypt::Cipher::default_rounds(__PACKAGE__) }
10 sub blocksize { Crypt::Cipher::blocksize('XTEA') }
11 sub keysize { Crypt::Cipher::keysize('XTEA') }
12 sub max_keysize { Crypt::Cipher::max_keysize('XTEA') }
13 sub min_keysize { Crypt::Cipher::min_keysize('XTEA') }
14 sub default_rounds { Crypt::Cipher::default_rounds('XTEA') }
1615
1716 1;
1817
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use Carp;
77 $Carp::Internal{(__PACKAGE__)}++;
88 use CryptX;
99
1010 ### the following methods/functions are implemented in XS:
11 # - _new
11 # - new
1212 # - DESTROY
13 # - _keysize
14 # - _max_keysize
15 # - _min_keysize
16 # - _blocksize
17 # - _default_rounds
13 # - blocksize
14 # - decrypt
15 # - default_rounds
1816 # - encrypt
19 # - decrypt
20 #functions, not methods:
21 # - _block_length_by_name
22 # - _min_key_length_by_name
23 # - _max_key_length_by_name
24 # - _default_rounds_by_name
17 # - max_keysize
18 # - min_keysize
2519
26 sub _trans_cipher_name {
27 my $name = shift || "";
28 my %trans = (
29 DES_EDE => '3des',
30 SAFERP => 'safer+',
31 SAFER_K128 => 'safer-k128',
32 SAFER_K64 => 'safer-k64',
33 SAFER_SK128 => 'safer-sk128',
34 SAFER_SK64 => 'safer-sk64',
35 );
36 $name =~ s/^Crypt::Cipher:://;
37 return $trans{uc($name)} if defined $trans{uc($name)};
38 return lc($name);
39 }
40
41 ### METHODS
42
43 sub new {
44 my $pkg = shift;
45 my $cipher_name = $pkg eq __PACKAGE__ ? _trans_cipher_name(shift) : _trans_cipher_name($pkg);
46 local $SIG{__DIE__} = \&CryptX::_croak;
47 return _new($cipher_name, @_);
48 }
49
50 sub blocksize {
51 my $self = shift;
52 return $self->_blocksize if ref($self);
53 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
54 local $SIG{__DIE__} = \&CryptX::_croak;
55 return _block_length_by_name(_trans_cipher_name($self));
56 }
57
58 sub max_keysize
59 {
60 my $self = shift;
61 return unless defined $self;
62 return $self->_max_keysize if ref($self);
63 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
64 local $SIG{__DIE__} = \&CryptX::_croak;
65 return _max_key_length_by_name(_trans_cipher_name($self));
66 }
67
68 sub min_keysize {
69 my $self = shift;
70 return unless defined $self;
71 return $self->_min_keysize if ref($self);
72 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
73 local $SIG{__DIE__} = \&CryptX::_croak;
74 return _min_key_length_by_name(_trans_cipher_name($self));
75 }
76
77 sub keysize {
78 goto &max_keysize;
79 }
80
81 sub default_rounds {
82 my $self = shift;
83 return unless defined $self;
84 return $self->_default_rounds if ref($self);
85 $self = _trans_cipher_name(shift) if $self eq __PACKAGE__;
86 local $SIG{__DIE__} = \&CryptX::_croak;
87 return _default_rounds_by_name(_trans_cipher_name($self));
88 }
20 sub keysize { goto \&max_keysize; } # for Crypt::CBC compatibility
8921
9022 sub CLONE_SKIP { 1 } # prevent cloning
9123
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2b_160 blake2b_160_hex blake2b_160_b64 blake2b_160_b64u blake2b_160_file blake2b_160_file_hex blake2b_160_file_b64 blake2b_160_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2b_160 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2b_160_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2b_160_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2b_160_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2b_160_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2b_160_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2b_160_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2b_160_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2b_160') }
18 sub blake2b_160 { Crypt::Digest::digest_data('BLAKE2b_160', @_) }
19 sub blake2b_160_hex { Crypt::Digest::digest_data_hex('BLAKE2b_160', @_) }
20 sub blake2b_160_b64 { Crypt::Digest::digest_data_b64('BLAKE2b_160', @_) }
21 sub blake2b_160_b64u { Crypt::Digest::digest_data_b64u('BLAKE2b_160', @_) }
22 sub blake2b_160_file { Crypt::Digest::digest_file('BLAKE2b_160', @_) }
23 sub blake2b_160_file_hex { Crypt::Digest::digest_file_hex('BLAKE2b_160', @_) }
24 sub blake2b_160_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2b_160', @_) }
25 sub blake2b_160_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2b_160', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2b_256 blake2b_256_hex blake2b_256_b64 blake2b_256_b64u blake2b_256_file blake2b_256_file_hex blake2b_256_file_b64 blake2b_256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2b_256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2b_256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2b_256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2b_256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2b_256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2b_256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2b_256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2b_256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2b_256') }
18 sub blake2b_256 { Crypt::Digest::digest_data('BLAKE2b_256', @_) }
19 sub blake2b_256_hex { Crypt::Digest::digest_data_hex('BLAKE2b_256', @_) }
20 sub blake2b_256_b64 { Crypt::Digest::digest_data_b64('BLAKE2b_256', @_) }
21 sub blake2b_256_b64u { Crypt::Digest::digest_data_b64u('BLAKE2b_256', @_) }
22 sub blake2b_256_file { Crypt::Digest::digest_file('BLAKE2b_256', @_) }
23 sub blake2b_256_file_hex { Crypt::Digest::digest_file_hex('BLAKE2b_256', @_) }
24 sub blake2b_256_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2b_256', @_) }
25 sub blake2b_256_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2b_256', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2b_384 blake2b_384_hex blake2b_384_b64 blake2b_384_b64u blake2b_384_file blake2b_384_file_hex blake2b_384_file_b64 blake2b_384_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2b_384 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2b_384_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2b_384_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2b_384_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2b_384_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2b_384_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2b_384_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2b_384_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2b_384') }
18 sub blake2b_384 { Crypt::Digest::digest_data('BLAKE2b_384', @_) }
19 sub blake2b_384_hex { Crypt::Digest::digest_data_hex('BLAKE2b_384', @_) }
20 sub blake2b_384_b64 { Crypt::Digest::digest_data_b64('BLAKE2b_384', @_) }
21 sub blake2b_384_b64u { Crypt::Digest::digest_data_b64u('BLAKE2b_384', @_) }
22 sub blake2b_384_file { Crypt::Digest::digest_file('BLAKE2b_384', @_) }
23 sub blake2b_384_file_hex { Crypt::Digest::digest_file_hex('BLAKE2b_384', @_) }
24 sub blake2b_384_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2b_384', @_) }
25 sub blake2b_384_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2b_384', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2b_512 blake2b_512_hex blake2b_512_b64 blake2b_512_b64u blake2b_512_file blake2b_512_file_hex blake2b_512_file_b64 blake2b_512_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2b_512 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2b_512_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2b_512_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2b_512_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2b_512_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2b_512_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2b_512_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2b_512_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2b_512') }
18 sub blake2b_512 { Crypt::Digest::digest_data('BLAKE2b_512', @_) }
19 sub blake2b_512_hex { Crypt::Digest::digest_data_hex('BLAKE2b_512', @_) }
20 sub blake2b_512_b64 { Crypt::Digest::digest_data_b64('BLAKE2b_512', @_) }
21 sub blake2b_512_b64u { Crypt::Digest::digest_data_b64u('BLAKE2b_512', @_) }
22 sub blake2b_512_file { Crypt::Digest::digest_file('BLAKE2b_512', @_) }
23 sub blake2b_512_file_hex { Crypt::Digest::digest_file_hex('BLAKE2b_512', @_) }
24 sub blake2b_512_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2b_512', @_) }
25 sub blake2b_512_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2b_512', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2s_128 blake2s_128_hex blake2s_128_b64 blake2s_128_b64u blake2s_128_file blake2s_128_file_hex blake2s_128_file_b64 blake2s_128_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2s_128 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2s_128_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2s_128_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2s_128_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2s_128_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2s_128_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2s_128_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2s_128_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2s_128') }
18 sub blake2s_128 { Crypt::Digest::digest_data('BLAKE2s_128', @_) }
19 sub blake2s_128_hex { Crypt::Digest::digest_data_hex('BLAKE2s_128', @_) }
20 sub blake2s_128_b64 { Crypt::Digest::digest_data_b64('BLAKE2s_128', @_) }
21 sub blake2s_128_b64u { Crypt::Digest::digest_data_b64u('BLAKE2s_128', @_) }
22 sub blake2s_128_file { Crypt::Digest::digest_file('BLAKE2s_128', @_) }
23 sub blake2s_128_file_hex { Crypt::Digest::digest_file_hex('BLAKE2s_128', @_) }
24 sub blake2s_128_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2s_128', @_) }
25 sub blake2s_128_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2s_128', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2s_160 blake2s_160_hex blake2s_160_b64 blake2s_160_b64u blake2s_160_file blake2s_160_file_hex blake2s_160_file_b64 blake2s_160_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2s_160 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2s_160_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2s_160_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2s_160_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2s_160_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2s_160_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2s_160_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2s_160_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2s_160') }
18 sub blake2s_160 { Crypt::Digest::digest_data('BLAKE2s_160', @_) }
19 sub blake2s_160_hex { Crypt::Digest::digest_data_hex('BLAKE2s_160', @_) }
20 sub blake2s_160_b64 { Crypt::Digest::digest_data_b64('BLAKE2s_160', @_) }
21 sub blake2s_160_b64u { Crypt::Digest::digest_data_b64u('BLAKE2s_160', @_) }
22 sub blake2s_160_file { Crypt::Digest::digest_file('BLAKE2s_160', @_) }
23 sub blake2s_160_file_hex { Crypt::Digest::digest_file_hex('BLAKE2s_160', @_) }
24 sub blake2s_160_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2s_160', @_) }
25 sub blake2s_160_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2s_160', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2s_224 blake2s_224_hex blake2s_224_b64 blake2s_224_b64u blake2s_224_file blake2s_224_file_hex blake2s_224_file_b64 blake2s_224_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2s_224 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2s_224_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2s_224_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2s_224_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2s_224_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2s_224_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2s_224_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2s_224_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2s_224') }
18 sub blake2s_224 { Crypt::Digest::digest_data('BLAKE2s_224', @_) }
19 sub blake2s_224_hex { Crypt::Digest::digest_data_hex('BLAKE2s_224', @_) }
20 sub blake2s_224_b64 { Crypt::Digest::digest_data_b64('BLAKE2s_224', @_) }
21 sub blake2s_224_b64u { Crypt::Digest::digest_data_b64u('BLAKE2s_224', @_) }
22 sub blake2s_224_file { Crypt::Digest::digest_file('BLAKE2s_224', @_) }
23 sub blake2s_224_file_hex { Crypt::Digest::digest_file_hex('BLAKE2s_224', @_) }
24 sub blake2s_224_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2s_224', @_) }
25 sub blake2s_224_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2s_224', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2s_256 blake2s_256_hex blake2s_256_b64 blake2s_256_b64u blake2s_256_file blake2s_256_file_hex blake2s_256_file_b64 blake2s_256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub blake2s_256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub blake2s_256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub blake2s_256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub blake2s_256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub blake2s_256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub blake2s_256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub blake2s_256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub blake2s_256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('BLAKE2s_256') }
18 sub blake2s_256 { Crypt::Digest::digest_data('BLAKE2s_256', @_) }
19 sub blake2s_256_hex { Crypt::Digest::digest_data_hex('BLAKE2s_256', @_) }
20 sub blake2s_256_b64 { Crypt::Digest::digest_data_b64('BLAKE2s_256', @_) }
21 sub blake2s_256_b64u { Crypt::Digest::digest_data_b64u('BLAKE2s_256', @_) }
22 sub blake2s_256_file { Crypt::Digest::digest_file('BLAKE2s_256', @_) }
23 sub blake2s_256_file_hex { Crypt::Digest::digest_file_hex('BLAKE2s_256', @_) }
24 sub blake2s_256_file_b64 { Crypt::Digest::digest_file_b64('BLAKE2s_256', @_) }
25 sub blake2s_256_file_b64u { Crypt::Digest::digest_file_b64u('BLAKE2s_256', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( chaes chaes_hex chaes_b64 chaes_b64u chaes_file chaes_file_hex chaes_file_b64 chaes_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub chaes { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub chaes_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub chaes_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub chaes_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub chaes_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub chaes_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub chaes_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub chaes_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('CHAES') }
18 sub chaes { Crypt::Digest::digest_data('CHAES', @_) }
19 sub chaes_hex { Crypt::Digest::digest_data_hex('CHAES', @_) }
20 sub chaes_b64 { Crypt::Digest::digest_data_b64('CHAES', @_) }
21 sub chaes_b64u { Crypt::Digest::digest_data_b64u('CHAES', @_) }
22 sub chaes_file { Crypt::Digest::digest_file('CHAES', @_) }
23 sub chaes_file_hex { Crypt::Digest::digest_file_hex('CHAES', @_) }
24 sub chaes_file_b64 { Crypt::Digest::digest_file_b64('CHAES', @_) }
25 sub chaes_file_b64u { Crypt::Digest::digest_file_b64u('CHAES', @_) }
2826
2927 1;
3028
0 package Crypt::Digest::Keccak224;
1
2 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
3
4 use strict;
5 use warnings;
6 our $VERSION = '0.059';
7
8 use base qw(Crypt::Digest Exporter);
9 our %EXPORT_TAGS = ( all => [qw( keccak224 keccak224_hex keccak224_b64 keccak224_b64u keccak224_file keccak224_file_hex keccak224_file_b64 keccak224_file_b64u )] );
10 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
11 our @EXPORT = qw();
12
13 use Carp;
14 $Carp::Internal{(__PACKAGE__)}++;
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Keccak224') }
18 sub keccak224 { Crypt::Digest::digest_data('Keccak224', @_) }
19 sub keccak224_hex { Crypt::Digest::digest_data_hex('Keccak224', @_) }
20 sub keccak224_b64 { Crypt::Digest::digest_data_b64('Keccak224', @_) }
21 sub keccak224_b64u { Crypt::Digest::digest_data_b64u('Keccak224', @_) }
22 sub keccak224_file { Crypt::Digest::digest_file('Keccak224', @_) }
23 sub keccak224_file_hex { Crypt::Digest::digest_file_hex('Keccak224', @_) }
24 sub keccak224_file_b64 { Crypt::Digest::digest_file_b64('Keccak224', @_) }
25 sub keccak224_file_b64u { Crypt::Digest::digest_file_b64u('Keccak224', @_) }
26
27 1;
28
29 =pod
30
31 =head1 NAME
32
33 Crypt::Digest::Keccak224 - Hash function Keccak-224 [size: 224 bits]
34
35 =head1 SYNOPSIS
36
37 ### Functional interface:
38 use Crypt::Digest::Keccak224 qw( keccak224 keccak224_hex keccak224_b64 keccak224_b64u
39 keccak224_file keccak224_file_hex keccak224_file_b64 keccak224_file_b64u );
40
41 # calculate digest from string/buffer
42 $keccak224_raw = keccak224('data string');
43 $keccak224_hex = keccak224_hex('data string');
44 $keccak224_b64 = keccak224_b64('data string');
45 $keccak224_b64u = keccak224_b64u('data string');
46 # calculate digest from file
47 $keccak224_raw = keccak224_file('filename.dat');
48 $keccak224_hex = keccak224_file_hex('filename.dat');
49 $keccak224_b64 = keccak224_file_b64('filename.dat');
50 $keccak224_b64u = keccak224_file_b64u('filename.dat');
51 # calculate digest from filehandle
52 $keccak224_raw = keccak224_file(*FILEHANDLE);
53 $keccak224_hex = keccak224_file_hex(*FILEHANDLE);
54 $keccak224_b64 = keccak224_file_b64(*FILEHANDLE);
55 $keccak224_b64u = keccak224_file_b64u(*FILEHANDLE);
56
57 ### OO interface:
58 use Crypt::Digest::Keccak224;
59
60 $d = Crypt::Digest::Keccak224->new;
61 $d->add('any data');
62 $d->addfile('filename.dat');
63 $d->addfile(*FILEHANDLE);
64 $result_raw = $d->digest; # raw bytes
65 $result_hex = $d->hexdigest; # hexadecimal form
66 $result_b64 = $d->b64digest; # Base64 form
67 $result_b64u = $d->b64udigest; # Base64 URL Safe form
68
69 =head1 DESCRIPTION
70
71 Provides an interface to the Keccak224 digest algorithm.
72
73 =head1 EXPORT
74
75 Nothing is exported by default.
76
77 You can export selected functions:
78
79 use Crypt::Digest::Keccak224 qw(keccak224 keccak224_hex keccak224_b64 keccak224_b64u
80 keccak224_file keccak224_file_hex keccak224_file_b64 keccak224_file_b64u);
81
82 Or all of them at once:
83
84 use Crypt::Digest::Keccak224 ':all';
85
86 =head1 FUNCTIONS
87
88 =head2 keccak224
89
90 Logically joins all arguments into a single string, and returns its Keccak224 digest encoded as a binary string.
91
92 $keccak224_raw = keccak224('data string');
93 #or
94 $keccak224_raw = keccak224('any data', 'more data', 'even more data');
95
96 =head2 keccak224_hex
97
98 Logically joins all arguments into a single string, and returns its Keccak224 digest encoded as a hexadecimal string.
99
100 $keccak224_hex = keccak224_hex('data string');
101 #or
102 $keccak224_hex = keccak224_hex('any data', 'more data', 'even more data');
103
104 =head2 keccak224_b64
105
106 Logically joins all arguments into a single string, and returns its Keccak224 digest encoded as a Base64 string, B<with> trailing '=' padding.
107
108 $keccak224_b64 = keccak224_b64('data string');
109 #or
110 $keccak224_b64 = keccak224_b64('any data', 'more data', 'even more data');
111
112 =head2 keccak224_b64u
113
114 Logically joins all arguments into a single string, and returns its Keccak224 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
115
116 $keccak224_b64url = keccak224_b64u('data string');
117 #or
118 $keccak224_b64url = keccak224_b64u('any data', 'more data', 'even more data');
119
120 =head2 keccak224_file
121
122 Reads file (defined by filename or filehandle) content, and returns its Keccak224 digest encoded as a binary string.
123
124 $keccak224_raw = keccak224_file('filename.dat');
125 #or
126 $keccak224_raw = keccak224_file(*FILEHANDLE);
127
128 =head2 keccak224_file_hex
129
130 Reads file (defined by filename or filehandle) content, and returns its Keccak224 digest encoded as a hexadecimal string.
131
132 $keccak224_hex = keccak224_file_hex('filename.dat');
133 #or
134 $keccak224_hex = keccak224_file_hex(*FILEHANDLE);
135
136 B<BEWARE:> You have to make sure that the filehandle is in binary mode before you pass it as argument to the addfile() method.
137
138 =head2 keccak224_file_b64
139
140 Reads file (defined by filename or filehandle) content, and returns its Keccak224 digest encoded as a Base64 string, B<with> trailing '=' padding.
141
142 $keccak224_b64 = keccak224_file_b64('filename.dat');
143 #or
144 $keccak224_b64 = keccak224_file_b64(*FILEHANDLE);
145
146 =head2 keccak224_file_b64u
147
148 Reads file (defined by filename or filehandle) content, and returns its Keccak224 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
149
150 $keccak224_b64url = keccak224_file_b64u('filename.dat');
151 #or
152 $keccak224_b64url = keccak224_file_b64u(*FILEHANDLE);
153
154 =head1 METHODS
155
156 The OO interface provides the same set of functions as L<Crypt::Digest>.
157
158 =head2 new
159
160 $d = Crypt::Digest::Keccak224->new();
161
162 =head2 clone
163
164 $d->clone();
165
166 =head2 reset
167
168 $d->reset();
169
170 =head2 add
171
172 $d->add('any data');
173 #or
174 $d->add('any data', 'more data', 'even more data');
175
176 =head2 addfile
177
178 $d->addfile('filename.dat');
179 #or
180 $d->addfile(*FILEHANDLE);
181
182 =head2 add_bits
183
184 $d->add_bits($bit_string); # e.g. $d->add_bits("111100001010");
185 #or
186 $d->add_bits($data, $nbits); # e.g. $d->add_bits("\xF0\xA0", 16);
187
188 =head2 hashsize
189
190 $d->hashsize;
191 #or
192 Crypt::Digest::Keccak224->hashsize();
193 #or
194 Crypt::Digest::Keccak224::hashsize();
195
196 =head2 digest
197
198 $result_raw = $d->digest();
199
200 =head2 hexdigest
201
202 $result_hex = $d->hexdigest();
203
204 =head2 b64digest
205
206 $result_b64 = $d->b64digest();
207
208 =head2 b64udigest
209
210 $result_b64url = $d->b64udigest();
211
212 =head1 SEE ALSO
213
214 =over
215
216 =item * L<CryptX|CryptX>, L<Crypt::Digest>
217
218 =item * L<https://keccak.team/index.html>
219
220 =back
221
222 =cut
0 package Crypt::Digest::Keccak256;
1
2 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
3
4 use strict;
5 use warnings;
6 our $VERSION = '0.059';
7
8 use base qw(Crypt::Digest Exporter);
9 our %EXPORT_TAGS = ( all => [qw( keccak256 keccak256_hex keccak256_b64 keccak256_b64u keccak256_file keccak256_file_hex keccak256_file_b64 keccak256_file_b64u )] );
10 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
11 our @EXPORT = qw();
12
13 use Carp;
14 $Carp::Internal{(__PACKAGE__)}++;
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Keccak256') }
18 sub keccak256 { Crypt::Digest::digest_data('Keccak256', @_) }
19 sub keccak256_hex { Crypt::Digest::digest_data_hex('Keccak256', @_) }
20 sub keccak256_b64 { Crypt::Digest::digest_data_b64('Keccak256', @_) }
21 sub keccak256_b64u { Crypt::Digest::digest_data_b64u('Keccak256', @_) }
22 sub keccak256_file { Crypt::Digest::digest_file('Keccak256', @_) }
23 sub keccak256_file_hex { Crypt::Digest::digest_file_hex('Keccak256', @_) }
24 sub keccak256_file_b64 { Crypt::Digest::digest_file_b64('Keccak256', @_) }
25 sub keccak256_file_b64u { Crypt::Digest::digest_file_b64u('Keccak256', @_) }
26
27 1;
28
29 =pod
30
31 =head1 NAME
32
33 Crypt::Digest::Keccak256 - Hash function Keccak-256 [size: 256 bits]
34
35 =head1 SYNOPSIS
36
37 ### Functional interface:
38 use Crypt::Digest::Keccak256 qw( keccak256 keccak256_hex keccak256_b64 keccak256_b64u
39 keccak256_file keccak256_file_hex keccak256_file_b64 keccak256_file_b64u );
40
41 # calculate digest from string/buffer
42 $keccak256_raw = keccak256('data string');
43 $keccak256_hex = keccak256_hex('data string');
44 $keccak256_b64 = keccak256_b64('data string');
45 $keccak256_b64u = keccak256_b64u('data string');
46 # calculate digest from file
47 $keccak256_raw = keccak256_file('filename.dat');
48 $keccak256_hex = keccak256_file_hex('filename.dat');
49 $keccak256_b64 = keccak256_file_b64('filename.dat');
50 $keccak256_b64u = keccak256_file_b64u('filename.dat');
51 # calculate digest from filehandle
52 $keccak256_raw = keccak256_file(*FILEHANDLE);
53 $keccak256_hex = keccak256_file_hex(*FILEHANDLE);
54 $keccak256_b64 = keccak256_file_b64(*FILEHANDLE);
55 $keccak256_b64u = keccak256_file_b64u(*FILEHANDLE);
56
57 ### OO interface:
58 use Crypt::Digest::Keccak256;
59
60 $d = Crypt::Digest::Keccak256->new;
61 $d->add('any data');
62 $d->addfile('filename.dat');
63 $d->addfile(*FILEHANDLE);
64 $result_raw = $d->digest; # raw bytes
65 $result_hex = $d->hexdigest; # hexadecimal form
66 $result_b64 = $d->b64digest; # Base64 form
67 $result_b64u = $d->b64udigest; # Base64 URL Safe form
68
69 =head1 DESCRIPTION
70
71 Provides an interface to the Keccak256 digest algorithm.
72
73 =head1 EXPORT
74
75 Nothing is exported by default.
76
77 You can export selected functions:
78
79 use Crypt::Digest::Keccak256 qw(keccak256 keccak256_hex keccak256_b64 keccak256_b64u
80 keccak256_file keccak256_file_hex keccak256_file_b64 keccak256_file_b64u);
81
82 Or all of them at once:
83
84 use Crypt::Digest::Keccak256 ':all';
85
86 =head1 FUNCTIONS
87
88 =head2 keccak256
89
90 Logically joins all arguments into a single string, and returns its Keccak256 digest encoded as a binary string.
91
92 $keccak256_raw = keccak256('data string');
93 #or
94 $keccak256_raw = keccak256('any data', 'more data', 'even more data');
95
96 =head2 keccak256_hex
97
98 Logically joins all arguments into a single string, and returns its Keccak256 digest encoded as a hexadecimal string.
99
100 $keccak256_hex = keccak256_hex('data string');
101 #or
102 $keccak256_hex = keccak256_hex('any data', 'more data', 'even more data');
103
104 =head2 keccak256_b64
105
106 Logically joins all arguments into a single string, and returns its Keccak256 digest encoded as a Base64 string, B<with> trailing '=' padding.
107
108 $keccak256_b64 = keccak256_b64('data string');
109 #or
110 $keccak256_b64 = keccak256_b64('any data', 'more data', 'even more data');
111
112 =head2 keccak256_b64u
113
114 Logically joins all arguments into a single string, and returns its Keccak256 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
115
116 $keccak256_b64url = keccak256_b64u('data string');
117 #or
118 $keccak256_b64url = keccak256_b64u('any data', 'more data', 'even more data');
119
120 =head2 keccak256_file
121
122 Reads file (defined by filename or filehandle) content, and returns its Keccak256 digest encoded as a binary string.
123
124 $keccak256_raw = keccak256_file('filename.dat');
125 #or
126 $keccak256_raw = keccak256_file(*FILEHANDLE);
127
128 =head2 keccak256_file_hex
129
130 Reads file (defined by filename or filehandle) content, and returns its Keccak256 digest encoded as a hexadecimal string.
131
132 $keccak256_hex = keccak256_file_hex('filename.dat');
133 #or
134 $keccak256_hex = keccak256_file_hex(*FILEHANDLE);
135
136 B<BEWARE:> You have to make sure that the filehandle is in binary mode before you pass it as argument to the addfile() method.
137
138 =head2 keccak256_file_b64
139
140 Reads file (defined by filename or filehandle) content, and returns its Keccak256 digest encoded as a Base64 string, B<with> trailing '=' padding.
141
142 $keccak256_b64 = keccak256_file_b64('filename.dat');
143 #or
144 $keccak256_b64 = keccak256_file_b64(*FILEHANDLE);
145
146 =head2 keccak256_file_b64u
147
148 Reads file (defined by filename or filehandle) content, and returns its Keccak256 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
149
150 $keccak256_b64url = keccak256_file_b64u('filename.dat');
151 #or
152 $keccak256_b64url = keccak256_file_b64u(*FILEHANDLE);
153
154 =head1 METHODS
155
156 The OO interface provides the same set of functions as L<Crypt::Digest>.
157
158 =head2 new
159
160 $d = Crypt::Digest::Keccak256->new();
161
162 =head2 clone
163
164 $d->clone();
165
166 =head2 reset
167
168 $d->reset();
169
170 =head2 add
171
172 $d->add('any data');
173 #or
174 $d->add('any data', 'more data', 'even more data');
175
176 =head2 addfile
177
178 $d->addfile('filename.dat');
179 #or
180 $d->addfile(*FILEHANDLE);
181
182 =head2 add_bits
183
184 $d->add_bits($bit_string); # e.g. $d->add_bits("111100001010");
185 #or
186 $d->add_bits($data, $nbits); # e.g. $d->add_bits("\xF0\xA0", 16);
187
188 =head2 hashsize
189
190 $d->hashsize;
191 #or
192 Crypt::Digest::Keccak256->hashsize();
193 #or
194 Crypt::Digest::Keccak256::hashsize();
195
196 =head2 digest
197
198 $result_raw = $d->digest();
199
200 =head2 hexdigest
201
202 $result_hex = $d->hexdigest();
203
204 =head2 b64digest
205
206 $result_b64 = $d->b64digest();
207
208 =head2 b64udigest
209
210 $result_b64url = $d->b64udigest();
211
212 =head1 SEE ALSO
213
214 =over
215
216 =item * L<CryptX|CryptX>, L<Crypt::Digest>
217
218 =item * L<https://keccak.team/index.html>
219
220 =back
221
222 =cut
0 package Crypt::Digest::Keccak384;
1
2 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
3
4 use strict;
5 use warnings;
6 our $VERSION = '0.059';
7
8 use base qw(Crypt::Digest Exporter);
9 our %EXPORT_TAGS = ( all => [qw( keccak384 keccak384_hex keccak384_b64 keccak384_b64u keccak384_file keccak384_file_hex keccak384_file_b64 keccak384_file_b64u )] );
10 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
11 our @EXPORT = qw();
12
13 use Carp;
14 $Carp::Internal{(__PACKAGE__)}++;
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Keccak384') }
18 sub keccak384 { Crypt::Digest::digest_data('Keccak384', @_) }
19 sub keccak384_hex { Crypt::Digest::digest_data_hex('Keccak384', @_) }
20 sub keccak384_b64 { Crypt::Digest::digest_data_b64('Keccak384', @_) }
21 sub keccak384_b64u { Crypt::Digest::digest_data_b64u('Keccak384', @_) }
22 sub keccak384_file { Crypt::Digest::digest_file('Keccak384', @_) }
23 sub keccak384_file_hex { Crypt::Digest::digest_file_hex('Keccak384', @_) }
24 sub keccak384_file_b64 { Crypt::Digest::digest_file_b64('Keccak384', @_) }
25 sub keccak384_file_b64u { Crypt::Digest::digest_file_b64u('Keccak384', @_) }
26
27 1;
28
29 =pod
30
31 =head1 NAME
32
33 Crypt::Digest::Keccak384 - Hash function Keccak-384 [size: 384 bits]
34
35 =head1 SYNOPSIS
36
37 ### Functional interface:
38 use Crypt::Digest::Keccak384 qw( keccak384 keccak384_hex keccak384_b64 keccak384_b64u
39 keccak384_file keccak384_file_hex keccak384_file_b64 keccak384_file_b64u );
40
41 # calculate digest from string/buffer
42 $keccak384_raw = keccak384('data string');
43 $keccak384_hex = keccak384_hex('data string');
44 $keccak384_b64 = keccak384_b64('data string');
45 $keccak384_b64u = keccak384_b64u('data string');
46 # calculate digest from file
47 $keccak384_raw = keccak384_file('filename.dat');
48 $keccak384_hex = keccak384_file_hex('filename.dat');
49 $keccak384_b64 = keccak384_file_b64('filename.dat');
50 $keccak384_b64u = keccak384_file_b64u('filename.dat');
51 # calculate digest from filehandle
52 $keccak384_raw = keccak384_file(*FILEHANDLE);
53 $keccak384_hex = keccak384_file_hex(*FILEHANDLE);
54 $keccak384_b64 = keccak384_file_b64(*FILEHANDLE);
55 $keccak384_b64u = keccak384_file_b64u(*FILEHANDLE);
56
57 ### OO interface:
58 use Crypt::Digest::Keccak384;
59
60 $d = Crypt::Digest::Keccak384->new;
61 $d->add('any data');
62 $d->addfile('filename.dat');
63 $d->addfile(*FILEHANDLE);
64 $result_raw = $d->digest; # raw bytes
65 $result_hex = $d->hexdigest; # hexadecimal form
66 $result_b64 = $d->b64digest; # Base64 form
67 $result_b64u = $d->b64udigest; # Base64 URL Safe form
68
69 =head1 DESCRIPTION
70
71 Provides an interface to the Keccak384 digest algorithm.
72
73 =head1 EXPORT
74
75 Nothing is exported by default.
76
77 You can export selected functions:
78
79 use Crypt::Digest::Keccak384 qw(keccak384 keccak384_hex keccak384_b64 keccak384_b64u
80 keccak384_file keccak384_file_hex keccak384_file_b64 keccak384_file_b64u);
81
82 Or all of them at once:
83
84 use Crypt::Digest::Keccak384 ':all';
85
86 =head1 FUNCTIONS
87
88 =head2 keccak384
89
90 Logically joins all arguments into a single string, and returns its Keccak384 digest encoded as a binary string.
91
92 $keccak384_raw = keccak384('data string');
93 #or
94 $keccak384_raw = keccak384('any data', 'more data', 'even more data');
95
96 =head2 keccak384_hex
97
98 Logically joins all arguments into a single string, and returns its Keccak384 digest encoded as a hexadecimal string.
99
100 $keccak384_hex = keccak384_hex('data string');
101 #or
102 $keccak384_hex = keccak384_hex('any data', 'more data', 'even more data');
103
104 =head2 keccak384_b64
105
106 Logically joins all arguments into a single string, and returns its Keccak384 digest encoded as a Base64 string, B<with> trailing '=' padding.
107
108 $keccak384_b64 = keccak384_b64('data string');
109 #or
110 $keccak384_b64 = keccak384_b64('any data', 'more data', 'even more data');
111
112 =head2 keccak384_b64u
113
114 Logically joins all arguments into a single string, and returns its Keccak384 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
115
116 $keccak384_b64url = keccak384_b64u('data string');
117 #or
118 $keccak384_b64url = keccak384_b64u('any data', 'more data', 'even more data');
119
120 =head2 keccak384_file
121
122 Reads file (defined by filename or filehandle) content, and returns its Keccak384 digest encoded as a binary string.
123
124 $keccak384_raw = keccak384_file('filename.dat');
125 #or
126 $keccak384_raw = keccak384_file(*FILEHANDLE);
127
128 =head2 keccak384_file_hex
129
130 Reads file (defined by filename or filehandle) content, and returns its Keccak384 digest encoded as a hexadecimal string.
131
132 $keccak384_hex = keccak384_file_hex('filename.dat');
133 #or
134 $keccak384_hex = keccak384_file_hex(*FILEHANDLE);
135
136 B<BEWARE:> You have to make sure that the filehandle is in binary mode before you pass it as argument to the addfile() method.
137
138 =head2 keccak384_file_b64
139
140 Reads file (defined by filename or filehandle) content, and returns its Keccak384 digest encoded as a Base64 string, B<with> trailing '=' padding.
141
142 $keccak384_b64 = keccak384_file_b64('filename.dat');
143 #or
144 $keccak384_b64 = keccak384_file_b64(*FILEHANDLE);
145
146 =head2 keccak384_file_b64u
147
148 Reads file (defined by filename or filehandle) content, and returns its Keccak384 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
149
150 $keccak384_b64url = keccak384_file_b64u('filename.dat');
151 #or
152 $keccak384_b64url = keccak384_file_b64u(*FILEHANDLE);
153
154 =head1 METHODS
155
156 The OO interface provides the same set of functions as L<Crypt::Digest>.
157
158 =head2 new
159
160 $d = Crypt::Digest::Keccak384->new();
161
162 =head2 clone
163
164 $d->clone();
165
166 =head2 reset
167
168 $d->reset();
169
170 =head2 add
171
172 $d->add('any data');
173 #or
174 $d->add('any data', 'more data', 'even more data');
175
176 =head2 addfile
177
178 $d->addfile('filename.dat');
179 #or
180 $d->addfile(*FILEHANDLE);
181
182 =head2 add_bits
183
184 $d->add_bits($bit_string); # e.g. $d->add_bits("111100001010");
185 #or
186 $d->add_bits($data, $nbits); # e.g. $d->add_bits("\xF0\xA0", 16);
187
188 =head2 hashsize
189
190 $d->hashsize;
191 #or
192 Crypt::Digest::Keccak384->hashsize();
193 #or
194 Crypt::Digest::Keccak384::hashsize();
195
196 =head2 digest
197
198 $result_raw = $d->digest();
199
200 =head2 hexdigest
201
202 $result_hex = $d->hexdigest();
203
204 =head2 b64digest
205
206 $result_b64 = $d->b64digest();
207
208 =head2 b64udigest
209
210 $result_b64url = $d->b64udigest();
211
212 =head1 SEE ALSO
213
214 =over
215
216 =item * L<CryptX|CryptX>, L<Crypt::Digest>
217
218 =item * L<https://keccak.team/index.html>
219
220 =back
221
222 =cut
0 package Crypt::Digest::Keccak512;
1
2 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
3
4 use strict;
5 use warnings;
6 our $VERSION = '0.059';
7
8 use base qw(Crypt::Digest Exporter);
9 our %EXPORT_TAGS = ( all => [qw( keccak512 keccak512_hex keccak512_b64 keccak512_b64u keccak512_file keccak512_file_hex keccak512_file_b64 keccak512_file_b64u )] );
10 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
11 our @EXPORT = qw();
12
13 use Carp;
14 $Carp::Internal{(__PACKAGE__)}++;
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Keccak512') }
18 sub keccak512 { Crypt::Digest::digest_data('Keccak512', @_) }
19 sub keccak512_hex { Crypt::Digest::digest_data_hex('Keccak512', @_) }
20 sub keccak512_b64 { Crypt::Digest::digest_data_b64('Keccak512', @_) }
21 sub keccak512_b64u { Crypt::Digest::digest_data_b64u('Keccak512', @_) }
22 sub keccak512_file { Crypt::Digest::digest_file('Keccak512', @_) }
23 sub keccak512_file_hex { Crypt::Digest::digest_file_hex('Keccak512', @_) }
24 sub keccak512_file_b64 { Crypt::Digest::digest_file_b64('Keccak512', @_) }
25 sub keccak512_file_b64u { Crypt::Digest::digest_file_b64u('Keccak512', @_) }
26
27 1;
28
29 =pod
30
31 =head1 NAME
32
33 Crypt::Digest::Keccak512 - Hash function Keccak-512 [size: 512 bits]
34
35 =head1 SYNOPSIS
36
37 ### Functional interface:
38 use Crypt::Digest::Keccak512 qw( keccak512 keccak512_hex keccak512_b64 keccak512_b64u
39 keccak512_file keccak512_file_hex keccak512_file_b64 keccak512_file_b64u );
40
41 # calculate digest from string/buffer
42 $keccak512_raw = keccak512('data string');
43 $keccak512_hex = keccak512_hex('data string');
44 $keccak512_b64 = keccak512_b64('data string');
45 $keccak512_b64u = keccak512_b64u('data string');
46 # calculate digest from file
47 $keccak512_raw = keccak512_file('filename.dat');
48 $keccak512_hex = keccak512_file_hex('filename.dat');
49 $keccak512_b64 = keccak512_file_b64('filename.dat');
50 $keccak512_b64u = keccak512_file_b64u('filename.dat');
51 # calculate digest from filehandle
52 $keccak512_raw = keccak512_file(*FILEHANDLE);
53 $keccak512_hex = keccak512_file_hex(*FILEHANDLE);
54 $keccak512_b64 = keccak512_file_b64(*FILEHANDLE);
55 $keccak512_b64u = keccak512_file_b64u(*FILEHANDLE);
56
57 ### OO interface:
58 use Crypt::Digest::Keccak512;
59
60 $d = Crypt::Digest::Keccak512->new;
61 $d->add('any data');
62 $d->addfile('filename.dat');
63 $d->addfile(*FILEHANDLE);
64 $result_raw = $d->digest; # raw bytes
65 $result_hex = $d->hexdigest; # hexadecimal form
66 $result_b64 = $d->b64digest; # Base64 form
67 $result_b64u = $d->b64udigest; # Base64 URL Safe form
68
69 =head1 DESCRIPTION
70
71 Provides an interface to the Keccak512 digest algorithm.
72
73 =head1 EXPORT
74
75 Nothing is exported by default.
76
77 You can export selected functions:
78
79 use Crypt::Digest::Keccak512 qw(keccak512 keccak512_hex keccak512_b64 keccak512_b64u
80 keccak512_file keccak512_file_hex keccak512_file_b64 keccak512_file_b64u);
81
82 Or all of them at once:
83
84 use Crypt::Digest::Keccak512 ':all';
85
86 =head1 FUNCTIONS
87
88 =head2 keccak512
89
90 Logically joins all arguments into a single string, and returns its Keccak512 digest encoded as a binary string.
91
92 $keccak512_raw = keccak512('data string');
93 #or
94 $keccak512_raw = keccak512('any data', 'more data', 'even more data');
95
96 =head2 keccak512_hex
97
98 Logically joins all arguments into a single string, and returns its Keccak512 digest encoded as a hexadecimal string.
99
100 $keccak512_hex = keccak512_hex('data string');
101 #or
102 $keccak512_hex = keccak512_hex('any data', 'more data', 'even more data');
103
104 =head2 keccak512_b64
105
106 Logically joins all arguments into a single string, and returns its Keccak512 digest encoded as a Base64 string, B<with> trailing '=' padding.
107
108 $keccak512_b64 = keccak512_b64('data string');
109 #or
110 $keccak512_b64 = keccak512_b64('any data', 'more data', 'even more data');
111
112 =head2 keccak512_b64u
113
114 Logically joins all arguments into a single string, and returns its Keccak512 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
115
116 $keccak512_b64url = keccak512_b64u('data string');
117 #or
118 $keccak512_b64url = keccak512_b64u('any data', 'more data', 'even more data');
119
120 =head2 keccak512_file
121
122 Reads file (defined by filename or filehandle) content, and returns its Keccak512 digest encoded as a binary string.
123
124 $keccak512_raw = keccak512_file('filename.dat');
125 #or
126 $keccak512_raw = keccak512_file(*FILEHANDLE);
127
128 =head2 keccak512_file_hex
129
130 Reads file (defined by filename or filehandle) content, and returns its Keccak512 digest encoded as a hexadecimal string.
131
132 $keccak512_hex = keccak512_file_hex('filename.dat');
133 #or
134 $keccak512_hex = keccak512_file_hex(*FILEHANDLE);
135
136 B<BEWARE:> You have to make sure that the filehandle is in binary mode before you pass it as argument to the addfile() method.
137
138 =head2 keccak512_file_b64
139
140 Reads file (defined by filename or filehandle) content, and returns its Keccak512 digest encoded as a Base64 string, B<with> trailing '=' padding.
141
142 $keccak512_b64 = keccak512_file_b64('filename.dat');
143 #or
144 $keccak512_b64 = keccak512_file_b64(*FILEHANDLE);
145
146 =head2 keccak512_file_b64u
147
148 Reads file (defined by filename or filehandle) content, and returns its Keccak512 digest encoded as a Base64 URL Safe string (see RFC 4648 section 5).
149
150 $keccak512_b64url = keccak512_file_b64u('filename.dat');
151 #or
152 $keccak512_b64url = keccak512_file_b64u(*FILEHANDLE);
153
154 =head1 METHODS
155
156 The OO interface provides the same set of functions as L<Crypt::Digest>.
157
158 =head2 new
159
160 $d = Crypt::Digest::Keccak512->new();
161
162 =head2 clone
163
164 $d->clone();
165
166 =head2 reset
167
168 $d->reset();
169
170 =head2 add
171
172 $d->add('any data');
173 #or
174 $d->add('any data', 'more data', 'even more data');
175
176 =head2 addfile
177
178 $d->addfile('filename.dat');
179 #or
180 $d->addfile(*FILEHANDLE);
181
182 =head2 add_bits
183
184 $d->add_bits($bit_string); # e.g. $d->add_bits("111100001010");
185 #or
186 $d->add_bits($data, $nbits); # e.g. $d->add_bits("\xF0\xA0", 16);
187
188 =head2 hashsize
189
190 $d->hashsize;
191 #or
192 Crypt::Digest::Keccak512->hashsize();
193 #or
194 Crypt::Digest::Keccak512::hashsize();
195
196 =head2 digest
197
198 $result_raw = $d->digest();
199
200 =head2 hexdigest
201
202 $result_hex = $d->hexdigest();
203
204 =head2 b64digest
205
206 $result_b64 = $d->b64digest();
207
208 =head2 b64udigest
209
210 $result_b64url = $d->b64udigest();
211
212 =head1 SEE ALSO
213
214 =over
215
216 =item * L<CryptX|CryptX>, L<Crypt::Digest>
217
218 =item * L<https://keccak.team/index.html>
219
220 =back
221
222 =cut
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( md2 md2_hex md2_b64 md2_b64u md2_file md2_file_hex md2_file_b64 md2_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub md2 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub md2_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub md2_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub md2_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub md2_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub md2_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub md2_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub md2_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('MD2') }
18 sub md2 { Crypt::Digest::digest_data('MD2', @_) }
19 sub md2_hex { Crypt::Digest::digest_data_hex('MD2', @_) }
20 sub md2_b64 { Crypt::Digest::digest_data_b64('MD2', @_) }
21 sub md2_b64u { Crypt::Digest::digest_data_b64u('MD2', @_) }
22 sub md2_file { Crypt::Digest::digest_file('MD2', @_) }
23 sub md2_file_hex { Crypt::Digest::digest_file_hex('MD2', @_) }
24 sub md2_file_b64 { Crypt::Digest::digest_file_b64('MD2', @_) }
25 sub md2_file_b64u { Crypt::Digest::digest_file_b64u('MD2', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( md4 md4_hex md4_b64 md4_b64u md4_file md4_file_hex md4_file_b64 md4_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub md4 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub md4_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub md4_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub md4_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub md4_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub md4_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub md4_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub md4_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('MD4') }
18 sub md4 { Crypt::Digest::digest_data('MD4', @_) }
19 sub md4_hex { Crypt::Digest::digest_data_hex('MD4', @_) }
20 sub md4_b64 { Crypt::Digest::digest_data_b64('MD4', @_) }
21 sub md4_b64u { Crypt::Digest::digest_data_b64u('MD4', @_) }
22 sub md4_file { Crypt::Digest::digest_file('MD4', @_) }
23 sub md4_file_hex { Crypt::Digest::digest_file_hex('MD4', @_) }
24 sub md4_file_b64 { Crypt::Digest::digest_file_b64('MD4', @_) }
25 sub md4_file_b64u { Crypt::Digest::digest_file_b64u('MD4', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( md5 md5_hex md5_b64 md5_b64u md5_file md5_file_hex md5_file_b64 md5_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub md5 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub md5_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub md5_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub md5_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub md5_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub md5_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub md5_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub md5_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('MD5') }
18 sub md5 { Crypt::Digest::digest_data('MD5', @_) }
19 sub md5_hex { Crypt::Digest::digest_data_hex('MD5', @_) }
20 sub md5_b64 { Crypt::Digest::digest_data_b64('MD5', @_) }
21 sub md5_b64u { Crypt::Digest::digest_data_b64u('MD5', @_) }
22 sub md5_file { Crypt::Digest::digest_file('MD5', @_) }
23 sub md5_file_hex { Crypt::Digest::digest_file_hex('MD5', @_) }
24 sub md5_file_b64 { Crypt::Digest::digest_file_b64('MD5', @_) }
25 sub md5_file_b64u { Crypt::Digest::digest_file_b64u('MD5', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( ripemd128 ripemd128_hex ripemd128_b64 ripemd128_b64u ripemd128_file ripemd128_file_hex ripemd128_file_b64 ripemd128_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub ripemd128 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub ripemd128_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub ripemd128_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub ripemd128_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub ripemd128_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub ripemd128_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub ripemd128_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub ripemd128_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('RIPEMD128') }
18 sub ripemd128 { Crypt::Digest::digest_data('RIPEMD128', @_) }
19 sub ripemd128_hex { Crypt::Digest::digest_data_hex('RIPEMD128', @_) }
20 sub ripemd128_b64 { Crypt::Digest::digest_data_b64('RIPEMD128', @_) }
21 sub ripemd128_b64u { Crypt::Digest::digest_data_b64u('RIPEMD128', @_) }
22 sub ripemd128_file { Crypt::Digest::digest_file('RIPEMD128', @_) }
23 sub ripemd128_file_hex { Crypt::Digest::digest_file_hex('RIPEMD128', @_) }
24 sub ripemd128_file_b64 { Crypt::Digest::digest_file_b64('RIPEMD128', @_) }
25 sub ripemd128_file_b64u { Crypt::Digest::digest_file_b64u('RIPEMD128', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( ripemd160 ripemd160_hex ripemd160_b64 ripemd160_b64u ripemd160_file ripemd160_file_hex ripemd160_file_b64 ripemd160_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub ripemd160 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub ripemd160_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub ripemd160_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub ripemd160_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub ripemd160_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub ripemd160_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub ripemd160_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub ripemd160_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('RIPEMD160') }
18 sub ripemd160 { Crypt::Digest::digest_data('RIPEMD160', @_) }
19 sub ripemd160_hex { Crypt::Digest::digest_data_hex('RIPEMD160', @_) }
20 sub ripemd160_b64 { Crypt::Digest::digest_data_b64('RIPEMD160', @_) }
21 sub ripemd160_b64u { Crypt::Digest::digest_data_b64u('RIPEMD160', @_) }
22 sub ripemd160_file { Crypt::Digest::digest_file('RIPEMD160', @_) }
23 sub ripemd160_file_hex { Crypt::Digest::digest_file_hex('RIPEMD160', @_) }
24 sub ripemd160_file_b64 { Crypt::Digest::digest_file_b64('RIPEMD160', @_) }
25 sub ripemd160_file_b64u { Crypt::Digest::digest_file_b64u('RIPEMD160', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( ripemd256 ripemd256_hex ripemd256_b64 ripemd256_b64u ripemd256_file ripemd256_file_hex ripemd256_file_b64 ripemd256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub ripemd256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub ripemd256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub ripemd256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub ripemd256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub ripemd256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub ripemd256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub ripemd256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub ripemd256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('RIPEMD256') }
18 sub ripemd256 { Crypt::Digest::digest_data('RIPEMD256', @_) }
19 sub ripemd256_hex { Crypt::Digest::digest_data_hex('RIPEMD256', @_) }
20 sub ripemd256_b64 { Crypt::Digest::digest_data_b64('RIPEMD256', @_) }
21 sub ripemd256_b64u { Crypt::Digest::digest_data_b64u('RIPEMD256', @_) }
22 sub ripemd256_file { Crypt::Digest::digest_file('RIPEMD256', @_) }
23 sub ripemd256_file_hex { Crypt::Digest::digest_file_hex('RIPEMD256', @_) }
24 sub ripemd256_file_b64 { Crypt::Digest::digest_file_b64('RIPEMD256', @_) }
25 sub ripemd256_file_b64u { Crypt::Digest::digest_file_b64u('RIPEMD256', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( ripemd320 ripemd320_hex ripemd320_b64 ripemd320_b64u ripemd320_file ripemd320_file_hex ripemd320_file_b64 ripemd320_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub ripemd320 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub ripemd320_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub ripemd320_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub ripemd320_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub ripemd320_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub ripemd320_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub ripemd320_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub ripemd320_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('RIPEMD320') }
18 sub ripemd320 { Crypt::Digest::digest_data('RIPEMD320', @_) }
19 sub ripemd320_hex { Crypt::Digest::digest_data_hex('RIPEMD320', @_) }
20 sub ripemd320_b64 { Crypt::Digest::digest_data_b64('RIPEMD320', @_) }
21 sub ripemd320_b64u { Crypt::Digest::digest_data_b64u('RIPEMD320', @_) }
22 sub ripemd320_file { Crypt::Digest::digest_file('RIPEMD320', @_) }
23 sub ripemd320_file_hex { Crypt::Digest::digest_file_hex('RIPEMD320', @_) }
24 sub ripemd320_file_b64 { Crypt::Digest::digest_file_b64('RIPEMD320', @_) }
25 sub ripemd320_file_b64u { Crypt::Digest::digest_file_b64u('RIPEMD320', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha1 sha1_hex sha1_b64 sha1_b64u sha1_file sha1_file_hex sha1_file_b64 sha1_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha1 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha1_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha1_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha1_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha1_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha1_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha1_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha1_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA1') }
18 sub sha1 { Crypt::Digest::digest_data('SHA1', @_) }
19 sub sha1_hex { Crypt::Digest::digest_data_hex('SHA1', @_) }
20 sub sha1_b64 { Crypt::Digest::digest_data_b64('SHA1', @_) }
21 sub sha1_b64u { Crypt::Digest::digest_data_b64u('SHA1', @_) }
22 sub sha1_file { Crypt::Digest::digest_file('SHA1', @_) }
23 sub sha1_file_hex { Crypt::Digest::digest_file_hex('SHA1', @_) }
24 sub sha1_file_b64 { Crypt::Digest::digest_file_b64('SHA1', @_) }
25 sub sha1_file_b64u { Crypt::Digest::digest_file_b64u('SHA1', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha224 sha224_hex sha224_b64 sha224_b64u sha224_file sha224_file_hex sha224_file_b64 sha224_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha224 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha224_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha224_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha224_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha224_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha224_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha224_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha224_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA224') }
18 sub sha224 { Crypt::Digest::digest_data('SHA224', @_) }
19 sub sha224_hex { Crypt::Digest::digest_data_hex('SHA224', @_) }
20 sub sha224_b64 { Crypt::Digest::digest_data_b64('SHA224', @_) }
21 sub sha224_b64u { Crypt::Digest::digest_data_b64u('SHA224', @_) }
22 sub sha224_file { Crypt::Digest::digest_file('SHA224', @_) }
23 sub sha224_file_hex { Crypt::Digest::digest_file_hex('SHA224', @_) }
24 sub sha224_file_b64 { Crypt::Digest::digest_file_b64('SHA224', @_) }
25 sub sha224_file_b64u { Crypt::Digest::digest_file_b64u('SHA224', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha256 sha256_hex sha256_b64 sha256_b64u sha256_file sha256_file_hex sha256_file_b64 sha256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA256') }
18 sub sha256 { Crypt::Digest::digest_data('SHA256', @_) }
19 sub sha256_hex { Crypt::Digest::digest_data_hex('SHA256', @_) }
20 sub sha256_b64 { Crypt::Digest::digest_data_b64('SHA256', @_) }
21 sub sha256_b64u { Crypt::Digest::digest_data_b64u('SHA256', @_) }
22 sub sha256_file { Crypt::Digest::digest_file('SHA256', @_) }
23 sub sha256_file_hex { Crypt::Digest::digest_file_hex('SHA256', @_) }
24 sub sha256_file_b64 { Crypt::Digest::digest_file_b64('SHA256', @_) }
25 sub sha256_file_b64u { Crypt::Digest::digest_file_b64u('SHA256', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha384 sha384_hex sha384_b64 sha384_b64u sha384_file sha384_file_hex sha384_file_b64 sha384_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha384 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha384_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha384_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha384_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha384_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha384_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha384_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha384_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA384') }
18 sub sha384 { Crypt::Digest::digest_data('SHA384', @_) }
19 sub sha384_hex { Crypt::Digest::digest_data_hex('SHA384', @_) }
20 sub sha384_b64 { Crypt::Digest::digest_data_b64('SHA384', @_) }
21 sub sha384_b64u { Crypt::Digest::digest_data_b64u('SHA384', @_) }
22 sub sha384_file { Crypt::Digest::digest_file('SHA384', @_) }
23 sub sha384_file_hex { Crypt::Digest::digest_file_hex('SHA384', @_) }
24 sub sha384_file_b64 { Crypt::Digest::digest_file_b64('SHA384', @_) }
25 sub sha384_file_b64u { Crypt::Digest::digest_file_b64u('SHA384', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha3_224 sha3_224_hex sha3_224_b64 sha3_224_b64u sha3_224_file sha3_224_file_hex sha3_224_file_b64 sha3_224_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha3_224 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha3_224_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha3_224_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha3_224_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha3_224_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha3_224_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha3_224_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha3_224_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA3_224') }
18 sub sha3_224 { Crypt::Digest::digest_data('SHA3_224', @_) }
19 sub sha3_224_hex { Crypt::Digest::digest_data_hex('SHA3_224', @_) }
20 sub sha3_224_b64 { Crypt::Digest::digest_data_b64('SHA3_224', @_) }
21 sub sha3_224_b64u { Crypt::Digest::digest_data_b64u('SHA3_224', @_) }
22 sub sha3_224_file { Crypt::Digest::digest_file('SHA3_224', @_) }
23 sub sha3_224_file_hex { Crypt::Digest::digest_file_hex('SHA3_224', @_) }
24 sub sha3_224_file_b64 { Crypt::Digest::digest_file_b64('SHA3_224', @_) }
25 sub sha3_224_file_b64u { Crypt::Digest::digest_file_b64u('SHA3_224', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha3_256 sha3_256_hex sha3_256_b64 sha3_256_b64u sha3_256_file sha3_256_file_hex sha3_256_file_b64 sha3_256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha3_256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha3_256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha3_256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha3_256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha3_256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha3_256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha3_256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha3_256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA3_256') }
18 sub sha3_256 { Crypt::Digest::digest_data('SHA3_256', @_) }
19 sub sha3_256_hex { Crypt::Digest::digest_data_hex('SHA3_256', @_) }
20 sub sha3_256_b64 { Crypt::Digest::digest_data_b64('SHA3_256', @_) }
21 sub sha3_256_b64u { Crypt::Digest::digest_data_b64u('SHA3_256', @_) }
22 sub sha3_256_file { Crypt::Digest::digest_file('SHA3_256', @_) }
23 sub sha3_256_file_hex { Crypt::Digest::digest_file_hex('SHA3_256', @_) }
24 sub sha3_256_file_b64 { Crypt::Digest::digest_file_b64('SHA3_256', @_) }
25 sub sha3_256_file_b64u { Crypt::Digest::digest_file_b64u('SHA3_256', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha3_384 sha3_384_hex sha3_384_b64 sha3_384_b64u sha3_384_file sha3_384_file_hex sha3_384_file_b64 sha3_384_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha3_384 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha3_384_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha3_384_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha3_384_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha3_384_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha3_384_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha3_384_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha3_384_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA3_384') }
18 sub sha3_384 { Crypt::Digest::digest_data('SHA3_384', @_) }
19 sub sha3_384_hex { Crypt::Digest::digest_data_hex('SHA3_384', @_) }
20 sub sha3_384_b64 { Crypt::Digest::digest_data_b64('SHA3_384', @_) }
21 sub sha3_384_b64u { Crypt::Digest::digest_data_b64u('SHA3_384', @_) }
22 sub sha3_384_file { Crypt::Digest::digest_file('SHA3_384', @_) }
23 sub sha3_384_file_hex { Crypt::Digest::digest_file_hex('SHA3_384', @_) }
24 sub sha3_384_file_b64 { Crypt::Digest::digest_file_b64('SHA3_384', @_) }
25 sub sha3_384_file_b64u { Crypt::Digest::digest_file_b64u('SHA3_384', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha3_512 sha3_512_hex sha3_512_b64 sha3_512_b64u sha3_512_file sha3_512_file_hex sha3_512_file_b64 sha3_512_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha3_512 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha3_512_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha3_512_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha3_512_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha3_512_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha3_512_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha3_512_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha3_512_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA3_512') }
18 sub sha3_512 { Crypt::Digest::digest_data('SHA3_512', @_) }
19 sub sha3_512_hex { Crypt::Digest::digest_data_hex('SHA3_512', @_) }
20 sub sha3_512_b64 { Crypt::Digest::digest_data_b64('SHA3_512', @_) }
21 sub sha3_512_b64u { Crypt::Digest::digest_data_b64u('SHA3_512', @_) }
22 sub sha3_512_file { Crypt::Digest::digest_file('SHA3_512', @_) }
23 sub sha3_512_file_hex { Crypt::Digest::digest_file_hex('SHA3_512', @_) }
24 sub sha3_512_file_b64 { Crypt::Digest::digest_file_b64('SHA3_512', @_) }
25 sub sha3_512_file_b64u { Crypt::Digest::digest_file_b64u('SHA3_512', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha512 sha512_hex sha512_b64 sha512_b64u sha512_file sha512_file_hex sha512_file_b64 sha512_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha512 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha512_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha512_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha512_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha512_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha512_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha512_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha512_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA512') }
18 sub sha512 { Crypt::Digest::digest_data('SHA512', @_) }
19 sub sha512_hex { Crypt::Digest::digest_data_hex('SHA512', @_) }
20 sub sha512_b64 { Crypt::Digest::digest_data_b64('SHA512', @_) }
21 sub sha512_b64u { Crypt::Digest::digest_data_b64u('SHA512', @_) }
22 sub sha512_file { Crypt::Digest::digest_file('SHA512', @_) }
23 sub sha512_file_hex { Crypt::Digest::digest_file_hex('SHA512', @_) }
24 sub sha512_file_b64 { Crypt::Digest::digest_file_b64('SHA512', @_) }
25 sub sha512_file_b64u { Crypt::Digest::digest_file_b64u('SHA512', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha512_224 sha512_224_hex sha512_224_b64 sha512_224_b64u sha512_224_file sha512_224_file_hex sha512_224_file_b64 sha512_224_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha512_224 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha512_224_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha512_224_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha512_224_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha512_224_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha512_224_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha512_224_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha512_224_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA512_224') }
18 sub sha512_224 { Crypt::Digest::digest_data('SHA512_224', @_) }
19 sub sha512_224_hex { Crypt::Digest::digest_data_hex('SHA512_224', @_) }
20 sub sha512_224_b64 { Crypt::Digest::digest_data_b64('SHA512_224', @_) }
21 sub sha512_224_b64u { Crypt::Digest::digest_data_b64u('SHA512_224', @_) }
22 sub sha512_224_file { Crypt::Digest::digest_file('SHA512_224', @_) }
23 sub sha512_224_file_hex { Crypt::Digest::digest_file_hex('SHA512_224', @_) }
24 sub sha512_224_file_b64 { Crypt::Digest::digest_file_b64('SHA512_224', @_) }
25 sub sha512_224_file_b64u { Crypt::Digest::digest_file_b64u('SHA512_224', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( sha512_256 sha512_256_hex sha512_256_b64 sha512_256_b64u sha512_256_file sha512_256_file_hex sha512_256_file_b64 sha512_256_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub sha512_256 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub sha512_256_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub sha512_256_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub sha512_256_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub sha512_256_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub sha512_256_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub sha512_256_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub sha512_256_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('SHA512_256') }
18 sub sha512_256 { Crypt::Digest::digest_data('SHA512_256', @_) }
19 sub sha512_256_hex { Crypt::Digest::digest_data_hex('SHA512_256', @_) }
20 sub sha512_256_b64 { Crypt::Digest::digest_data_b64('SHA512_256', @_) }
21 sub sha512_256_b64u { Crypt::Digest::digest_data_b64u('SHA512_256', @_) }
22 sub sha512_256_file { Crypt::Digest::digest_file('SHA512_256', @_) }
23 sub sha512_256_file_hex { Crypt::Digest::digest_file_hex('SHA512_256', @_) }
24 sub sha512_256_file_b64 { Crypt::Digest::digest_file_b64('SHA512_256', @_) }
25 sub sha512_256_file_b64u { Crypt::Digest::digest_file_b64u('SHA512_256', @_) }
2826
2927 1;
3028
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use Carp;
77 $Carp::Internal{(__PACKAGE__)}++;
88 use CryptX;
9
10 sub new { my $class = shift; _new(@_) }
119
1210 sub addfile {
1311 my ($self, $file) = @_;
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( tiger192 tiger192_hex tiger192_b64 tiger192_b64u tiger192_file tiger192_file_hex tiger192_file_b64 tiger192_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub tiger192 { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub tiger192_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub tiger192_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub tiger192_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub tiger192_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub tiger192_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub tiger192_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub tiger192_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Tiger192') }
18 sub tiger192 { Crypt::Digest::digest_data('Tiger192', @_) }
19 sub tiger192_hex { Crypt::Digest::digest_data_hex('Tiger192', @_) }
20 sub tiger192_b64 { Crypt::Digest::digest_data_b64('Tiger192', @_) }
21 sub tiger192_b64u { Crypt::Digest::digest_data_b64u('Tiger192', @_) }
22 sub tiger192_file { Crypt::Digest::digest_file('Tiger192', @_) }
23 sub tiger192_file_hex { Crypt::Digest::digest_file_hex('Tiger192', @_) }
24 sub tiger192_file_b64 { Crypt::Digest::digest_file_b64('Tiger192', @_) }
25 sub tiger192_file_b64u { Crypt::Digest::digest_file_b64u('Tiger192', @_) }
2826
2927 1;
3028
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Digest Exporter);
99 our %EXPORT_TAGS = ( all => [qw( whirlpool whirlpool_hex whirlpool_b64 whirlpool_b64u whirlpool_file whirlpool_file_hex whirlpool_file_b64 whirlpool_file_b64u )] );
1212
1313 use Carp;
1414 $Carp::Internal{(__PACKAGE__)}++;
15 use CryptX;
16
17 sub hashsize { Crypt::Digest::hashsize(__PACKAGE__) }
18
19 sub whirlpool { Crypt::Digest::digest_data(__PACKAGE__, @_) }
20 sub whirlpool_hex { Crypt::Digest::digest_data_hex(__PACKAGE__, @_) }
21 sub whirlpool_b64 { Crypt::Digest::digest_data_b64(__PACKAGE__, @_) }
22 sub whirlpool_b64u { Crypt::Digest::digest_data_b64u(__PACKAGE__, @_) }
23
24 sub whirlpool_file { Crypt::Digest::digest_file(__PACKAGE__, @_) }
25 sub whirlpool_file_hex { Crypt::Digest::digest_file_hex(__PACKAGE__, @_) }
26 sub whirlpool_file_b64 { Crypt::Digest::digest_file_b64(__PACKAGE__, @_) }
27 sub whirlpool_file_b64u { Crypt::Digest::digest_file_b64u(__PACKAGE__, @_) }
15 use Crypt::Digest;
16
17 sub hashsize { Crypt::Digest::hashsize('Whirlpool') }
18 sub whirlpool { Crypt::Digest::digest_data('Whirlpool', @_) }
19 sub whirlpool_hex { Crypt::Digest::digest_data_hex('Whirlpool', @_) }
20 sub whirlpool_b64 { Crypt::Digest::digest_data_b64('Whirlpool', @_) }
21 sub whirlpool_b64u { Crypt::Digest::digest_data_b64u('Whirlpool', @_) }
22 sub whirlpool_file { Crypt::Digest::digest_file('Whirlpool', @_) }
23 sub whirlpool_file_hex { Crypt::Digest::digest_file_hex('Whirlpool', @_) }
24 sub whirlpool_file_b64 { Crypt::Digest::digest_file_b64('Whirlpool', @_) }
25 sub whirlpool_file_b64u { Crypt::Digest::digest_file_b64u('Whirlpool', @_) }
2826
2927 1;
3028
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u )] );
1313 use CryptX;
1414
1515 ### the following methods/functions are implemented in XS:
16 # - _new
17 # - _hashsize
18 # - _hashsize_by_name (function, not method)
16 # - new
17 # - hashsize
1918 # - clone
2019 # - reset
2120 # - digest
2221 # - hexdigest
2322 # - b64digest
2423 # - add
24 # - digest_data
25 # - digest_data_hex
26 # - digest_data_b64
27 # - digest_data_b64u
2528 # - DESTROY
2629
27 sub _trans_digest_name {
28 my $name = shift || "";
29 my %trans = (
30 CHAES => 'chc_hash',
31 RIPEMD128 => 'rmd128',
32 RIPEMD160 => 'rmd160',
33 RIPEMD256 => 'rmd256',
34 RIPEMD320 => 'rmd320',
35 TIGER192 => 'tiger',
36 SHA512_224 => 'sha512-224',
37 SHA512_256 => 'sha512-256',
38 SHA3_224 => 'sha3-224',
39 SHA3_256 => 'sha3-256',
40 SHA3_384 => 'sha3-384',
41 SHA3_512 => 'sha3-512',
42 BLAKE2B_160 => 'blake2b-160',
43 BLAKE2B_256 => 'blake2b-256',
44 BLAKE2B_384 => 'blake2b-384',
45 BLAKE2B_512 => 'blake2b-512',
46 BLAKE2S_128 => 'blake2s-128',
47 BLAKE2S_160 => 'blake2s-160',
48 BLAKE2S_224 => 'blake2s-224',
49 BLAKE2S_256 => 'blake2s-256',
50 );
51 $name =~ s/^Crypt::Digest:://i;
52 return $trans{uc($name)} if defined $trans{uc($name)};
53 return lc($name);
54 }
55
5630 ### METHODS
57
58 sub new {
59 my $pkg = shift;
60 unshift @_, ($pkg eq 'Crypt::Digest' ? _trans_digest_name(shift) : _trans_digest_name($pkg));
61 local $SIG{__DIE__} = \&CryptX::_croak;
62 return _new(@_);
63 }
64
65 sub hashsize {
66 return unless defined $_[0];
67
68 if (ref $_[0]) {
69 local $SIG{__DIE__} = \&CryptX::_croak;
70 return _hashsize(@_);
71 }
72 else {
73 my $pkg = shift;
74 unshift @_, ($pkg eq 'Crypt::Digest' ? _trans_digest_name(shift) : _trans_digest_name($pkg));
75 local $SIG{__DIE__} = \&CryptX::_croak;
76 return _hashsize_by_name(@_);
77 }
78 }
7931
8032 sub addfile {
8133 my ($self, $file) = @_;
10355 sub CLONE_SKIP { 1 } # prevent cloning
10456
10557 ### FUNCTIONS
106
107 sub digest_data { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->digest }
108 sub digest_data_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->hexdigest }
109 sub digest_data_b64 { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->b64digest }
110 sub digest_data_b64u { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->add(@_)->b64udigest }
11158
11259 sub digest_file { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->addfile(@_)->digest }
11360 sub digest_file_hex { local $SIG{__DIE__} = \&CryptX::_croak; Crypt::Digest->new(shift)->addfile(@_)->hexdigest }
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw(pbkdf1 pbkdf2 hkdf hkdf_expand hkdf_extract)] );
1111 use Carp;
1212 $Carp::Internal{(__PACKAGE__)}++;
1313 use CryptX;
14 use Crypt::Digest;
15
16 sub pbkdf1 {
17 my ($password, $salt, $iteration_count, $hash_name, $len) = @_;
18 $iteration_count ||= 5000;
19 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
20 $len ||= 32;
21 local $SIG{__DIE__} = \&CryptX::_croak;
22 return _pkcs_5_alg1($password, $salt, $iteration_count, $hash_name, $len);
23 }
24
25 sub pbkdf2 {
26 my ($password, $salt, $iteration_count, $hash_name, $len) = @_;
27 $iteration_count ||= 5000;
28 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
29 $len ||= 32;
30 local $SIG{__DIE__} = \&CryptX::_croak;
31 return _pkcs_5_alg2($password, $salt, $iteration_count, $hash_name, $len);
32 }
33
34 sub hkdf_extract {
35 # RFC: HKDF-Extract(salt, IKM, [Hash]) -> PRK
36 #my ($hash_name, $salt, $keying_material) = @_;
37 my ($keying_material, $salt, $hash_name) = @_;
38 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
39 $salt = pack("H*", "00" x Crypt::Digest->hashsize($hash_name)) unless defined $salt; # according to rfc5869 defaults to HashLen zero octets
40 local $SIG{__DIE__} = \&CryptX::_croak;
41 return _hkdf_extract($hash_name, $salt, $keying_material);
42 }
43
44 sub hkdf_expand {
45 # RFC: HKDF-Expand(PRK, info, L, [Hash]) -> OKM
46 #my ($hash_name, $info, $keying_material, $len) = @_;
47 my ($keying_material, $hash_name, $len, $info) = @_;
48 $len ||= 32;
49 $info ||= '';
50 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
51 local $SIG{__DIE__} = \&CryptX::_croak;
52 return _hkdf_expand($hash_name, $info, $keying_material, $len);
53 }
54
55 sub hkdf {
56 #my ($hash_name, $salt, $info, $keying_material, $len) = @_;
57 my ($keying_material, $salt, $hash_name, $len, $info) = @_;
58 $len ||= 32;
59 $info ||= '';
60 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA256');
61 $salt = pack("H*", "00" x Crypt::Digest->hashsize($hash_name)) unless defined $salt; # according to rfc5869 defaults to HashLen zero octets
62 local $SIG{__DIE__} = \&CryptX::_croak;
63 return _hkdf($hash_name, $salt, $info, $keying_material, $len);
64 }
6514
6615 1;
6716
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2b blake2b_hex blake2b_b64 blake2b_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 sub new { my $class = shift; _new(@_) }
15 sub blake2b { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->mac }
16 sub blake2b_hex { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->hexmac }
17 sub blake2b_b64 { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->b64mac }
18 sub blake2b_b64u { Crypt::Mac::BLAKE2b->new(shift, shift)->add(@_)->b64umac }
1912
2013 1;
2114
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( blake2s blake2s_hex blake2s_b64 blake2s_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 sub new { my $class = shift; _new(@_) }
15 sub blake2s { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->mac }
16 sub blake2s_hex { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->hexmac }
17 sub blake2s_b64 { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->b64mac }
18 sub blake2s_b64u { Crypt::Mac::BLAKE2s->new(shift, shift)->add(@_)->b64umac }
1912
2013 1;
2114
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( f9 f9_hex f9_b64 f9_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
17 sub f9 { Crypt::Mac::F9->new(shift, shift)->add(@_)->mac }
18 sub f9_hex { Crypt::Mac::F9->new(shift, shift)->add(@_)->hexmac }
19 sub f9_b64 { Crypt::Mac::F9->new(shift, shift)->add(@_)->b64mac }
20 sub f9_b64u { Crypt::Mac::F9->new(shift, shift)->add(@_)->b64umac }
2112
2213 1;
2314
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( hmac hmac_hex hmac_b64 hmac_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 use Crypt::Digest;
15
16 sub new { my $class = shift; _new(Crypt::Digest::_trans_digest_name(shift), @_) }
17 sub hmac { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->mac }
18 sub hmac_hex { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->hexmac }
19 sub hmac_b64 { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->b64mac }
20 sub hmac_b64u { Crypt::Mac::HMAC->new(shift, shift)->add(@_)->b64umac }
2112
2213 1;
2314
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( omac omac_hex omac_b64 omac_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
17 sub omac { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->mac }
18 sub omac_hex { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->hexmac }
19 sub omac_b64 { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->b64mac }
20 sub omac_b64u { Crypt::Mac::OMAC->new(shift, shift)->add(@_)->b64umac }
2112
2213 1;
2314
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( pmac pmac_hex pmac_b64 pmac_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
17 sub pmac { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->mac }
18 sub pmac_hex { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->hexmac }
19 sub pmac_b64 { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->b64mac }
20 sub pmac_b64u { Crypt::Mac::PMAC->new(shift, shift)->add(@_)->b64umac }
2112
2213 1;
2314
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( pelican pelican_hex pelican_b64 pelican_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 sub new { my $class = shift; _new(@_) }
15 sub pelican { Crypt::Mac::Pelican->new(shift)->add(@_)->mac }
16 sub pelican_hex { Crypt::Mac::Pelican->new(shift)->add(@_)->hexmac }
17 sub pelican_b64 { Crypt::Mac::Pelican->new(shift)->add(@_)->b64mac }
18 sub pelican_b64u { Crypt::Mac::Pelican->new(shift)->add(@_)->b64umac }
1912
2013 1;
2114
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( poly1305 poly1305_hex poly1305_b64 poly1305_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 sub new { my $class = shift; _new(@_) }
15 sub poly1305 { Crypt::Mac::Poly1305->new(shift)->add(@_)->mac }
16 sub poly1305_hex { Crypt::Mac::Poly1305->new(shift)->add(@_)->hexmac }
17 sub poly1305_b64 { Crypt::Mac::Poly1305->new(shift)->add(@_)->b64mac }
18 sub poly1305_b64u { Crypt::Mac::Poly1305->new(shift)->add(@_)->b64umac }
1912
2013 1;
2114
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use base qw(Crypt::Mac Exporter);
99 our %EXPORT_TAGS = ( all => [qw( xcbc xcbc_hex xcbc_b64 xcbc_b64u )] );
1010 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
1111 our @EXPORT = qw();
12
13 use CryptX;
14 use Crypt::Cipher;
15
16 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
17 sub xcbc { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->mac }
18 sub xcbc_hex { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->hexmac }
19 sub xcbc_b64 { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->b64mac }
20 sub xcbc_b64u { Crypt::Mac::XCBC->new(shift, shift)->add(@_)->b64umac }
2112
2213 1;
2314
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
5
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
7 our %EXPORT_TAGS = ( all => [qw( mac mac_hex )] );
8 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
9 our @EXPORT = qw();
4 our $VERSION = '0.059';
105
116 use Carp;
127 $Carp::Internal{(__PACKAGE__)}++;
138 use CryptX;
14
15 sub add {
16 my $self = shift;
17 local $SIG{__DIE__} = \&CryptX::_croak;
18 $self->_add_single($_) for (@_);
19 return $self;
20 }
219
2210 sub addfile {
2311 my ($self, $file) = @_;
2412
2513 my $handle;
2614 if (ref(\$file) eq 'SCALAR') {
27 #filename
2815 open($handle, "<", $file) || die "FATAL: cannot open '$file': $!";
2916 binmode($handle);
3017 }
3118 else {
32 #handle
3319 $handle = $file
3420 }
3521 die "FATAL: invalid handle" unless defined $handle;
3824 my $buf = "";
3925 local $SIG{__DIE__} = \&CryptX::_croak;
4026 while (($n = read($handle, $buf, 32*1024))) {
41 $self->_add_single($buf)
27 $self->add($buf);
4228 }
4329 die "FATAL: read failed: $!" unless defined $n;
4430
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 5.57 'import';
77 use Carp 'croak';
3434 use Crypt::Cipher;
3535 use Crypt::PRNG 'random_bytes';
3636
37 sub encode_b64 {
38 CryptX::_encode_base64(@_);
39 }
40
41 sub decode_b64 {
42 CryptX::_decode_base64(@_);
43 }
44
45 sub encode_b64u {
46 CryptX::_encode_base64url(@_);
47 }
48
49 sub decode_b64u {
50 CryptX::_decode_base64url(@_);
51 }
52
5337 sub _encode_b58 {
5438 my ($bytes, $alphabet) = @_;
5539
6044 if ($bytes =~ /^(\x00+)/) {
6145 $base58 = ('0' x length($1));
6246 }
63 $base58 .= CryptX::_bin_to_radix($bytes, 58);
47 $base58 .= _bin_to_radix($bytes, 58);
6448
6549 if (defined $alphabet) {
6650 my $default = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
7963
8064 my $default = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
8165 if (defined $alphabet) {
82 return undef if $alphabet !~ /^[a-zA-Z0-9]{58}$/;
66 return undef if $alphabet !~ /^[a-zA-Z0-9]{58}$/ || $base58 !~ /^[$alphabet]+$/;
8367 eval "\$base58 =~ tr/$alphabet/$default/"; # HACK: https://stackoverflow.com/questions/11415045/using-a-char-variable-in-tr
8468 return undef if $@;
8569 }
9175 $base58 = $2;
9276 $bytes = ("\x00" x length($1));
9377 }
94 $bytes .= CryptX::_radix_to_bin($base58, 58) if defined $base58 && length($base58) > 0;
78 $bytes .= _radix_to_bin($base58, 58) if defined $base58 && length($base58) > 0;
9579
9680 return $bytes;
9781 }
10791 sub encode_b58r { _encode_b58(shift, "rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz") } # Ripple
10892 sub encode_b58t { _encode_b58(shift, "RPShNAF39wBUDnEGHJKLM4pQrsT7VWXYZ2bcdeCg65jkm8ofqi1tuvaxyz") } # Tipple
10993 sub encode_b58s { _encode_b58(shift, "gsphnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCr65jkm8oFqi1tuvAxyz") } # Stellar
110
111 sub encode_b32r { CryptX::_encode_b32(shift, 0) } # rfc4648
112 sub encode_b32b { CryptX::_encode_b32(shift, 1) } # base32hex
113 sub encode_b32z { CryptX::_encode_b32(shift, 2) } # zbase32
114 sub encode_b32c { CryptX::_encode_b32(shift, 3) } # crockford
115
116 sub decode_b32r { CryptX::_decode_b32(shift, 0) } # rfc4648
117 sub decode_b32b { CryptX::_decode_b32(shift, 1) } # base32hex
118 sub decode_b32z { CryptX::_decode_b32(shift, 2) } # zbase32
119 sub decode_b32c { CryptX::_decode_b32(shift, 3) } # crockford
120
121
122 sub increment_octets_be {
123 CryptX::_increment_octets_be(@_);
124 #$_[0] = CryptX::_increment_octets_be($_[0]);
125 }
126
127 sub increment_octets_le {
128 CryptX::_increment_octets_le(@_);
129 #$_[0] = CryptX::_increment_octets_le($_[0]);
130 }
13194
13295 sub pem_to_der {
13396 my ($data, $password) = @_;
193156 }
194157
195158 sub read_rawfile {
159 # $data = read_rawfile($filename);
196160 my $f = shift;
197161 croak "FATAL: read_rawfile() non-existing file '$f'" unless -f $f;
198162 open my $fh, "<", $f or croak "FATAL: read_rawfile() cannot open file '$f': $!";
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use Crypt::Cipher;
9 use base 'Crypt::Mode';
109
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 local $SIG{__DIE__} = \&CryptX::_croak;
13 $self->start_encrypt(@_)->add($pt) . $self->finish;
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 $self->start_decrypt(@_)->add($ct) . $self->finish;
20 }
21
22 sub CLONE_SKIP { 1 } # prevent cloning
1223
1324 1;
1425
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use Crypt::Cipher;
9 use base 'Crypt::Mode';
109
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 local $SIG{__DIE__} = \&CryptX::_croak;
13 $self->start_encrypt(@_)->add($pt);
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 $self->start_decrypt(@_)->add($ct);
20 }
21
22 sub CLONE_SKIP { 1 } # prevent cloning
1223
1324 1;
1425
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use Crypt::Cipher;
9 use base 'Crypt::Mode';
109
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 local $SIG{__DIE__} = \&CryptX::_croak;
13 $self->start_encrypt(@_)->add($pt);
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 $self->start_decrypt(@_)->add($ct);
20 }
21
22 sub CLONE_SKIP { 1 } # prevent cloning
1223
1324 1;
1425
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use Crypt::Cipher;
9 use base 'Crypt::Mode';
109
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 local $SIG{__DIE__} = \&CryptX::_croak;
13 $self->start_encrypt(@_)->add($pt) . $self->finish;
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 $self->start_decrypt(@_)->add($ct) . $self->finish;
20 }
21
22 sub CLONE_SKIP { 1 } # prevent cloning
1223
1324 1;
1425
33
44 use strict;
55 use warnings;
6 our $VERSION = '0.056';
6 our $VERSION = '0.059';
77
88 use Crypt::Cipher;
9 use base 'Crypt::Mode';
109
11 sub new { my $class = shift; _new(Crypt::Cipher::_trans_cipher_name(shift), @_) }
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 local $SIG{__DIE__} = \&CryptX::_croak;
13 $self->start_encrypt(@_)->add($pt);
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 local $SIG{__DIE__} = \&CryptX::_croak;
19 $self->start_decrypt(@_)->add($ct);
20 }
21
22 sub CLONE_SKIP { 1 } # prevent cloning
1223
1324 1;
1425
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
6 ### METHODS
7
8 sub new { die } # overriden in subclass
9
10 sub encrypt {
11 my ($self, $pt) = (shift, shift);
12 $self->_start(1, @_);
13 return $self->add($pt) . $self->finish;
14 }
15
16 sub decrypt {
17 my ($self, $ct) = (shift, shift);
18 $self->_start(-1, @_);
19 return $self->add($ct) . $self->finish;
20 }
21
22 sub start_encrypt {
23 my $self = shift;
24 $self->_start(1, @_);
25 return $self;
26 }
27
28 sub start_decrypt {
29 my $self = shift;
30 $self->_start(-1, @_);
31 return $self;
32 }
33
34 sub finish {
35 shift->_finish(@_);
36 }
37
38 sub add {
39 my $self = shift;
40 my $rv = '';
41 $rv .= $self->_crypt($_) for (@_);
42 return $rv;
43 }
44
45 sub _crypt {
46 my $self = shift;
47 my $dir = $self->_get_dir;
48 return $self->_encrypt(@_) if $dir == 1;
49 return $self->_decrypt(@_) if $dir == -1;
50 return;
51 }
52
53 sub _finish {
54 my $self = shift;
55 my $dir = $self->_get_dir;
56 return $self->_finish_enc(@_) if $dir == 1;
57 return $self->_finish_dec(@_) if $dir == -1;
58 return;
59 }
60
61 sub CLONE_SKIP { 1 } # prevent cloning
6 ### not used
627
638 1;
649
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( dh_shared_secret )] );
167167 );
168168
169169 sub new {
170 my ($class, $f) = @_;
171 my $self = _new();
172 $self->import_key($f) if $f;
173 return $self;
170 my $self = shift->_new();
171 return @_ > 0 ? $self->import_key(@_) : $self;
174172 }
175173
176174 sub import_key {
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( dsa_encrypt dsa_decrypt dsa_sign_message dsa_verify_message dsa_sign_hash dsa_verify_hash )] );
99 our @EXPORT = qw();
1010
1111 use Carp;
12 $Carp::Internal{(__PACKAGE__)}++;
1213 use CryptX;
1314 use Crypt::Digest 'digest_data';
1415 use Crypt::Misc qw(read_rawfile encode_b64u decode_b64u encode_b64 decode_b64 pem_to_der der_to_pem);
1516 use Crypt::PK;
1617
1718 sub new {
18 my ($class, $f, $p) = @_;
19 my $self = _new();
20 $self->import_key($f, $p) if $f;
21 return $self;
19 my $self = shift->_new();
20 return @_ > 0 ? $self->import_key(@_) : $self;
2221 }
2322
2423 sub generate_key {
9594 croak "FATAL: invalid or unsupported DSA key format";
9695 }
9796
98 sub encrypt {
99 my ($self, $data, $hash_name) = @_;
100 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
101 return $self->_encrypt($data, $hash_name);
102 }
103
104 sub decrypt {
105 my ($self, $data) = @_;
106 return $self->_decrypt($data);
107 }
108
109 sub _truncate {
110 my ($self, $hash) = @_;
111 ### section 4.6 of FIPS 186-4
112 # let N be the bit length of q
113 # z = the leftmost min(N, outlen) bits of Hash(M).
114 my $q = $self->size_q; # = size in bytes
115 return $hash if $q >= length($hash);
116 return substr($hash, 0, $q);
117 }
118
119 sub sign_message {
120 my ($self, $data, $hash_name) = @_;
121 $hash_name ||= 'SHA1';
122 my $data_hash = digest_data($hash_name, $data);
123 return $self->_sign($self->_truncate($data_hash));
124 }
125
126 sub verify_message {
127 my ($self, $sig, $data, $hash_name) = @_;
128 $hash_name ||= 'SHA1';
129 my $data_hash = digest_data($hash_name, $data);
130 return $self->_verify($sig, $self->_truncate($data_hash));
131 }
132
133 sub sign_hash {
134 my ($self, $data_hash) = @_;
135 return $self->_sign($self->_truncate($data_hash));
136 }
137
138 sub verify_hash {
139 my ($self, $sig, $data_hash) = @_;
140 return $self->_verify($sig, $self->_truncate($data_hash));
141 }
142
14397 ### FUNCTIONS
14498
14599 sub dsa_encrypt {
146100 my $key = shift;
101 local $SIG{__DIE__} = \&CryptX::_croak;
147102 $key = __PACKAGE__->new($key) unless ref $key;
148103 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
149104 return $key->encrypt(@_);
151106
152107 sub dsa_decrypt {
153108 my $key = shift;
109 local $SIG{__DIE__} = \&CryptX::_croak;
154110 $key = __PACKAGE__->new($key) unless ref $key;
155111 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
156112 return $key->decrypt(@_);
158114
159115 sub dsa_sign_message {
160116 my $key = shift;
117 local $SIG{__DIE__} = \&CryptX::_croak;
161118 $key = __PACKAGE__->new($key) unless ref $key;
162119 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
163120 return $key->sign_message(@_);
165122
166123 sub dsa_verify_message {
167124 my $key = shift;
125 local $SIG{__DIE__} = \&CryptX::_croak;
168126 $key = __PACKAGE__->new($key) unless ref $key;
169127 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
170128 return $key->verify_message(@_);
172130
173131 sub dsa_sign_hash {
174132 my $key = shift;
133 local $SIG{__DIE__} = \&CryptX::_croak;
175134 $key = __PACKAGE__->new($key) unless ref $key;
176135 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
177136 return $key->sign_hash(@_);
179138
180139 sub dsa_verify_hash {
181140 my $key = shift;
141 local $SIG{__DIE__} = \&CryptX::_croak;
182142 $key = __PACKAGE__->new($key) unless ref $key;
183143 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
184144 return $key->verify_hash(@_);
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw( ecc_encrypt ecc_decrypt ecc_sign_message ecc_verify_message ecc_sign_hash ecc_verify_hash ecc_shared_secret )] );
99 our @EXPORT = qw();
1010
1111 use Carp;
12 $Carp::Internal{(__PACKAGE__)}++;
1213 use CryptX;
1314 use Crypt::Digest qw(digest_data digest_data_b64u);
1415 use Crypt::Misc qw(read_rawfile encode_b64u decode_b64u encode_b64 decode_b64 pem_to_der der_to_pem);
1516 use Crypt::PK;
1617
1718 our %curve = (
18 ### http://www.ecc-brainpool.org/download/Domain-parameters.pdf (v1.0 19.10.2005)
19 brainpoolp160r1 => {
20 oid => '1.3.36.3.3.2.8.1.1.1',
21 prime => "E95E4A5F737059DC60DFC7AD95B3D8139515620F",
22 A => "340E7BE2A280EB74E2BE61BADA745D97E8F7C300",
23 B => "1E589A8595423412134FAA2DBDEC95C8D8675E58",
24 Gx => "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3",
25 Gy => "1667CB477A1A8EC338F94741669C976316DA6321",
26 order => "E95E4A5F737059DC60DF5991D45029409E60FC09",
27 cofactor => 1,
19 # extra curves not recognized by libtomcrypt
20 'wap-wsg-idm-ecid-wtls8' => {
21 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFDE7",
22 A => "0000000000000000000000000000",
23 B => "0000000000000000000000000003",
24 order => "0100000000000001ECEA551AD837E9",
25 Gx => "0000000000000000000000000001",
26 Gy => "0000000000000000000000000002",
27 cofactor => 1,
28 oid => '2.23.43.1.4.8',
2829 },
29 brainpoolp192r1 => {
30 oid => '1.3.36.3.3.2.8.1.1.3',
31 prime => "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
32 A => "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF",
33 B => "469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9",
34 Gx => "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6",
35 Gy => "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F",
36 order => "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1",
37 cofactor => 1,
38 },
39 brainpoolp224r1 => {
40 oid => '1.3.36.3.3.2.8.1.1.5',
41 prime => "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
42 A => "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43",
43 B => "2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B",
44 Gx => "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D",
45 Gy => "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD",
46 order => "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F",
47 cofactor => 1,
48 },
49 brainpoolp256r1 => {
50 oid => '1.3.36.3.3.2.8.1.1.7',
51 prime => "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
52 A => "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
53 B => "26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6",
54 Gx => "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262",
55 Gy => "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
56 order => "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
57 cofactor => 1,
58 },
59 brainpoolp320r1 => {
60 oid => '1.3.36.3.3.2.8.1.1.9',
61 prime => "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
62 A => "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4",
63 B => "520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD884539816F5EB4AC8FB1F1A6",
64 Gx => "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611",
65 Gy => "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1",
66 order => "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311",
67 cofactor => 1,
68 },
69 brainpoolp384r1 => {
70 oid => '1.3.36.3.3.2.8.1.1.11',
71 prime => "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
72 A => "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
73 B => "04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DBC9943AB78696FA504C11",
74 Gx => "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E",
75 Gy => "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
76 order => "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
77 cofactor => 1,
78 },
79 brainpoolp512r1 => {
80 oid => '1.3.36.3.3.2.8.1.1.13',
81 prime => "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
82 A => "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
83 B => "3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723",
84 Gx => "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822",
85 Gy => "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
86 order => "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
87 cofactor => 1,
88 },
89 ### http://www.secg.org/collateral/sec2_final.pdf (September 20, 2000 - Version 1.0)
90 secp112r1 => {
91 oid => '1.3.132.0.6',
92 prime => "DB7C2ABF62E35E668076BEAD208B",
93 A => "DB7C2ABF62E35E668076BEAD2088",
94 B => "659EF8BA043916EEDE8911702B22",
95 Gx => "09487239995A5EE76B55F9C2F098",
96 Gy => "A89CE5AF8724C0A23E0E0FF77500",
97 order => "DB7C2ABF62E35E7628DFAC6561C5",
98 cofactor => 1,
99 },
100 secp112r2 => {
101 oid => '1.3.132.0.7',
102 prime => "DB7C2ABF62E35E668076BEAD208B",
103 A => "6127C24C05F38A0AAAF65C0EF02C",
104 B => "51DEF1815DB5ED74FCC34C85D709",
105 Gx => "4BA30AB5E892B4E1649DD0928643",
106 Gy => "ADCD46F5882E3747DEF36E956E97",
107 order => "36DF0AAFD8B8D7597CA10520D04B",
108 cofactor => 4,
109 },
110 secp128r1 => {
111 oid => '1.3.132.0.28',
112 prime => "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
113 A => "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
114 B => "E87579C11079F43DD824993C2CEE5ED3",
115 Gx => "161FF7528B899B2D0C28607CA52C5B86",
116 Gy => "CF5AC8395BAFEB13C02DA292DDED7A83",
117 order => "FFFFFFFE0000000075A30D1B9038A115",
118 cofactor => 1,
119 },
120 secp128r2 => {
121 oid => '1.3.132.0.29',
122 prime => "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
123 A => "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
124 B => "5EEEFCA380D02919DC2C6558BB6D8A5D",
125 Gx => "7B6AA5D85E572983E6FB32A7CDEBC140",
126 Gy => "27B6916A894D3AEE7106FE805FC34B44",
127 order => "3FFFFFFF7FFFFFFFBE0024720613B5A3",
128 cofactor => 4,
129 },
130 secp160k1 => {
131 oid => '1.3.132.0.9',
132 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
133 A => "0000000000000000000000000000000000000000",
134 B => "0000000000000000000000000000000000000007",
135 Gx => "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
136 Gy => "938CF935318FDCED6BC28286531733C3F03C4FEE",
137 order => "0100000000000000000001B8FA16DFAB9ACA16B6B3",
138 cofactor => 1,
139 },
140 secp160r1 => {
141 oid => '1.3.132.0.8',
142 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
143 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
144 B => "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45",
145 Gx => "4A96B5688EF573284664698968C38BB913CBFC82",
146 Gy => "23A628553168947D59DCC912042351377AC5FB32",
147 order => "0100000000000000000001F4C8F927AED3CA752257",
148 cofactor => 1,
149 },
150 secp160r2 => {
151 oid => '1.3.132.0.30',
152 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
153 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
154 B => "B4E134D3FB59EB8BAB57274904664D5AF50388BA",
155 Gx => "52DCB034293A117E1F4FF11B30F7199D3144CE6D",
156 Gy => "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
157 order => "0100000000000000000000351EE786A818F3A1A16B",
158 cofactor => 1,
159 },
160 secp192k1 => {
161 oid => '1.3.132.0.31',
162 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
163 A => "000000000000000000000000000000000000000000000000",
164 B => "000000000000000000000000000000000000000000000003",
165 Gx => "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
166 Gy => "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
167 order => "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
168 cofactor => 1,
169 },
170 secp192r1 => { # == NIST P-192, X9.62 prime192v1
171 oid => '1.2.840.10045.3.1.1',
172 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
173 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
174 B => "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
175 Gx => "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
176 Gy => "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
177 order => "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
178 cofactor => 1,
179 },
180 secp224k1 => {
181 oid => '1.3.132.0.32',
182 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
183 A => "00000000000000000000000000000000000000000000000000000000",
184 B => "00000000000000000000000000000000000000000000000000000005",
185 Gx => "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
186 Gy => "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
187 order => "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
188 cofactor => 1,
189 },
190 secp224r1 => { # == NIST P-224
191 oid => '1.3.132.0.33',
192 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
193 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
194 B => "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
195 Gx => "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
196 Gy => "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
197 order => "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
198 cofactor => 1,
199 },
200 secp256k1 => {
201 oid => '1.3.132.0.10',
202 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
203 A => "0000000000000000000000000000000000000000000000000000000000000000",
204 B => "0000000000000000000000000000000000000000000000000000000000000007",
205 Gx => "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
206 Gy => "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
207 order => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
208 cofactor => 1,
209 },
210 secp256r1 => { # == NIST P-256, X9.62 prime256v1
211 oid => '1.2.840.10045.3.1.7',
212 prime => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
213 A => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
214 B => "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
215 Gx => "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
216 Gy => "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
217 order => "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
218 cofactor => 1,
219 },
220 secp384r1 => { # == NIST P-384
221 oid => '1.3.132.0.34',
222 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
223 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
224 B => "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
225 Gx => "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
226 Gy => "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
227 order => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
228 cofactor => 1,
229 },
230 secp521r1 => { # == NIST P-521
231 oid => '1.3.132.0.35',
232 prime => "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
233 A => "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
234 B => "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
235 Gx => "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
236 Gy => "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
237 order => "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
238 cofactor => 1
239 },
240 ### http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf (July 2013)
241 nistp192 => { # == secp192r1, X9.62 prime192v1
242 oid => '1.2.840.10045.3.1.1',
243 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF',
244 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC',
245 B => '64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1',
246 Gx => '188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012',
247 Gy => '07192B95FFC8DA78631011ED6B24CDD573F977A11E794811',
248 order => 'FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831',
249 cofactor => 1,
250 },
251 nistp224 => { # == secp224r1
252 oid => '1.3.132.0.33',
253 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001',
254 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE',
255 B => 'B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4',
256 Gx => 'B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21',
257 Gy => 'BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34',
258 order => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D',
259 cofactor => 1,
260 },
261 nistp256 => { # == secp256r1, X9.62 prime256v1
262 oid => '1.2.840.10045.3.1.7',
263 prime => 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF',
264 A => 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC',
265 B => '5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B',
266 Gx => '6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296',
267 Gy => '4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5',
268 order => 'FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551',
269 cofactor => 1,
270 },
271 nistp384 => { # == secp384r1
272 oid => '1.3.132.0.34',
273 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF',
274 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC',
275 B => 'B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF',
276 Gx => 'AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7',
277 Gy => '3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F',
278 order => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973',
279 cofactor => 1,
280 },
281 nistp521 => { # == secp521r1
282 oid => '1.3.132.0.35',
283 prime => '1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF',
284 A => '1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC',
285 B => '051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00',
286 Gx => '0C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66',
287 Gy => '11839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650',
288 order => '1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409',
289 cofactor => 1,
290 },
291 ### ANS X9.62 elliptic curves - http://www.flexiprovider.de/CurvesGfpX962.html
292 prime192v1 => { # == secp192r1, NIST P-192
293 oid => '1.2.840.10045.3.1.1',
294 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF',
295 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC',
296 B => '64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1',
297 Gx => '188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012',
298 Gy => '07192B95FFC8DA78631011ED6B24CDD573F977A11E794811',
299 order => 'FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831',
300 cofactor => 1,
301 },
302 prime192v2 => {
303 oid => '1.2.840.10045.3.1.2',
304 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF',
305 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC',
306 B => 'CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953',
307 Gx => 'EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A',
308 Gy => '6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15',
309 order => 'FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31',
310 cofactor => 1
311 },
312 prime192v3 => {
313 oid => '1.2.840.10045.3.1.3',
314 prime => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF',
315 A => 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC',
316 B => '22123DC2395A05CAA7423DAECCC94760A7D462256BD56916',
317 Gx => '7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896',
318 Gy => '38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0',
319 order => 'FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13',
320 cofactor => 1,
321 },
322 prime239v1 => {
323 oid => '1.2.840.10045.3.1.4',
324 prime => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF',
325 A => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC',
326 B => '6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A',
327 Gx => '0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF',
328 Gy => '7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE',
329 order => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B',
330 cofactor => 1,
331 },
332 prime239v2 => {
333 oid => '1.2.840.10045.3.1.5',
334 prime => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF',
335 A => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC',
336 B => '617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C',
337 Gx => '38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7',
338 Gy => '5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA',
339 order => '7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063',
340 cofactor => 1,
341 },
342 prime239v3 => {
343 oid => '1.2.840.10045.3.1.6',
344 prime => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF',
345 A => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC',
346 B => '255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E',
347 Gx => '6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A',
348 Gy => '1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3',
349 order => '7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551',
350 cofactor => 1,
351 },
352 prime256v1 => { # == secp256r1, NIST P-256
353 oid => '1.2.840.10045.3.1.7',
354 prime => 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF',
355 A => 'FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC',
356 B => '5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B',
357 Gx => '6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296',
358 Gy => '4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5',
359 order => 'FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551',
360 cofactor => 1,
30 'wap-wsg-idm-ecid-wtls9' => {
31 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808F",
32 A => "0000000000000000000000000000000000000000",
33 B => "0000000000000000000000000000000000000003",
34 order => "0100000000000000000001CDC98AE0E2DE574ABF33",
35 Gx => "0000000000000000000000000000000000000001",
36 Gy => "0000000000000000000000000000000000000002",
37 cofactor => 1,
38 oid => '2.23.43.1.4.9',
36139 },
36240 );
36341
364 my %jwkcrv = (
365 'P-192' => 'secp192r1',
366 'P-224' => 'secp224r1',
367 'P-256' => 'secp256r1',
368 'P-384' => 'secp384r1',
369 'P-521' => 'secp521r1',
42 my %jwk2curve = (
43 'P-192' => 'secp192r1',
44 'P-224' => 'secp224r1',
45 'P-256' => 'secp256r1',
46 'P-384' => 'secp384r1',
47 'P-521' => 'secp521r1',
48 );
49
50 my %curve2jwk = (
51 '1.2.840.10045.3.1.1' => 'P-192', # secp192r1
52 '1.3.132.0.33' => 'P-224', # secp224r1
53 '1.2.840.10045.3.1.7' => 'P-256', # secp256r1
54 '1.3.132.0.34' => 'P-384', # secp384r1
55 '1.3.132.0.35' => 'P-521', # secp521r1
56 'nistp192' => 'P-192',
57 'nistp224' => 'P-224',
58 'nistp256' => 'P-256',
59 'nistp384' => 'P-384',
60 'nistp521' => 'P-521',
61 'prime192v1' => 'P-192',
62 'prime256v1' => 'P-256',
63 'secp192r1' => 'P-192',
64 'secp224r1' => 'P-224',
65 'secp256r1' => 'P-256',
66 'secp384r1' => 'P-384',
67 'secp521r1' => 'P-521',
68 );
69
70 our %curve2ltc = ( # must be "our" as we use it from XS code
71 # OIDs
72 "1.2.840.10045.3.1.1" => "SECP192R1",
73 "1.2.840.10045.3.1.2" => "PRIME192V2",
74 "1.2.840.10045.3.1.3" => "PRIME192V3",
75 "1.2.840.10045.3.1.4" => "PRIME239V1",
76 "1.2.840.10045.3.1.5" => "PRIME239V2",
77 "1.2.840.10045.3.1.6" => "PRIME239V3",
78 "1.2.840.10045.3.1.7" => "SECP256R1",
79 "1.3.132.0.10" => "SECP256K1",
80 "1.3.132.0.28" => "SECP128R1",
81 "1.3.132.0.29" => "SECP128R2",
82 "1.3.132.0.30" => "SECP160R2",
83 "1.3.132.0.31" => "SECP192K1",
84 "1.3.132.0.32" => "SECP224K1",
85 "1.3.132.0.33" => "SECP224R1",
86 "1.3.132.0.34" => "SECP384R1",
87 "1.3.132.0.35" => "SECP521R1",
88 "1.3.132.0.6" => "SECP112R1",
89 "1.3.132.0.7" => "SECP112R2",
90 "1.3.132.0.8" => "SECP160R1",
91 "1.3.132.0.9" => "SECP160K1",
92 "1.3.36.3.3.2.8.1.1.1" => "BRAINPOOLP160R1",
93 "1.3.36.3.3.2.8.1.1.11" => "BRAINPOOLP384R1",
94 "1.3.36.3.3.2.8.1.1.13" => "BRAINPOOLP512R1",
95 "1.3.36.3.3.2.8.1.1.3" => "BRAINPOOLP192R1",
96 "1.3.36.3.3.2.8.1.1.5" => "BRAINPOOLP224R1",
97 "1.3.36.3.3.2.8.1.1.7" => "BRAINPOOLP256R1",
98 "1.3.36.3.3.2.8.1.1.9" => "BRAINPOOLP320R1",
99 "1.3.36.3.3.2.8.1.1.10" => "BRAINPOOLP320T1",
100 "1.3.36.3.3.2.8.1.1.12" => "BRAINPOOLP384T1",
101 "1.3.36.3.3.2.8.1.1.14" => "BRAINPOOLP512T1",
102 "1.3.36.3.3.2.8.1.1.2" => "BRAINPOOLP160T1",
103 "1.3.36.3.3.2.8.1.1.4" => "BRAINPOOLP192T1",
104 "1.3.36.3.3.2.8.1.1.6" => "BRAINPOOLP224T1",
105 "1.3.36.3.3.2.8.1.1.8" => "BRAINPOOLP256T1",
106 # JWT names
107 "P-192" => "SECP192R1",
108 "P-224" => "SECP224R1",
109 "P-256" => "SECP256R1",
110 "P-384" => "SECP384R1",
111 "P-521" => "SECP521R1",
112 # openssl names
113 "brainpoolp160r1" => "BRAINPOOLP160R1",
114 "brainpoolp192r1" => "BRAINPOOLP192R1",
115 "brainpoolp224r1" => "BRAINPOOLP224R1",
116 "brainpoolp256r1" => "BRAINPOOLP256R1",
117 "brainpoolp320r1" => "BRAINPOOLP320R1",
118 "brainpoolp384r1" => "BRAINPOOLP384R1",
119 "brainpoolp512r1" => "BRAINPOOLP512R1",
120 "brainpoolp160t1" => "BRAINPOOLP160T1",
121 "brainpoolp192t1" => "BRAINPOOLP192T1",
122 "brainpoolp224t1" => "BRAINPOOLP224T1",
123 "brainpoolp256t1" => "BRAINPOOLP256T1",
124 "brainpoolp320t1" => "BRAINPOOLP320T1",
125 "brainpoolp384t1" => "BRAINPOOLP384T1",
126 "brainpoolp512t1" => "BRAINPOOLP512T1",
127 "nistp192" => "SECP192R1",
128 "nistp224" => "SECP224R1",
129 "nistp256" => "SECP256R1",
130 "nistp384" => "SECP384R1",
131 "nistp521" => "SECP521R1",
132 "prime192v1" => "SECP192R1",
133 "prime192v2" => "PRIME192V2",
134 "prime192v3" => "PRIME192V3",
135 "prime239v1" => "PRIME239V1",
136 "prime239v2" => "PRIME239V2",
137 "prime239v3" => "PRIME239V3",
138 "prime256v1" => "SECP256R1",
139 "secp112r1" => "SECP112R1",
140 "secp112r2" => "SECP112R2",
141 "secp128r1" => "SECP128R1",
142 "secp128r2" => "SECP128R2",
143 "secp160k1" => "SECP160K1",
144 "secp160r1" => "SECP160R1",
145 "secp160r2" => "SECP160R2",
146 "secp192k1" => "SECP192K1",
147 "secp192r1" => "SECP192R1",
148 "secp224k1" => "SECP224K1",
149 "secp224r1" => "SECP224R1",
150 "secp256k1" => "SECP256K1",
151 "secp256r1" => "SECP256R1",
152 "secp384r1" => "SECP384R1",
153 "secp521r1" => "SECP521R1",
154 "wap-wsg-idm-ecid-wtls6" => 'SECP112R1',
155 "wap-wsg-idm-ecid-wtls7" => 'SECP160R2',
156 "wap-wsg-idm-ecid-wtls12" => 'SECP224R1',
370157 );
371158
372159 sub _import_hex {
373160 my ($self, $x, $y, $k, $crv) = @_;
374 my $p = $curve{$crv}{prime};
375 croak "FATAL: invalid or unknown curve" if !$p;
376 $p =~ s/^0+//;
377 my $hex_size = length($p) % 2 ? length($p) + 1 : length($p);
378 if ($k) {
379 $k =~ /^0+/;
380 croak "FATAL: too long private key (k)" if length($k) > $hex_size;
381 my $priv_hex = "0" x ($hex_size - length($k)) . $k;
382 return $self->import_key_raw(pack("H*", $priv_hex), $crv);
383 }
384 elsif ($x && $y) {
385 $x =~ /^0+/;
386 $y =~ /^0+/;
387 croak "FATAL: too long public key (x)" if length($x) > $hex_size;
388 croak "FATAL: too long public key (y)" if length($y) > $hex_size;
389 my $pub_hex = "04" . ("0" x ($hex_size - length($x))) . $x . ("0" x ($hex_size - length($y))) . $y;
161 croak "FATAL: no curve" if !$crv;
162 if (defined $k && length($k) > 0) {
163 croak "FATAL: invalid length (k)" if length($k) % 2;
164 return $self->import_key_raw(pack("H*", $k), $crv);
165 }
166 elsif (defined $x && defined $y) {
167 croak "FATAL: invalid length (x)" if length($x) % 2;
168 croak "FATAL: invalid length (y)" if length($y) % 2;
169 croak "FATAL: invalid length (x,y)" if length($y) != length($x);
170 my $pub_hex = "04" . $x . $y;
390171 return $self->import_key_raw(pack("H*", $pub_hex), $crv);
391172 }
392173 }
393174
394 sub _curve_name_lookup {
395 my ($self, $key) = @_;
396
397 return $key->{curve_name} if $key->{curve_name} && exists $curve{$key->{curve_name}};
398
399 defined(my $A = $key->{curve_A}) or return;
400 defined(my $B = $key->{curve_B}) or return;
401 defined(my $Gx = $key->{curve_Gx}) or return;
402 defined(my $Gy = $key->{curve_Gy}) or return;
403 defined(my $order = $key->{curve_order}) or return;
404 defined(my $prime = $key->{curve_prime}) or return;
405 defined(my $cofactor = $key->{curve_cofactor}) or return;
406 $A =~ s/^0+//;
407 $B =~ s/^0+//;
408 $Gx =~ s/^0+//;
409 $Gy =~ s/^0+//;
410 $order =~ s/^0+//;
411 $prime =~ s/^0+//;
412
413 for my $k (sort keys %curve) {
414 (my $c_A = $curve{$k}{A} ) =~ s/^0+//;
415 (my $c_B = $curve{$k}{B} ) =~ s/^0+//;
416 (my $c_Gx = $curve{$k}{Gx} ) =~ s/^0+//;
417 (my $c_Gy = $curve{$k}{Gy} ) =~ s/^0+//;
418 (my $c_order = $curve{$k}{order} ) =~ s/^0+//;
419 (my $c_prime = $curve{$k}{prime} ) =~ s/^0+//;
420 my $c_cofactor = $curve{$k}{cofactor};
421 return $k if $A eq $c_A && $B eq $c_B && $Gx eq $c_Gx && $Gy eq $c_Gy &&
422 $order eq $c_order && $prime eq $c_prime && $cofactor == $c_cofactor;
423 }
424 }
425
426175 sub new {
427 my ($class, $f, $p) = @_;
428 my $self = _new();
429 $self->import_key($f, $p) if $f;
430 return $self;
176 my $self = shift->_new();
177 return @_ > 0 ? $self->import_key(@_) : $self;
431178 }
432179
433180 sub export_key_pem {
434181 my ($self, $type, $password, $cipher) = @_;
182 local $SIG{__DIE__} = \&CryptX::_croak;
435183 my $key = $self->export_key_der($type||'');
436184 return unless $key;
437185 return der_to_pem($key, "EC PRIVATE KEY", $password, $cipher) if substr($type, 0, 7) eq 'private';
440188
441189 sub export_key_jwk {
442190 my ($self, $type, $wanthash) = @_;
191 local $SIG{__DIE__} = \&CryptX::_croak;
443192 my $kh = $self->key2hash;
444 my $curve = $self->_curve_name_lookup($kh);
445 $curve = 'P-192' if $curve =~ /(secp192r1|nistp192|prime192v1)/;
446 $curve = 'P-224' if $curve =~ /(secp224r1|nistp224)/;
447 $curve = 'P-256' if $curve =~ /(secp256r1|nistp256|prime256v1)/;
448 $curve = 'P-384' if $curve =~ /(secp384r1|nistp384)/;
449 $curve = 'P-521' if $curve =~ /(secp521r1|nistp521)/;
193 $kh->{curve_oid} = '' if !defined $kh->{curve_oid};
194 $kh->{curve_name} = '' if !defined $kh->{curve_name};
195 my $curve_jwt = $curve2jwk{$kh->{curve_oid}} || $curve2jwk{lc $kh->{curve_name}} || $kh->{curve_name};
450196 if ($type && $type eq 'private') {
451197 return unless $kh->{pub_x} && $kh->{pub_y} && $kh->{k};
452198 for (qw/pub_x pub_y k/) {
455201 # NOTE: x + y are not necessary in privkey
456202 # but they are used in https://tools.ietf.org/html/rfc7517#appendix-A.2
457203 my $hash = {
458 kty => "EC", crv=>$curve,
204 kty => "EC", crv => $curve_jwt,
459205 x => encode_b64u(pack("H*", $kh->{pub_x})),
460206 y => encode_b64u(pack("H*", $kh->{pub_y})),
461207 d => encode_b64u(pack("H*", $kh->{k})),
468214 $kh->{$_} = "0$kh->{$_}" if length($kh->{$_}) % 2;
469215 }
470216 my $hash = {
471 kty => "EC", crv=>$curve,
217 kty => "EC", crv => $curve_jwt,
472218 x => encode_b64u(pack("H*", $kh->{pub_x})),
473219 y => encode_b64u(pack("H*", $kh->{pub_y})),
474220 };
478224
479225 sub export_key_jwk_thumbprint {
480226 my ($self, $hash_name) = @_;
227 local $SIG{__DIE__} = \&CryptX::_croak;
481228 $hash_name ||= 'SHA256';
482229 my $h = $self->export_key_jwk('public', 1);
483230 my $json = CryptX::_encode_json({crv=>$h->{crv}, kty=>$h->{kty}, x=>$h->{x}, y=>$h->{y}});
486233
487234 sub import_key {
488235 my ($self, $key, $password) = @_;
236 local $SIG{__DIE__} = \&CryptX::_croak;
489237 croak "FATAL: undefined key" unless $key;
490238
491239 # special case
492240 if (ref($key) eq 'HASH') {
493241 if (($key->{pub_x} && $key->{pub_y}) || $key->{k}) {
494242 # hash exported via key2hash
495 my $curve = $self->_curve_name_lookup($key);
496 croak "FATAL: invalid or unknown curve" if !$curve;
497 return $self->_import_hex($key->{pub_x}, $key->{pub_y}, $key->{k}, $curve);
243 my $curve_name = $key->{curve_name} || $key->{curve_oid};
244 return $self->_import_hex($key->{pub_x}, $key->{pub_y}, $key->{k}, $curve_name);
498245 }
499246 if ($key->{crv} && $key->{kty} && $key->{kty} eq "EC" && ($key->{d} || ($key->{x} && $key->{y}))) {
500247 # hash with items corresponding to JSON Web Key (JWK)
502249 for (qw/x y d/) {
503250 $key->{$_} = eval { unpack("H*", decode_b64u($key->{$_})) } if exists $key->{$_};
504251 }
505 if (my $curve = $jwkcrv{$key->{crv}}) {
506 return $self->_import_hex($key->{x}, $key->{y}, $key->{d}, $curve);
252 if (my $curve_name = $jwk2curve{$key->{crv}}) {
253 return $self->_import_hex($key->{x}, $key->{y}, $key->{d}, $curve_name);
507254 }
508255 # curve is not JWK compliant e.g. P-192 P-224 P-256 P-384 P-521 (we'll try to import anyway)
509 return $self->_import_hex($key->{x}, $key->{y}, $key->{d}, lc($key->{crv}));
256 return $self->_import_hex($key->{x}, $key->{y}, $key->{d}, $key->{crv});
510257 }
511258 croak "FATAL: unexpected ECC key hash";
512259 }
532279 return $self->_import_pkcs8($data, $password);
533280 }
534281 elsif ($data =~ /-----BEGIN ENCRYPTED PRIVATE KEY-----(.*?)-----END/sg) {
535 # XXX-TODO: pkcs#8 encrypted private key
536 croak "FATAL: encrypted pkcs8 EC private keys are not supported";
282 $data = pem_to_der($data, $password);
283 return $self->_import_pkcs8($data, $password);
537284 }
538285 elsif ($data =~ /^\s*(\{.*?\})\s*$/s) {
539286 # JSON Web Key (JWK) - http://tools.ietf.org/html/draft-ietf-jose-json-web-key
543290 for (qw/x y d/) {
544291 $h->{$_} = eval { unpack("H*", decode_b64u($h->{$_})) } if exists $h->{$_};
545292 }
546 if (my $curve = $jwkcrv{$h->{crv}}) {
547 return $self->_import_hex($h->{x}, $h->{y}, $h->{d}, $curve);
293 if (my $curve_name = $jwk2curve{$h->{crv}}) {
294 return $self->_import_hex($h->{x}, $h->{y}, $h->{d}, $curve_name);
548295 }
549296 # curve is not JWK compliant e.g. P-192 P-224 P-256 P-384 P-521 (we'll try to import anyway)
550 return $self->_import_hex($h->{x}, $h->{y}, $h->{d}, lc($h->{crv}));
297 return $self->_import_hex($h->{x}, $h->{y}, $h->{d}, $h->{crv});
551298 }
299 }
300 elsif ($data =~ /-----BEGIN CERTIFICATE-----(.*?)-----END CERTIFICATE-----/sg) {
301 $data = pem_to_der($data);
302 return $self->_import_x509($data);
552303 }
553304 elsif ($data =~ /---- BEGIN SSH2 PUBLIC KEY ----(.*?)---- END SSH2 PUBLIC KEY ----/sg) {
554305 $data = pem_to_der($data);
561312 return $self->import_key_raw($pubkey, "$2") if $pubkey && $typ =~ /^ecdsa-(.+?)-(.*)$/;
562313 }
563314 else {
564 my $rv = eval { $self->_import($data) } || eval { $self->_import_pkcs8($data, $password) };
315 my $rv = eval { $self->_import($data) } || eval { $self->_import_pkcs8($data, $password) } || eval { $self->_import_x509($data) };
565316 return $rv if $rv;
566317 }
567318 croak "FATAL: invalid or unsupported EC key format";
568 }
569
570 sub encrypt {
571 my ($self, $data, $hash_name) = @_;
572 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
573 return $self->_encrypt($data, $hash_name);
574 }
575
576 sub decrypt {
577 my ($self, $data) = @_;
578 return $self->_decrypt($data);
579 }
580
581 sub sign_message {
582 my ($self, $data, $hash_name) = @_;
583 $hash_name ||= 'SHA1';
584 my $data_hash = digest_data($hash_name, $data);
585 return $self->_sign($data_hash);
586 }
587
588 sub sign_message_rfc7518 {
589 my ($self, $data, $hash_name) = @_;
590 $hash_name ||= 'SHA1';
591 my $data_hash = digest_data($hash_name, $data);
592 return $self->_sign_rfc7518($data_hash);
593 }
594
595 sub verify_message {
596 my ($self, $sig, $data, $hash_name) = @_;
597 $hash_name ||= 'SHA1';
598 my $data_hash = digest_data($hash_name, $data);
599 return $self->_verify($sig, $data_hash);
600 }
601
602 sub verify_message_rfc7518 {
603 my ($self, $sig, $data, $hash_name) = @_;
604 $hash_name ||= 'SHA1';
605 my $data_hash = digest_data($hash_name, $data);
606 return $self->_verify_rfc7518($sig, $data_hash);
607 }
608
609 sub sign_hash {
610 my ($self, $data_hash) = @_;
611 return $self->_sign($data_hash);
612 }
613
614 sub verify_hash {
615 my ($self, $sig, $data_hash) = @_;
616 return $self->_verify($sig, $data_hash);
617319 }
618320
619321 sub curve2hash {
626328 Gx => $kh->{curve_Gx},
627329 Gy => $kh->{curve_Gy},
628330 cofactor => $kh->{curve_cofactor},
629 order => $kh->{curve_order}
331 order => $kh->{curve_order},
332 oid => $kh->{curve_oid},
630333 };
631334 }
632335
634337
635338 sub ecc_encrypt {
636339 my $key = shift;
340 local $SIG{__DIE__} = \&CryptX::_croak;
637341 $key = __PACKAGE__->new($key) unless ref $key;
638342 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
639343 return $key->encrypt(@_);
641345
642346 sub ecc_decrypt {
643347 my $key = shift;
348 local $SIG{__DIE__} = \&CryptX::_croak;
644349 $key = __PACKAGE__->new($key) unless ref $key;
645350 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
646351 return $key->decrypt(@_);
648353
649354 sub ecc_sign_message {
650355 my $key = shift;
356 local $SIG{__DIE__} = \&CryptX::_croak;
651357 $key = __PACKAGE__->new($key) unless ref $key;
652358 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
653359 return $key->sign_message(@_);
655361
656362 sub ecc_verify_message {
657363 my $key = shift;
364 local $SIG{__DIE__} = \&CryptX::_croak;
658365 $key = __PACKAGE__->new($key) unless ref $key;
659366 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
660367 return $key->verify_message(@_);
662369
663370 sub ecc_sign_hash {
664371 my $key = shift;
372 local $SIG{__DIE__} = \&CryptX::_croak;
665373 $key = __PACKAGE__->new($key) unless ref $key;
666374 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
667375 return $key->sign_hash(@_);
669377
670378 sub ecc_verify_hash {
671379 my $key = shift;
380 local $SIG{__DIE__} = \&CryptX::_croak;
672381 $key = __PACKAGE__->new($key) unless ref $key;
673382 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
674383 return $key->verify_hash(@_);
676385
677386 sub ecc_shared_secret {
678387 my ($privkey, $pubkey) = @_;
388 local $SIG{__DIE__} = \&CryptX::_croak;
679389 $privkey = __PACKAGE__->new($privkey) unless ref $privkey;
680390 $pubkey = __PACKAGE__->new($pubkey) unless ref $pubkey;
681391 carp "FATAL: invalid 'privkey' param" unless ref($privkey) eq __PACKAGE__ && $privkey->is_private;
911621 lBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
912622 -----END EC PRIVATE KEY-----
913623
624 =item * EC private keys with curve defined by OID + compressed form (supported since: CryptX-0.059)
625
626 -----BEGIN EC PRIVATE KEY-----
627 MFcCAQEEIBG1c3z52T8XwMsahGVdOZWgKCQJfv+l7djuJjgetdbDoAoGCCqGSM49
628 AwEHoSQDIgADoBUyo8CQAFPeYPvv78ylh5MwFZjTCLQeb042TjiMJxE=
629 -----END EC PRIVATE KEY-----
630
914631 =item * EC private keys in password protected PEM format
915632
916633 -----BEGIN EC PRIVATE KEY-----
941658 -----BEGIN PUBLIC KEY-----
942659 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEoBUyo8CQAFPeYPvv78ylh5MwFZjT
943660 CLQeb042TjiMJxG+9DLFmRSMlBQ9T/RsLLc+PmpB1+7yPAR+oR5gZn3kJQ==
661 -----END PUBLIC KEY-----
662
663 =item * EC public keys with curve defined by OID + public point in compressed form (supported since: CryptX-0.059)
664
665 -----BEGIN PUBLIC KEY-----
666 MDkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDIgADoBUyo8CQAFPeYPvv78ylh5MwFZjT
667 CLQeb042TjiMJxE=
944668 -----END PUBLIC KEY-----
945669
946670 =item * PKCS#8 private keys with all curve parameters
963687 lEHQYjWya2YnHaPq/iMFa7A=
964688 -----END PRIVATE KEY-----
965689
966 =item * PKCS#8 encrypted private keys ARE NOT SUPPORTED YET!
690 =item * PKCS#8 encrypted private keys - password protected keys (supported since: CryptX-0.059)
967691
968692 -----BEGIN ENCRYPTED PRIVATE KEY-----
969693 MIGYMBwGCiqGSIb3DQEMAQMwDgQINApjTa6oFl0CAggABHi+59l4d4e6KtG9yci2
971695 NfckdL5O2L8MRnM+ljkFtV2Te4fszWcJFdd7KiNOkPpn+7sWLfzQdvhHChLKUzmz
972696 4INKZyMv/G7VpZ0=
973697 -----END ENCRYPTED PRIVATE KEY-----
698
699 =item * EC public key from X509 certificate
700
701 -----BEGIN CERTIFICATE-----
702 MIIBdDCCARqgAwIBAgIJAL2BBClDEnnOMAoGCCqGSM49BAMEMBcxFTATBgNVBAMM
703 DFRlc3QgQ2VydCBFQzAgFw0xNzEyMzAyMDMzNDFaGA8zMDE3MDUwMjIwMzM0MVow
704 FzEVMBMGA1UEAwwMVGVzdCBDZXJ0IEVDMFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAE
705 KvkL2r5xZp7RzxLQJK+6tn/7lic+L70e1fmNbHOdxRaRvbK5G0AQWrdsbjJb92Ni
706 lCQk2+w/i+VuS2Q3MSR5TaNQME4wHQYDVR0OBBYEFGbJkDyKgaMcIGHS8/WuqIVw
707 +R8sMB8GA1UdIwQYMBaAFGbJkDyKgaMcIGHS8/WuqIVw+R8sMAwGA1UdEwQFMAMB
708 Af8wCgYIKoZIzj0EAwQDSAAwRQIhAJtOsmrM+gJpImoynAyqTN+7myL71uxd+YeC
709 6ze4MnzWAiBQi5/BqEr/SQ1+BC2TPtswvJPRFh2ZvT/6Km3gKoNVXQ==
710 -----END CERTIFICATE-----
974711
975712 =item * SSH public EC keys
976713
1034771 #or
1035772 my $public_der = $pk->export_key_der('public_short');
1036773
774 Since CryptX-0.59 C<export_key_der> can also export keys in "compressed" format
775 that defines curve by OID + stores public point in compressed form.
776
777 my $private_pem = $pk->export_key_der('private_compressed');
778 #or
779 my $public_pem = $pk->export_key_der('public_compressed');
780
1037781 =head2 export_key_pem
1038782
1039783 my $private_pem = $pk->export_key_pem('private');
1046790 my $private_pem = $pk->export_key_pem('private_short');
1047791 #or
1048792 my $public_pem = $pk->export_key_pem('public_short');
793
794 Since CryptX-0.59 C<export_key_pem> can also export keys in "compressed" format
795 that defines curve by OID + stores public point in compressed form.
796
797 my $private_pem = $pk->export_key_pem('private_compressed');
798 #or
799 my $public_pem = $pk->export_key_pem('public_compressed');
1049800
1050801 Support for password protected PEM keys
1051802
1153904 my $pk = Crypt::PK::ECC->new($priv_key_filename);
1154905 my $signature = $priv->sign_hash($message_hash);
1155906
907 =head2 sign_hash_rfc7518
908
909 I<Since: CryptX-0.059>
910
911 Same as L<sign_hash|/sign_hash> only the signature format is as defined by L<https://tools.ietf.org/html/rfc7518>
912 (JWA - JSON Web Algorithms).
913
1156914 =head2 verify_hash
1157915
1158916 my $pk = Crypt::PK::ECC->new($pub_key_filename);
1159917 my $valid = $pub->verify_hash($signature, $message_hash);
918
919 =head2 verify_hash_rfc7518
920
921 I<Since: CryptX-0.059>
922
923 Same as L<verify_hash|/verify_hash> only the signature format is as defined by L<https://tools.ietf.org/html/rfc7518>
924 (JWA - JSON Web Algorithms).
1160925
1161926 =head2 shared_secret
1162927
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw(rsa_encrypt rsa_decrypt rsa_sign_message rsa_verify_message rsa_sign_hash rsa_verify_hash)] );
1515 use Crypt::PK;
1616
1717 sub new {
18 my ($class, $f, $p) = @_;
19 my $self = _new();
20 $self->import_key($f, $p) if $f;
21 return $self;
18 my $self = shift->_new();
19 return @_ > 0 ? $self->import_key(@_) : $self;
2220 }
2321
2422 sub export_key_pem {
164162 croak "FATAL: invalid or unsupported RSA key format";
165163 }
166164
167 sub encrypt {
168 my ($self, $data, $padding, $hash_name, $lparam) = @_;
169 $lparam ||= '';
170 $padding ||= 'oaep';
171 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
172
173 return $self->_encrypt($data, $padding, $hash_name, $lparam);
174 }
175
176 sub decrypt {
177 my ($self, $data, $padding, $hash_name, $lparam) = @_;
178 $lparam ||= '';
179 $padding ||= 'oaep';
180 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
181
182 return $self->_decrypt($data, $padding, $hash_name, $lparam);
183 }
184
185 sub sign_hash {
186 my ($self, $data, $hash_name, $padding, $saltlen) = @_;
187 $saltlen ||= 12;
188 $padding ||= 'pss';
189 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
190
191 return $self->_sign($data, $padding, $hash_name, $saltlen);
192 }
193
194 sub sign_message {
195 my ($self, $data, $hash_name, $padding, $saltlen) = @_;
196 $saltlen ||= 12;
197 $padding ||= 'pss';
198 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
199
200 return $self->_sign(digest_data($hash_name, $data), $padding, $hash_name, $saltlen);
201 }
202
203 sub verify_hash {
204 my ($self, $sig, $data, $hash_name, $padding, $saltlen) = @_;
205 $saltlen ||= 12;
206 $padding ||= 'pss';
207 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
208
209 return $self->_verify($sig, $data, $padding, $hash_name, $saltlen);
210 }
211
212 sub verify_message {
213 my ($self, $sig, $data, $hash_name, $padding, $saltlen) = @_;
214 $saltlen ||= 12;
215 $padding ||= 'pss';
216 $hash_name = Crypt::Digest::_trans_digest_name($hash_name||'SHA1');
217
218 return $self->_verify($sig, digest_data($hash_name, $data), $padding, $hash_name, $saltlen);
219 }
220
221165 ### FUNCTIONS
222166
223167 sub rsa_encrypt {
224168 my $key = shift;
169 local $SIG{__DIE__} = \&CryptX::_croak;
225170 $key = __PACKAGE__->new($key) unless ref $key;
226171 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
227172 return $key->encrypt(@_);
229174
230175 sub rsa_decrypt {
231176 my $key = shift;
177 local $SIG{__DIE__} = \&CryptX::_croak;
232178 $key = __PACKAGE__->new($key) unless ref $key;
233179 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
234180 return $key->decrypt(@_);
236182
237183 sub rsa_sign_hash {
238184 my $key = shift;
185 local $SIG{__DIE__} = \&CryptX::_croak;
239186 $key = __PACKAGE__->new($key) unless ref $key;
240187 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
241188 return $key->sign_hash(@_);
243190
244191 sub rsa_verify_hash {
245192 my $key = shift;
193 local $SIG{__DIE__} = \&CryptX::_croak;
246194 $key = __PACKAGE__->new($key) unless ref $key;
247195 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
248196 return $key->verify_hash(@_);
250198
251199 sub rsa_sign_message {
252200 my $key = shift;
201 local $SIG{__DIE__} = \&CryptX::_croak;
253202 $key = __PACKAGE__->new($key) unless ref $key;
254203 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
255204 return $key->sign_message(@_);
257206
258207 sub rsa_verify_message {
259208 my $key = shift;
209 local $SIG{__DIE__} = \&CryptX::_croak;
260210 $key = __PACKAGE__->new($key) unless ref $key;
261211 carp "FATAL: invalid 'key' param" unless ref($key) eq __PACKAGE__;
262212 return $key->verify_message(@_);
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use Carp;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use base qw(Crypt::PRNG Exporter);
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
99 our @EXPORT = qw();
1010
1111 use CryptX;
12 use base 'Crypt::PRNG';
1312
1413 {
1514 ### stolen from Bytes::Random::Secure
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use base qw(Crypt::PRNG Exporter);
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
99 our @EXPORT = qw();
1010
1111 use CryptX;
12 use base 'Crypt::PRNG';
1312
1413 {
1514 ### stolen from Bytes::Random::Secure
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use base qw(Crypt::PRNG Exporter);
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
99 our @EXPORT = qw();
1010
1111 use CryptX;
12 use base 'Crypt::PRNG';
1312
1413 {
1514 ### stolen from Bytes::Random::Secure
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use base qw(Crypt::PRNG Exporter);
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
99 our @EXPORT = qw();
1010
1111 use CryptX;
12 use base 'Crypt::PRNG';
1312
1413 {
1514 ### stolen from Bytes::Random::Secure
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use base qw(Crypt::PRNG Exporter);
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
5
6 use base qw(Exporter);
4 our $VERSION = '0.059';
5
6 require Exporter; our @ISA = qw(Exporter); ### use Exporter 'import';
77 our %EXPORT_TAGS = ( all => [qw(random_bytes random_bytes_hex random_bytes_b64 random_bytes_b64u random_string random_string_from rand irand)] );
88 our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
99 our @EXPORT = qw();
1010
11 #BEWARE: cannot use Crypt::Misc qw(encode_b64 encode_b64u);
11 use Carp;
12 $Carp::Internal{(__PACKAGE__)}++;
1213 use CryptX;
13
14 sub _trans_prng_name {
15 my $name = shift;
16 $name =~ s/^Crypt::PRNG:://;
17 return lc($name);
18 }
19
20 ### METHODS
21
22 sub new {
23 my $pkg = shift;
24 my $prng_name = $pkg eq __PACKAGE__ ? _trans_prng_name(shift||'ChaCha20') : _trans_prng_name($pkg);
25 return _new($$, $prng_name, @_);
26 }
27
28 sub bytes { return shift->_bytes($$, shift) }
29
30 sub int32 { return shift->_int32($$) }
31
32 sub double { return shift->_double($$, shift) }
33
34 sub bytes_hex { return unpack("H*", shift->bytes(shift)) }
35
36 sub bytes_b64 { return CryptX::_encode_base64(shift->bytes(shift)) }
37
38 sub bytes_b64u { return CryptX::_encode_base64url(shift->bytes(shift)) }
3914
4015 sub string {
4116 my ($self, $len) = @_;
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
11
22 use strict;
33 use warnings ;
4 our $VERSION = '0.056';
5
6 use base qw(Exporter);
7 our @EXPORT_OK = qw();
4 our $VERSION = '0.059';
85
96 require XSLoader;
107 XSLoader::load('CryptX', $VERSION);
6663
6764 Cryptography in CryptX is based on L<https://github.com/libtom/libtomcrypt>
6865
69 Currently available modules:
66 Available modules:
7067
7168 =over
7269
9895 L<Crypt::Digest::CHAES>, L<Crypt::Digest::MD2>, L<Crypt::Digest::MD4>, L<Crypt::Digest::MD5>, L<Crypt::Digest::RIPEMD128>, L<Crypt::Digest::RIPEMD160>,
9996 L<Crypt::Digest::RIPEMD256>, L<Crypt::Digest::RIPEMD320>, L<Crypt::Digest::SHA1>, L<Crypt::Digest::SHA224>, L<Crypt::Digest::SHA256>, L<Crypt::Digest::SHA384>,
10097 L<Crypt::Digest::SHA512>, L<Crypt::Digest::SHA512_224>, L<Crypt::Digest::SHA512_256>, L<Crypt::Digest::Tiger192>, L<Crypt::Digest::Whirlpool>,
98 L<Crypt::Digest::Keccak224>, L<Crypt::Digest::Keccak256>, L<Crypt::Digest::Keccak384>, L<Crypt::Digest::Keccak512>,
10199 L<Crypt::Digest::SHA3_224>, L<Crypt::Digest::SHA3_256>, L<Crypt::Digest::SHA3_384>, L<Crypt::Digest::SHA3_512>, L<Crypt::Digest::SHAKE>
102100
103101 =item * Checksums
104102
105 L<Crypt::Checksum>, L<Crypt::Checksum::Adler32>, L<Crypt::Checksum::CRC32>
103 L<Crypt::Checksum::Adler32>, L<Crypt::Checksum::CRC32>
106104
107105 =item * Message Authentication Codes
108106
113111
114112 L<Crypt::PK::RSA>, L<Crypt::PK::DSA>, L<Crypt::PK::ECC>, L<Crypt::PK::DH>
115113
116 =item * Cryptographically secure random number generators
114 =item * Cryptographically secure random number generators - see L<Crypt::PRNG> and related modules
117115
118 L<Crypt::PRNG>, L<Crypt::PRNG::Fortuna>, L<Crypt::PRNG::Yarrow>, L<Crypt::PRNG::RC4>, L<Crypt::PRNG::Sober128>, L<Crypt::PRNG::ChaCha20>
116 L<Crypt::PRNG::Fortuna>, L<Crypt::PRNG::Yarrow>, L<Crypt::PRNG::RC4>, L<Crypt::PRNG::Sober128>, L<Crypt::PRNG::ChaCha20>
119117
120118 =item * Key derivation functions - PBKDF1, PBKDF2 and HKDF
121119
133131
134132 =head1 COPYRIGHT
135133
136 Copyright (c) 2013+ DCIT, a.s. L<http://www.dcit.cz> / Karel Miko
134 Copyright (c) 2013+ DCIT, a.s. L<https://www.dcit.cz> / Karel Miko
137135
138136 =cut
11
22 use strict;
33 use warnings;
4 our $VERSION = '0.056';
4 our $VERSION = '0.059';
55
66 use CryptX;
77
6565 ltc/pk/asn1/der/bit/der_encode_bit_string.o ltc/pk/asn1/der/bit/der_encode_raw_bit_string.o \
6666 ltc/pk/asn1/der/bit/der_length_bit_string.o ltc/pk/asn1/der/boolean/der_decode_boolean.o \
6767 ltc/pk/asn1/der/boolean/der_encode_boolean.o ltc/pk/asn1/der/boolean/der_length_boolean.o \
68 ltc/pk/asn1/der/choice/der_decode_choice.o ltc/pk/asn1/der/generalizedtime/der_decode_generalizedtime.o \
68 ltc/pk/asn1/der/choice/der_decode_choice.o ltc/pk/asn1/der/custom_type/der_decode_custom_type.o \
69 ltc/pk/asn1/der/custom_type/der_encode_custom_type.o ltc/pk/asn1/der/custom_type/der_length_custom_type.o \
70 ltc/pk/asn1/der/general/der_asn1_maps.o ltc/pk/asn1/der/general/der_decode_asn1_identifier.o \
71 ltc/pk/asn1/der/general/der_decode_asn1_length.o ltc/pk/asn1/der/general/der_encode_asn1_identifier.o \
72 ltc/pk/asn1/der/general/der_encode_asn1_length.o ltc/pk/asn1/der/general/der_length_asn1_identifier.o \
73 ltc/pk/asn1/der/general/der_length_asn1_length.o ltc/pk/asn1/der/generalizedtime/der_decode_generalizedtime.o \
6974 ltc/pk/asn1/der/generalizedtime/der_encode_generalizedtime.o ltc/pk/asn1/der/generalizedtime/der_length_generalizedtime.o \
7075 ltc/pk/asn1/der/ia5/der_decode_ia5_string.o ltc/pk/asn1/der/ia5/der_encode_ia5_string.o \
7176 ltc/pk/asn1/der/ia5/der_length_ia5_string.o ltc/pk/asn1/der/integer/der_decode_integer.o \
7681 ltc/pk/asn1/der/printable_string/der_decode_printable_string.o ltc/pk/asn1/der/printable_string/der_encode_printable_string.o \
7782 ltc/pk/asn1/der/printable_string/der_length_printable_string.o ltc/pk/asn1/der/sequence/der_decode_sequence_ex.o \
7883 ltc/pk/asn1/der/sequence/der_decode_sequence_flexi.o ltc/pk/asn1/der/sequence/der_decode_sequence_multi.o \
79 ltc/pk/asn1/der/sequence/der_decode_subject_public_key_info.o ltc/pk/asn1/der/sequence/der_encode_sequence_ex.o \
80 ltc/pk/asn1/der/sequence/der_encode_sequence_multi.o ltc/pk/asn1/der/sequence/der_encode_subject_public_key_info.o \
84 ltc/pk/asn1/der/sequence/der_encode_sequence_ex.o ltc/pk/asn1/der/sequence/der_encode_sequence_multi.o \
8185 ltc/pk/asn1/der/sequence/der_length_sequence.o ltc/pk/asn1/der/sequence/der_sequence_free.o \
8286 ltc/pk/asn1/der/sequence/der_sequence_shrink.o ltc/pk/asn1/der/set/der_encode_set.o \
8387 ltc/pk/asn1/der/set/der_encode_setof.o ltc/pk/asn1/der/short_integer/der_decode_short_integer.o \
8690 ltc/pk/asn1/der/utctime/der_decode_utctime.o ltc/pk/asn1/der/utctime/der_encode_utctime.o \
8791 ltc/pk/asn1/der/utctime/der_length_utctime.o ltc/pk/asn1/der/utf8/der_decode_utf8_string.o \
8892 ltc/pk/asn1/der/utf8/der_encode_utf8_string.o ltc/pk/asn1/der/utf8/der_length_utf8_string.o \
93 ltc/pk/asn1/x509/x509_decode_subject_public_key_info.o ltc/pk/asn1/x509/x509_encode_subject_public_key_info.o \
8994 ltc/pk/dh/dh.o ltc/pk/dh/dh_check_pubkey.o ltc/pk/dh/dh_export.o ltc/pk/dh/dh_export_key.o \
9095 ltc/pk/dh/dh_free.o ltc/pk/dh/dh_generate_key.o ltc/pk/dh/dh_import.o ltc/pk/dh/dh_set.o \
9196 ltc/pk/dh/dh_set_pg_dhparam.o ltc/pk/dh/dh_shared_secret.o ltc/pk/dsa/dsa_decrypt_key.o \
9398 ltc/pk/dsa/dsa_generate_pqg.o ltc/pk/dsa/dsa_import.o ltc/pk/dsa/dsa_make_key.o ltc/pk/dsa/dsa_set.o \
9499 ltc/pk/dsa/dsa_set_pqg_dsaparam.o ltc/pk/dsa/dsa_shared_secret.o ltc/pk/dsa/dsa_sign_hash.o \
95100 ltc/pk/dsa/dsa_verify_hash.o ltc/pk/dsa/dsa_verify_key.o ltc/pk/ecc/ecc.o ltc/pk/ecc/ecc_ansi_x963_export.o \
96 ltc/pk/ecc/ecc_ansi_x963_import.o ltc/pk/ecc/ecc_decrypt_key.o ltc/pk/ecc/ecc_dp_clear.o \
97 ltc/pk/ecc/ecc_dp_fill_from_sets.o ltc/pk/ecc/ecc_dp_from_oid.o ltc/pk/ecc/ecc_dp_from_params.o \
98 ltc/pk/ecc/ecc_dp_init.o ltc/pk/ecc/ecc_dp_set.o ltc/pk/ecc/ecc_encrypt_key.o ltc/pk/ecc/ecc_export.o \
99 ltc/pk/ecc/ecc_export_full.o ltc/pk/ecc/ecc_export_raw.o ltc/pk/ecc/ecc_free.o ltc/pk/ecc/ecc_get_size.o \
100 ltc/pk/ecc/ecc_import.o ltc/pk/ecc/ecc_import_full.o ltc/pk/ecc/ecc_import_pkcs8.o \
101 ltc/pk/ecc/ecc_import_raw.o ltc/pk/ecc/ecc_make_key.o ltc/pk/ecc/ecc_shared_secret.o \
102 ltc/pk/ecc/ecc_sign_hash.o ltc/pk/ecc/ecc_sizes.o ltc/pk/ecc/ecc_verify_hash.o ltc/pk/ecc/ecc_verify_key.o \
103 ltc/pk/ecc/ltc_ecc_export_point.o ltc/pk/ecc/ltc_ecc_import_point.o ltc/pk/ecc/ltc_ecc_is_point.o \
104 ltc/pk/ecc/ltc_ecc_is_point_at_infinity.o ltc/pk/ecc/ltc_ecc_is_valid_idx.o ltc/pk/ecc/ltc_ecc_map.o \
101 ltc/pk/ecc/ecc_ansi_x963_import.o ltc/pk/ecc/ecc_decrypt_key.o ltc/pk/ecc/ecc_encrypt_key.o \
102 ltc/pk/ecc/ecc_export.o ltc/pk/ecc/ecc_export_openssl.o ltc/pk/ecc/ecc_free.o ltc/pk/ecc/ecc_get_key.o \
103 ltc/pk/ecc/ecc_get_set.o ltc/pk/ecc/ecc_get_size.o ltc/pk/ecc/ecc_import.o ltc/pk/ecc/ecc_import_openssl.o \
104 ltc/pk/ecc/ecc_import_pkcs8.o ltc/pk/ecc/ecc_import_x509.o ltc/pk/ecc/ecc_make_key.o \
105 ltc/pk/ecc/ecc_set_dp.o ltc/pk/ecc/ecc_set_dp_internal.o ltc/pk/ecc/ecc_set_key.o \
106 ltc/pk/ecc/ecc_shared_secret.o ltc/pk/ecc/ecc_sign_hash.o ltc/pk/ecc/ecc_sizes.o \
107 ltc/pk/ecc/ecc_verify_hash.o ltc/pk/ecc/ltc_ecc_export_point.o ltc/pk/ecc/ltc_ecc_import_point.o \
108 ltc/pk/ecc/ltc_ecc_is_point.o ltc/pk/ecc/ltc_ecc_is_point_at_infinity.o ltc/pk/ecc/ltc_ecc_map.o \
105109 ltc/pk/ecc/ltc_ecc_mul2add.o ltc/pk/ecc/ltc_ecc_mulmod.o ltc/pk/ecc/ltc_ecc_mulmod_timing.o \
106110 ltc/pk/ecc/ltc_ecc_points.o ltc/pk/ecc/ltc_ecc_projective_add_point.o ltc/pk/ecc/ltc_ecc_projective_dbl_point.o \
107 ltc/pk/pkcs1/pkcs_1_i2osp.o ltc/pk/pkcs1/pkcs_1_mgf1.o ltc/pk/pkcs1/pkcs_1_oaep_decode.o \
108 ltc/pk/pkcs1/pkcs_1_oaep_encode.o ltc/pk/pkcs1/pkcs_1_os2ip.o ltc/pk/pkcs1/pkcs_1_pss_decode.o \
109 ltc/pk/pkcs1/pkcs_1_pss_encode.o ltc/pk/pkcs1/pkcs_1_v1_5_decode.o ltc/pk/pkcs1/pkcs_1_v1_5_encode.o \
110 ltc/pk/rsa/rsa_decrypt_key.o ltc/pk/rsa/rsa_encrypt_key.o ltc/pk/rsa/rsa_export.o \
111 ltc/pk/rsa/rsa_exptmod.o ltc/pk/rsa/rsa_free.o ltc/pk/rsa/rsa_get_size.o ltc/pk/rsa/rsa_import.o \
112 ltc/pk/rsa/rsa_import_pkcs8.o ltc/pk/rsa/rsa_import_x509.o ltc/pk/rsa/rsa_make_key.o \
113 ltc/pk/rsa/rsa_set.o ltc/pk/rsa/rsa_sign_hash.o ltc/pk/rsa/rsa_sign_saltlen_get.o \
111 ltc/pk/ecc/ltc_ecc_verify_key.o ltc/pk/pkcs1/pkcs_1_i2osp.o ltc/pk/pkcs1/pkcs_1_mgf1.o \
112 ltc/pk/pkcs1/pkcs_1_oaep_decode.o ltc/pk/pkcs1/pkcs_1_oaep_encode.o ltc/pk/pkcs1/pkcs_1_os2ip.o \
113 ltc/pk/pkcs1/pkcs_1_pss_decode.o ltc/pk/pkcs1/pkcs_1_pss_encode.o ltc/pk/pkcs1/pkcs_1_v1_5_decode.o \
114 ltc/pk/pkcs1/pkcs_1_v1_5_encode.o ltc/pk/rsa/rsa_decrypt_key.o ltc/pk/rsa/rsa_encrypt_key.o \
115 ltc/pk/rsa/rsa_export.o ltc/pk/rsa/rsa_exptmod.o ltc/pk/rsa/rsa_free.o ltc/pk/rsa/rsa_get_size.o \
116 ltc/pk/rsa/rsa_import.o ltc/pk/rsa/rsa_import_pkcs8.o ltc/pk/rsa/rsa_import_x509.o \
117 ltc/pk/rsa/rsa_make_key.o ltc/pk/rsa/rsa_set.o ltc/pk/rsa/rsa_sign_hash.o ltc/pk/rsa/rsa_sign_saltlen_get.o \
114118 ltc/pk/rsa/rsa_verify_hash.o ltc/prngs/chacha20.o ltc/prngs/fortuna.o ltc/prngs/rc4.o \
115119 ltc/prngs/rng_get_bytes.o ltc/prngs/rng_make_prng.o ltc/prngs/sober128.o ltc/prngs/sprng.o \
116120 ltc/prngs/yarrow.o ltc/stream/chacha/chacha_crypt.o ltc/stream/chacha/chacha_done.o \
7272 ltc/pk/asn1/der/bit/der_encode_raw_bit_string.obj ltc/pk/asn1/der/bit/der_length_bit_string.obj \
7373 ltc/pk/asn1/der/boolean/der_decode_boolean.obj ltc/pk/asn1/der/boolean/der_encode_boolean.obj \
7474 ltc/pk/asn1/der/boolean/der_length_boolean.obj ltc/pk/asn1/der/choice/der_decode_choice.obj \
75 ltc/pk/asn1/der/custom_type/der_decode_custom_type.obj ltc/pk/asn1/der/custom_type/der_encode_custom_type.obj \
76 ltc/pk/asn1/der/custom_type/der_length_custom_type.obj ltc/pk/asn1/der/general/der_asn1_maps.obj \
77 ltc/pk/asn1/der/general/der_decode_asn1_identifier.obj ltc/pk/asn1/der/general/der_decode_asn1_length.obj \
78 ltc/pk/asn1/der/general/der_encode_asn1_identifier.obj ltc/pk/asn1/der/general/der_encode_asn1_length.obj \
79 ltc/pk/asn1/der/general/der_length_asn1_identifier.obj ltc/pk/asn1/der/general/der_length_asn1_length.obj \
7580 ltc/pk/asn1/der/generalizedtime/der_decode_generalizedtime.obj ltc/pk/asn1/der/generalizedtime/der_encode_generalizedtime.obj \
7681 ltc/pk/asn1/der/generalizedtime/der_length_generalizedtime.obj ltc/pk/asn1/der/ia5/der_decode_ia5_string.obj \
7782 ltc/pk/asn1/der/ia5/der_encode_ia5_string.obj ltc/pk/asn1/der/ia5/der_length_ia5_string.obj \
8287 ltc/pk/asn1/der/octet/der_length_octet_string.obj ltc/pk/asn1/der/printable_string/der_decode_printable_string.obj \
8388 ltc/pk/asn1/der/printable_string/der_encode_printable_string.obj ltc/pk/asn1/der/printable_string/der_length_printable_string.obj \
8489 ltc/pk/asn1/der/sequence/der_decode_sequence_ex.obj ltc/pk/asn1/der/sequence/der_decode_sequence_flexi.obj \
85 ltc/pk/asn1/der/sequence/der_decode_sequence_multi.obj ltc/pk/asn1/der/sequence/der_decode_subject_public_key_info.obj \
86 ltc/pk/asn1/der/sequence/der_encode_sequence_ex.obj ltc/pk/asn1/der/sequence/der_encode_sequence_multi.obj \
87 ltc/pk/asn1/der/sequence/der_encode_subject_public_key_info.obj ltc/pk/asn1/der/sequence/der_length_sequence.obj \
90 ltc/pk/asn1/der/sequence/der_decode_sequence_multi.obj ltc/pk/asn1/der/sequence/der_encode_sequence_ex.obj \
91 ltc/pk/asn1/der/sequence/der_encode_sequence_multi.obj ltc/pk/asn1/der/sequence/der_length_sequence.obj \
8892 ltc/pk/asn1/der/sequence/der_sequence_free.obj ltc/pk/asn1/der/sequence/der_sequence_shrink.obj \
8993 ltc/pk/asn1/der/set/der_encode_set.obj ltc/pk/asn1/der/set/der_encode_setof.obj ltc/pk/asn1/der/short_integer/der_decode_short_integer.obj \
9094 ltc/pk/asn1/der/short_integer/der_encode_short_integer.obj ltc/pk/asn1/der/short_integer/der_length_short_integer.obj \
9296 ltc/pk/asn1/der/utctime/der_decode_utctime.obj ltc/pk/asn1/der/utctime/der_encode_utctime.obj \
9397 ltc/pk/asn1/der/utctime/der_length_utctime.obj ltc/pk/asn1/der/utf8/der_decode_utf8_string.obj \
9498 ltc/pk/asn1/der/utf8/der_encode_utf8_string.obj ltc/pk/asn1/der/utf8/der_length_utf8_string.obj \
99 ltc/pk/asn1/x509/x509_decode_subject_public_key_info.obj ltc/pk/asn1/x509/x509_encode_subject_public_key_info.obj \
95100 ltc/pk/dh/dh.obj ltc/pk/dh/dh_check_pubkey.obj ltc/pk/dh/dh_export.obj ltc/pk/dh/dh_export_key.obj \
96101 ltc/pk/dh/dh_free.obj ltc/pk/dh/dh_generate_key.obj ltc/pk/dh/dh_import.obj ltc/pk/dh/dh_set.obj \
97102 ltc/pk/dh/dh_set_pg_dhparam.obj ltc/pk/dh/dh_shared_secret.obj ltc/pk/dsa/dsa_decrypt_key.obj \
100105 ltc/pk/dsa/dsa_make_key.obj ltc/pk/dsa/dsa_set.obj ltc/pk/dsa/dsa_set_pqg_dsaparam.obj \
101106 ltc/pk/dsa/dsa_shared_secret.obj ltc/pk/dsa/dsa_sign_hash.obj ltc/pk/dsa/dsa_verify_hash.obj \
102107 ltc/pk/dsa/dsa_verify_key.obj ltc/pk/ecc/ecc.obj ltc/pk/ecc/ecc_ansi_x963_export.obj \
103 ltc/pk/ecc/ecc_ansi_x963_import.obj ltc/pk/ecc/ecc_decrypt_key.obj ltc/pk/ecc/ecc_dp_clear.obj \
104 ltc/pk/ecc/ecc_dp_fill_from_sets.obj ltc/pk/ecc/ecc_dp_from_oid.obj ltc/pk/ecc/ecc_dp_from_params.obj \
105 ltc/pk/ecc/ecc_dp_init.obj ltc/pk/ecc/ecc_dp_set.obj ltc/pk/ecc/ecc_encrypt_key.obj \
106 ltc/pk/ecc/ecc_export.obj ltc/pk/ecc/ecc_export_full.obj ltc/pk/ecc/ecc_export_raw.obj \
107 ltc/pk/ecc/ecc_free.obj ltc/pk/ecc/ecc_get_size.obj ltc/pk/ecc/ecc_import.obj ltc/pk/ecc/ecc_import_full.obj \
108 ltc/pk/ecc/ecc_import_pkcs8.obj ltc/pk/ecc/ecc_import_raw.obj ltc/pk/ecc/ecc_make_key.obj \
109 ltc/pk/ecc/ecc_shared_secret.obj ltc/pk/ecc/ecc_sign_hash.obj ltc/pk/ecc/ecc_sizes.obj \
110 ltc/pk/ecc/ecc_verify_hash.obj ltc/pk/ecc/ecc_verify_key.obj ltc/pk/ecc/ltc_ecc_export_point.obj \
111 ltc/pk/ecc/ltc_ecc_import_point.obj ltc/pk/ecc/ltc_ecc_is_point.obj ltc/pk/ecc/ltc_ecc_is_point_at_infinity.obj \
112 ltc/pk/ecc/ltc_ecc_is_valid_idx.obj ltc/pk/ecc/ltc_ecc_map.obj ltc/pk/ecc/ltc_ecc_mul2add.obj \
108 ltc/pk/ecc/ecc_ansi_x963_import.obj ltc/pk/ecc/ecc_decrypt_key.obj ltc/pk/ecc/ecc_encrypt_key.obj \
109 ltc/pk/ecc/ecc_export.obj ltc/pk/ecc/ecc_export_openssl.obj ltc/pk/ecc/ecc_free.obj \
110 ltc/pk/ecc/ecc_get_key.obj ltc/pk/ecc/ecc_get_set.obj ltc/pk/ecc/ecc_get_size.obj \
111 ltc/pk/ecc/ecc_import.obj ltc/pk/ecc/ecc_import_openssl.obj ltc/pk/ecc/ecc_import_pkcs8.obj \
112 ltc/pk/ecc/ecc_import_x509.obj ltc/pk/ecc/ecc_make_key.obj ltc/pk/ecc/ecc_set_dp.obj \
113 ltc/pk/ecc/ecc_set_dp_internal.obj ltc/pk/ecc/ecc_set_key.obj ltc/pk/ecc/ecc_shared_secret.obj \
114 ltc/pk/ecc/ecc_sign_hash.obj ltc/pk/ecc/ecc_sizes.obj ltc/pk/ecc/ecc_verify_hash.obj \
115 ltc/pk/ecc/ltc_ecc_export_point.obj ltc/pk/ecc/ltc_ecc_import_point.obj ltc/pk/ecc/ltc_ecc_is_point.obj \
116 ltc/pk/ecc/ltc_ecc_is_point_at_infinity.obj ltc/pk/ecc/ltc_ecc_map.obj ltc/pk/ecc/ltc_ecc_mul2add.obj \
113117 ltc/pk/ecc/ltc_ecc_mulmod.obj ltc/pk/ecc/ltc_ecc_mulmod_timing.obj ltc/pk/ecc/ltc_ecc_points.obj \
114118 ltc/pk/ecc/ltc_ecc_projective_add_point.obj ltc/pk/ecc/ltc_ecc_projective_dbl_point.obj \
115 ltc/pk/pkcs1/pkcs_1_i2osp.obj ltc/pk/pkcs1/pkcs_1_mgf1.obj ltc/pk/pkcs1/pkcs_1_oaep_decode.obj \
116 ltc/pk/pkcs1/pkcs_1_oaep_encode.obj ltc/pk/pkcs1/pkcs_1_os2ip.obj ltc/pk/pkcs1/pkcs_1_pss_decode.obj \
117 ltc/pk/pkcs1/pkcs_1_pss_encode.obj ltc/pk/pkcs1/pkcs_1_v1_5_decode.obj ltc/pk/pkcs1/pkcs_1_v1_5_encode.obj \
118 ltc/pk/rsa/rsa_decrypt_key.obj ltc/pk/rsa/rsa_encrypt_key.obj ltc/pk/rsa/rsa_export.obj \
119 ltc/pk/rsa/rsa_exptmod.obj ltc/pk/rsa/rsa_free.obj ltc/pk/rsa/rsa_get_size.obj ltc/pk/rsa/rsa_import.obj \
120 ltc/pk/rsa/rsa_import_pkcs8.obj ltc/pk/rsa/rsa_import_x509.obj ltc/pk/rsa/rsa_make_key.obj \
121 ltc/pk/rsa/rsa_set.obj ltc/pk/rsa/rsa_sign_hash.obj ltc/pk/rsa/rsa_sign_saltlen_get.obj \
119 ltc/pk/ecc/ltc_ecc_verify_key.obj ltc/pk/pkcs1/pkcs_1_i2osp.obj ltc/pk/pkcs1/pkcs_1_mgf1.obj \
120 ltc/pk/pkcs1/pkcs_1_oaep_decode.obj ltc/pk/pkcs1/pkcs_1_oaep_encode.obj ltc/pk/pkcs1/pkcs_1_os2ip.obj \
121 ltc/pk/pkcs1/pkcs_1_pss_decode.obj ltc/pk/pkcs1/pkcs_1_pss_encode.obj ltc/pk/pkcs1/pkcs_1_v1_5_decode.obj \
122 ltc/pk/pkcs1/pkcs_1_v1_5_encode.obj ltc/pk/rsa/rsa_decrypt_key.obj ltc/pk/rsa/rsa_encrypt_key.obj \
123 ltc/pk/rsa/rsa_export.obj ltc/pk/rsa/rsa_exptmod.obj ltc/pk/rsa/rsa_free.obj ltc/pk/rsa/rsa_get_size.obj \
124 ltc/pk/rsa/rsa_import.obj ltc/pk/rsa/rsa_import_pkcs8.obj ltc/pk/rsa/rsa_import_x509.obj \
125 ltc/pk/rsa/rsa_make_key.obj ltc/pk/rsa/rsa_set.obj ltc/pk/rsa/rsa_sign_hash.obj ltc/pk/rsa/rsa_sign_saltlen_get.obj \
122126 ltc/pk/rsa/rsa_verify_hash.obj ltc/prngs/chacha20.obj ltc/prngs/fortuna.obj ltc/prngs/rc4.obj \
123127 ltc/prngs/rng_get_bytes.obj ltc/prngs/rng_make_prng.obj ltc/prngs/sober128.obj ltc/prngs/sprng.obj \
124128 ltc/prngs/yarrow.obj ltc/stream/chacha/chacha_crypt.obj ltc/stream/chacha/chacha_done.obj \
7171 &sha3_512_test,
7272 NULL
7373 };
74 #endif
75
76 #ifdef LTC_KECCAK
77 const struct ltc_hash_descriptor keccak_224_desc =
78 {
79 "keccak224", /* name of hash */
80 29, /* internal ID */
81 28, /* Size of digest in octets */
82 144, /* Input block size in octets */
83 { 0 }, 0, /* no ASN.1 OID */
84 &sha3_224_init,
85 &sha3_process,
86 &keccak_done,
87 &keccak_224_test,
88 NULL
89 };
90
91 const struct ltc_hash_descriptor keccak_256_desc =
92 {
93 "keccak256", /* name of hash */
94 30, /* internal ID */
95 32, /* Size of digest in octets */
96 136, /* Input block size in octets */
97 { 0 }, 0, /* no ASN.1 OID */
98 &sha3_256_init,
99 &sha3_process,
100 &keccak_done,
101 &keccak_256_test,
102 NULL
103 };
104
105 const struct ltc_hash_descriptor keccak_384_desc =
106 {
107 "keccak384", /* name of hash */
108 31, /* internal ID */
109 48, /* Size of digest in octets */
110 104, /* Input block size in octets */
111 { 0 }, 0, /* no ASN.1 OID */
112 &sha3_384_init,
113 &sha3_process,
114 &keccak_done,
115 &keccak_384_test,
116 NULL
117 };
118
119 const struct ltc_hash_descriptor keccak_512_desc =
120 {
121 "keccak512", /* name of hash */
122 32, /* internal ID */
123 64, /* Size of digest in octets */
124 72, /* Input block size in octets */
125 { 0 }, 0, /* no ASN.1 OID */
126 &sha3_512_init,
127 &sha3_process,
128 &keccak_done,
129 &keccak_512_test,
130 NULL
131 };
132 #endif
133
134 #if defined(LTC_SHA3) || defined(LTC_KECCAK)
74135
75136 #define SHA3_KECCAK_SPONGE_WORDS 25 /* 1600 bits > 200 bytes > 25 x ulong64 */
76137 #define SHA3_KECCAK_ROUNDS 24
133194 }
134195 }
135196
197 static LTC_INLINE int _done(hash_state *md, unsigned char *hash, ulong64 pad)
198 {
199 unsigned i;
200
201 LTC_ARGCHK(md != NULL);
202 LTC_ARGCHK(hash != NULL);
203
204 md->sha3.s[md->sha3.word_index] ^= (md->sha3.saved ^ (pad << (md->sha3.byte_index * 8)));
205 md->sha3.s[SHA3_KECCAK_SPONGE_WORDS - md->sha3.capacity_words - 1] ^= CONST64(0x8000000000000000);
206 keccakf(md->sha3.s);
207
208 /* store sha3.s[] as little-endian bytes into sha3.sb */
209 for(i = 0; i < SHA3_KECCAK_SPONGE_WORDS; i++) {
210 STORE64L(md->sha3.s[i], md->sha3.sb + i * 8);
211 }
212
213 XMEMCPY(hash, md->sha3.sb, md->sha3.capacity_words * 4);
214 return CRYPT_OK;
215 }
216
136217 /* Public Inteface */
137218
138219 int sha3_224_init(hash_state *md)
167248 return CRYPT_OK;
168249 }
169250
251 #ifdef LTC_SHA3
170252 int sha3_shake_init(hash_state *md, int num)
171253 {
172254 LTC_ARGCHK(md != NULL);
175257 md->sha3.capacity_words = (unsigned short)(2 * num / (8 * sizeof(ulong64)));
176258 return CRYPT_OK;
177259 }
260 #endif
178261
179262 int sha3_process(hash_state *md, const unsigned char *in, unsigned long inlen)
180263 {
228311 return CRYPT_OK;
229312 }
230313
314 #ifdef LTC_SHA3
231315 int sha3_done(hash_state *md, unsigned char *hash)
232316 {
233 unsigned i;
234
235 LTC_ARGCHK(md != NULL);
236 LTC_ARGCHK(hash != NULL);
237
238 md->sha3.s[md->sha3.word_index] ^= (md->sha3.saved ^ (CONST64(0x06) << (md->sha3.byte_index * 8)));
239 md->sha3.s[SHA3_KECCAK_SPONGE_WORDS - md->sha3.capacity_words - 1] ^= CONST64(0x8000000000000000);
240 keccakf(md->sha3.s);
241
242 /* store sha3.s[] as little-endian bytes into sha3.sb */
243 for(i = 0; i < SHA3_KECCAK_SPONGE_WORDS; i++) {
244 STORE64L(md->sha3.s[i], md->sha3.sb + i * 8);
245 }
246
247 XMEMCPY(hash, md->sha3.sb, md->sha3.capacity_words * 4);
248 return CRYPT_OK;
249 }
250
317 return _done(md, hash, CONST64(0x06));
318 }
319 #endif
320
321 #ifdef LTC_KECCAK
322 int keccak_done(hash_state *md, unsigned char *hash)
323 {
324 return _done(md, hash, CONST64(0x01));
325 }
326 #endif
327
328 #ifdef LTC_SHA3
251329 int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen)
252330 {
253331 /* IMPORTANT NOTE: sha3_shake_done can be called many times */
297375 if ((err = sha3_shake_done(&md, out, *outlen)) != CRYPT_OK) return err;
298376 return CRYPT_OK;
299377 }
378 #endif
300379
301380 #endif
302381
395395
396396 #endif
397397
398 #ifdef LTC_KECCAK
399
400 int keccak_224_test(void)
401 {
402 #ifndef LTC_TEST
403 return CRYPT_NOP;
404 #else
405 hash_state c;
406 unsigned char hash[MAXBLOCKSIZE];
407
408 keccak_224_init(&c);
409 keccak_process(&c, (unsigned char*) "\xcc", 1);
410 keccak_done(&c, hash);
411 if(compare_testvector(hash, 28,
412 "\xa9\xca\xb5\x9e\xb4\x0a\x10\xb2"
413 "\x46\x29\x0f\x2d\x60\x86\xe3\x2e"
414 "\x36\x89\xfa\xf1\xd2\x6b\x47\x0c"
415 "\x89\x9f\x28\x02", 28,
416 "KECCAK-224", 0) != 0) {
417 return CRYPT_FAIL_TESTVECTOR;
418 }
419
420 keccak_224_init(&c);
421 keccak_process(&c, (unsigned char*)"\x41\xfb", 2);
422 keccak_done(&c, hash);
423 if(compare_testvector(hash, 28,
424 "\x61\x5b\xa3\x67\xaf\xdc\x35\xaa"
425 "\xc3\x97\xbc\x7e\xb5\xd5\x8d\x10"
426 "\x6a\x73\x4b\x24\x98\x6d\x5d\x97"
427 "\x8f\xef\xd6\x2c", 28,
428 "KECCAK-224", 1) != 0) {
429 return CRYPT_FAIL_TESTVECTOR;
430 }
431
432 keccak_224_init(&c);
433 keccak_process(&c, (unsigned char*)
434 "\x52\xa6\x08\xab\x21\xcc\xdd\x8a"
435 "\x44\x57\xa5\x7e\xde\x78\x21\x76", 16);
436 keccak_done(&c, hash);
437 if(compare_testvector(hash, 28,
438 "\x56\x79\xcd\x50\x9c\x51\x20\xaf"
439 "\x54\x79\x5c\xf4\x77\x14\x96\x41"
440 "\xcf\x27\xb2\xeb\xb6\xa5\xf9\x03"
441 "\x40\x70\x4e\x57", 28,
442 "KECCAK-224", 2) != 0) {
443 return CRYPT_FAIL_TESTVECTOR;
444 }
445
446 keccak_224_init(&c);
447 keccak_process(&c, (unsigned char*)
448 "\x43\x3c\x53\x03\x13\x16\x24\xc0"
449 "\x02\x1d\x86\x8a\x30\x82\x54\x75"
450 "\xe8\xd0\xbd\x30\x52\xa0\x22\x18"
451 "\x03\x98\xf4\xca\x44\x23\xb9\x82"
452 "\x14\xb6\xbe\xaa\xc2\x1c\x88\x07"
453 "\xa2\xc3\x3f\x8c\x93\xbd\x42\xb0"
454 "\x92\xcc\x1b\x06\xce\xdf\x32\x24"
455 "\xd5\xed\x1e\xc2\x97\x84\x44\x4f"
456 "\x22\xe0\x8a\x55\xaa\x58\x54\x2b"
457 "\x52\x4b\x02\xcd\x3d\x5d\x5f\x69"
458 "\x07\xaf\xe7\x1c\x5d\x74\x62\x22"
459 "\x4a\x3f\x9d\x9e\x53\xe7\xe0\x84"
460 "\x6d\xcb\xb4\xce", 100);
461 keccak_done(&c, hash);
462 if(compare_testvector(hash, 28,
463 "\x62\xb1\x0f\x1b\x62\x36\xeb\xc2"
464 "\xda\x72\x95\x77\x42\xa8\xd4\xe4"
465 "\x8e\x21\x3b\x5f\x89\x34\x60\x4b"
466 "\xfd\x4d\x2c\x3a", 28,
467 "KECCAK-224", 3) != 0) {
468 return CRYPT_FAIL_TESTVECTOR;
469 }
470
471 return CRYPT_OK;
472 #endif
473 }
474
475 int keccak_256_test(void)
476 {
477 #ifndef LTC_TEST
478 return CRYPT_NOP;
479 #else
480 hash_state c;
481 unsigned char hash[MAXBLOCKSIZE];
482
483 keccak_256_init(&c);
484 keccak_process(&c, (unsigned char*) "\xcc", 1);
485 keccak_done(&c, hash);
486 if(compare_testvector(hash, 32,
487 "\xee\xad\x6d\xbf\xc7\x34\x0a\x56"
488 "\xca\xed\xc0\x44\x69\x6a\x16\x88"
489 "\x70\x54\x9a\x6a\x7f\x6f\x56\x96"
490 "\x1e\x84\xa5\x4b\xd9\x97\x0b\x8a", 32,
491 "KECCAK-256", 0) != 0) {
492 return CRYPT_FAIL_TESTVECTOR;
493 }
494
495 keccak_256_init(&c);
496 keccak_process(&c, (unsigned char*)"\x41\xfb", 2);
497 keccak_done(&c, hash);
498 if(compare_testvector(hash, 32,
499 "\xa8\xea\xce\xda\x4d\x47\xb3\x28"
500 "\x1a\x79\x5a\xd9\xe1\xea\x21\x22"
501 "\xb4\x07\xba\xf9\xaa\xbc\xb9\xe1"
502 "\x8b\x57\x17\xb7\x87\x35\x37\xd2", 32,
503 "KECCAK-256", 1) != 0) {
504 return CRYPT_FAIL_TESTVECTOR;
505 }
506
507 keccak_256_init(&c);
508 keccak_process(&c, (unsigned char*)
509 "\x52\xa6\x08\xab\x21\xcc\xdd\x8a"
510 "\x44\x57\xa5\x7e\xde\x78\x21\x76", 16);
511 keccak_done(&c, hash);
512 if(compare_testvector(hash, 32,
513 "\x0e\x32\xde\xfa\x20\x71\xf0\xb5"
514 "\xac\x0e\x6a\x10\x8b\x84\x2e\xd0"
515 "\xf1\xd3\x24\x97\x12\xf5\x8e\xe0"
516 "\xdd\xf9\x56\xfe\x33\x2a\x5f\x95", 32,
517 "KECCAK-256", 2) != 0) {
518 return CRYPT_FAIL_TESTVECTOR;
519 }
520
521 keccak_256_init(&c);
522 keccak_process(&c, (unsigned char*)
523 "\x43\x3c\x53\x03\x13\x16\x24\xc0"
524 "\x02\x1d\x86\x8a\x30\x82\x54\x75"
525 "\xe8\xd0\xbd\x30\x52\xa0\x22\x18"
526 "\x03\x98\xf4\xca\x44\x23\xb9\x82"
527 "\x14\xb6\xbe\xaa\xc2\x1c\x88\x07"
528 "\xa2\xc3\x3f\x8c\x93\xbd\x42\xb0"
529 "\x92\xcc\x1b\x06\xce\xdf\x32\x24"
530 "\xd5\xed\x1e\xc2\x97\x84\x44\x4f"
531 "\x22\xe0\x8a\x55\xaa\x58\x54\x2b"
532 "\x52\x4b\x02\xcd\x3d\x5d\x5f\x69"
533 "\x07\xaf\xe7\x1c\x5d\x74\x62\x22"
534 "\x4a\x3f\x9d\x9e\x53\xe7\xe0\x84"
535 "\x6d\xcb\xb4\xce", 100);
536 keccak_done(&c, hash);
537 if(compare_testvector(hash, 32,
538 "\xce\x87\xa5\x17\x3b\xff\xd9\x23"
539 "\x99\x22\x16\x58\xf8\x01\xd4\x5c"
540 "\x29\x4d\x90\x06\xee\x9f\x3f\x9d"
541 "\x41\x9c\x8d\x42\x77\x48\xdc\x41", 32,
542 "KECCAK-256", 3) != 0) {
543 return CRYPT_FAIL_TESTVECTOR;
544 }
545
546 return CRYPT_OK;
547 #endif
548 }
549
550 int keccak_384_test(void)
551 {
552 #ifndef LTC_TEST
553 return CRYPT_NOP;
554 #else
555 hash_state c;
556 unsigned char hash[MAXBLOCKSIZE];
557
558 keccak_384_init(&c);
559 keccak_process(&c, (unsigned char*) "\xcc", 1);
560 keccak_done(&c, hash);
561 if(compare_testvector(hash, 48,
562 "\x1b\x84\xe6\x2a\x46\xe5\xa2\x01"
563 "\x86\x17\x54\xaf\x5d\xc9\x5c\x4a"
564 "\x1a\x69\xca\xf4\xa7\x96\xae\x40"
565 "\x56\x80\x16\x1e\x29\x57\x26\x41"
566 "\xf5\xfa\x1e\x86\x41\xd7\x95\x83"
567 "\x36\xee\x7b\x11\xc5\x8f\x73\xe9", 48,
568 "KECCAK-384", 0) != 0) {
569 return CRYPT_FAIL_TESTVECTOR;
570 }
571
572 keccak_384_init(&c);
573 keccak_process(&c, (unsigned char*)"\x41\xfb", 2);
574 keccak_done(&c, hash);
575 if(compare_testvector(hash, 48,
576 "\x49\x5c\xce\x27\x14\xcd\x72\xc8"
577 "\xc5\x3c\x33\x63\xd2\x2c\x58\xb5"
578 "\x59\x60\xfe\x26\xbe\x0b\xf3\xbb"
579 "\xc7\xa3\x31\x6d\xd5\x63\xad\x1d"
580 "\xb8\x41\x0e\x75\xee\xfe\xa6\x55"
581 "\xe3\x9d\x46\x70\xec\x0b\x17\x92", 48,
582 "KECCAK-384", 1) != 0) {
583 return CRYPT_FAIL_TESTVECTOR;
584 }
585
586 keccak_384_init(&c);
587 keccak_process(&c, (unsigned char*)
588 "\x52\xa6\x08\xab\x21\xcc\xdd\x8a"
589 "\x44\x57\xa5\x7e\xde\x78\x21\x76", 16);
590 keccak_done(&c, hash);
591 if(compare_testvector(hash, 48,
592 "\x18\x42\x2a\xc1\xd3\xa1\xe5\x4b"
593 "\xad\x87\x68\x83\xd2\xd6\xdd\x65"
594 "\xf6\x5c\x1d\x5f\x33\xa7\x12\x5c"
595 "\xc4\xc1\x86\x40\x5a\x12\xed\x64"
596 "\xba\x96\x67\x2e\xed\xda\x8c\x5a"
597 "\x63\x31\xd2\x86\x83\xf4\x88\xeb", 48,
598 "KECCAK-384", 2) != 0) {
599 return CRYPT_FAIL_TESTVECTOR;
600 }
601
602 keccak_384_init(&c);
603 keccak_process(&c, (unsigned char*)
604 "\x43\x3c\x53\x03\x13\x16\x24\xc0"
605 "\x02\x1d\x86\x8a\x30\x82\x54\x75"
606 "\xe8\xd0\xbd\x30\x52\xa0\x22\x18"
607 "\x03\x98\xf4\xca\x44\x23\xb9\x82"
608 "\x14\xb6\xbe\xaa\xc2\x1c\x88\x07"
609 "\xa2\xc3\x3f\x8c\x93\xbd\x42\xb0"
610 "\x92\xcc\x1b\x06\xce\xdf\x32\x24"
611 "\xd5\xed\x1e\xc2\x97\x84\x44\x4f"
612 "\x22\xe0\x8a\x55\xaa\x58\x54\x2b"
613 "\x52\x4b\x02\xcd\x3d\x5d\x5f\x69"
614 "\x07\xaf\xe7\x1c\x5d\x74\x62\x22"
615 "\x4a\x3f\x9d\x9e\x53\xe7\xe0\x84"
616 "\x6d\xcb\xb4\xce", 100);
617 keccak_done(&c, hash);
618 if(compare_testvector(hash, 48,
619 "\x13\x51\x14\x50\x8d\xd6\x3e\x27"
620 "\x9e\x70\x9c\x26\xf7\x81\x7c\x04"
621 "\x82\x76\x6c\xde\x49\x13\x2e\x3e"
622 "\xdf\x2e\xed\xd8\x99\x6f\x4e\x35"
623 "\x96\xd1\x84\x10\x0b\x38\x48\x68"
624 "\x24\x9f\x1d\x8b\x8f\xda\xa2\xc9", 48,
625 "KECCAK-384", 3) != 0) {
626 return CRYPT_FAIL_TESTVECTOR;
627 }
628
629 return CRYPT_OK;
630 #endif
631 }
632
633 int keccak_512_test(void)
634 {
635 #ifndef LTC_TEST
636 return CRYPT_NOP;
637 #else
638 hash_state c;
639 unsigned char hash[MAXBLOCKSIZE];
640
641 keccak_512_init(&c);
642 keccak_process(&c, (unsigned char*) "\xcc", 1);
643 keccak_done(&c, hash);
644 if(compare_testvector(hash, 64,
645 "\x86\x30\xc1\x3c\xbd\x06\x6e\xa7"
646 "\x4b\xbe\x7f\xe4\x68\xfe\xc1\xde"
647 "\xe1\x0e\xdc\x12\x54\xfb\x4c\x1b"
648 "\x7c\x5f\xd6\x9b\x64\x6e\x44\x16"
649 "\x0b\x8c\xe0\x1d\x05\xa0\x90\x8c"
650 "\xa7\x90\xdf\xb0\x80\xf4\xb5\x13"
651 "\xbc\x3b\x62\x25\xec\xe7\xa8\x10"
652 "\x37\x14\x41\xa5\xac\x66\x6e\xb9", 64,
653 "KECCAK-512", 0) != 0) {
654 return CRYPT_FAIL_TESTVECTOR;
655 }
656
657 keccak_512_init(&c);
658 keccak_process(&c, (unsigned char*)"\x41\xfb", 2);
659 keccak_done(&c, hash);
660 if(compare_testvector(hash, 64,
661 "\x55\x1d\xa6\x23\x6f\x8b\x96\xfc"
662 "\xe9\xf9\x7f\x11\x90\xe9\x01\x32"
663 "\x4f\x0b\x45\xe0\x6d\xbb\xb5\xcd"
664 "\xb8\x35\x5d\x6e\xd1\xdc\x34\xb3"
665 "\xf0\xea\xe7\xdc\xb6\x86\x22\xff"
666 "\x23\x2f\xa3\xce\xce\x0d\x46\x16"
667 "\xcd\xeb\x39\x31\xf9\x38\x03\x66"
668 "\x2a\x28\xdf\x1c\xd5\x35\xb7\x31", 64,
669 "KECCAK-512", 1) != 0) {
670 return CRYPT_FAIL_TESTVECTOR;
671 }
672
673 keccak_512_init(&c);
674 keccak_process(&c, (unsigned char*)
675 "\x52\xa6\x08\xab\x21\xcc\xdd\x8a"
676 "\x44\x57\xa5\x7e\xde\x78\x21\x76", 16);
677 keccak_done(&c, hash);
678 if(compare_testvector(hash, 64,
679 "\x4b\x39\xd3\xda\x5b\xcd\xf4\xd9"
680 "\xb7\x69\x01\x59\x95\x64\x43\x11"
681 "\xc1\x4c\x43\x5b\xf7\x2b\x10\x09"
682 "\xd6\xdd\x71\xb0\x1a\x63\xb9\x7c"
683 "\xfb\x59\x64\x18\xe8\xe4\x23\x42"
684 "\xd1\x17\xe0\x74\x71\xa8\x91\x43"
685 "\x14\xba\x7b\x0e\x26\x4d\xad\xf0"
686 "\xce\xa3\x81\x86\x8c\xbd\x43\xd1", 64,
687 "KECCAK-512", 2) != 0) {
688 return CRYPT_FAIL_TESTVECTOR;
689 }
690
691 keccak_512_init(&c);
692 keccak_process(&c, (unsigned char*)
693 "\x43\x3c\x53\x03\x13\x16\x24\xc0"
694 "\x02\x1d\x86\x8a\x30\x82\x54\x75"
695 "\xe8\xd0\xbd\x30\x52\xa0\x22\x18"
696 "\x03\x98\xf4\xca\x44\x23\xb9\x82"
697 "\x14\xb6\xbe\xaa\xc2\x1c\x88\x07"
698 "\xa2\xc3\x3f\x8c\x93\xbd\x42\xb0"
699 "\x92\xcc\x1b\x06\xce\xdf\x32\x24"
700 "\xd5\xed\x1e\xc2\x97\x84\x44\x4f"
701 "\x22\xe0\x8a\x55\xaa\x58\x54\x2b"
702 "\x52\x4b\x02\xcd\x3d\x5d\x5f\x69"
703 "\x07\xaf\xe7\x1c\x5d\x74\x62\x22"
704 "\x4a\x3f\x9d\x9e\x53\xe7\xe0\x84"
705 "\x6d\xcb\xb4\xce", 100);
706 keccak_done(&c, hash);
707 if(compare_testvector(hash, 64,
708 "\x52\x7d\x28\xe3\x41\xe6\xb1\x4f"
709 "\x46\x84\xad\xb4\xb8\x24\xc4\x96"
710 "\xc6\x48\x2e\x51\x14\x95\x65\xd3"
711 "\xd1\x72\x26\x82\x88\x84\x30\x6b"
712 "\x51\xd6\x14\x8a\x72\x62\x2c\x2b"
713 "\x75\xf5\xd3\x51\x0b\x79\x9d\x8b"
714 "\xdc\x03\xea\xed\xe4\x53\x67\x6a"
715 "\x6e\xc8\xfe\x03\xa1\xad\x0e\xab", 64,
716 "KECCAK-512", 3) != 0) {
717 return CRYPT_FAIL_TESTVECTOR;
718 }
719
720 return CRYPT_OK;
721 #endif
722 }
723
724 #endif
725
398726 /* ref: $Format:%D$ */
399727 /* git commit: $Format:%H$ */
400728 /* commit time: $Format:%ai$ */
2626
2727 /* version */
2828 #define CRYPT 0x0118
29 #define SCRYPT "1.18.0"
29 #define SCRYPT "1.18.1-develop"
3030
3131 /* max size of either a cipher/hash block or symmetric key [largest of the two] */
3232 #define MAXBLOCKSIZE 144
3333
3434 /* descriptor table size */
35 #define TAB_SIZE 32
35 #define TAB_SIZE 34
3636
3737 /* error codes [will be expanded in future releases] */
3838 enum {
6666
6767 CRYPT_OVERFLOW, /* An overflow of a value was detected/prevented */
6868
69 CRYPT_UNUSED1, /* UNUSED1 */
69 CRYPT_PK_ASN1_ERROR, /* An error occurred while en- or decoding ASN.1 data */
7070
7171 CRYPT_INPUT_TOO_LONG, /* The input was longer than expected. */
7272
247247 #define LTC_CHC_HASH
248248 #define LTC_WHIRLPOOL
249249 #define LTC_SHA3
250 #define LTC_KECCAK
250251 #define LTC_SHA512
251252 #define LTC_SHA512_256
252253 #define LTC_SHA512_224
467468 #ifdef LTC_MECC
468469 /* Supported ECC Key Sizes */
469470 #ifndef LTC_NO_CURVES
471 #define LTC_ECC_BRAINPOOLP160R1
472 #define LTC_ECC_BRAINPOOLP160T1
473 #define LTC_ECC_BRAINPOOLP192R1
474 #define LTC_ECC_BRAINPOOLP192T1
475 #define LTC_ECC_BRAINPOOLP224R1
476 #define LTC_ECC_BRAINPOOLP224T1
477 #define LTC_ECC_BRAINPOOLP256R1
478 #define LTC_ECC_BRAINPOOLP256T1
479 #define LTC_ECC_BRAINPOOLP320R1
480 #define LTC_ECC_BRAINPOOLP320T1
481 #define LTC_ECC_BRAINPOOLP384R1
482 #define LTC_ECC_BRAINPOOLP384T1
483 #define LTC_ECC_BRAINPOOLP512R1
484 #define LTC_ECC_BRAINPOOLP512T1
485 #define LTC_ECC_PRIME192V2
486 #define LTC_ECC_PRIME192V3
487 #define LTC_ECC_PRIME239V1
488 #define LTC_ECC_PRIME239V2
489 #define LTC_ECC_PRIME239V3
470490 #define LTC_ECC_SECP112R1
471491 #define LTC_ECC_SECP112R2
472492 #define LTC_ECC_SECP128R1
473493 #define LTC_ECC_SECP128R2
494 #define LTC_ECC_SECP160K1
474495 #define LTC_ECC_SECP160R1
475496 #define LTC_ECC_SECP160R2
476 #define LTC_ECC_SECP160K1
477 #define LTC_ECC_BRAINPOOLP160R1
497 #define LTC_ECC_SECP192K1
478498 #define LTC_ECC_SECP192R1
479 #define LTC_ECC_PRIME192V2
480 #define LTC_ECC_PRIME192V3
481 #define LTC_ECC_SECP192K1
482 #define LTC_ECC_BRAINPOOLP192R1
499 #define LTC_ECC_SECP224K1
483500 #define LTC_ECC_SECP224R1
484 #define LTC_ECC_SECP224K1
485 #define LTC_ECC_BRAINPOOLP224R1
486 #define LTC_ECC_PRIME239V1
487 #define LTC_ECC_PRIME239V2
488 #define LTC_ECC_PRIME239V3
501 #define LTC_ECC_SECP256K1
489502 #define LTC_ECC_SECP256R1
490 #define LTC_ECC_SECP256K1
491 #define LTC_ECC_BRAINPOOLP256R1
492 #define LTC_ECC_BRAINPOOLP320R1
493503 #define LTC_ECC_SECP384R1
494 #define LTC_ECC_BRAINPOOLP384R1
495 #define LTC_ECC_BRAINPOOLP512R1
496504 #define LTC_ECC_SECP521R1
497505 /* OLD deprecated (but still working) defines */
498506 #define LTC_ECC112
77 */
88
99 /* ---- HASH FUNCTIONS ---- */
10 #ifdef LTC_SHA3
10 #if defined(LTC_SHA3) || defined(LTC_KECCAK)
1111 struct sha3_state {
1212 ulong64 saved; /* the portion of the input message that we didn't consume yet */
1313 ulong64 s[25];
154154 #ifdef LTC_WHIRLPOOL
155155 struct whirlpool_state whirlpool;
156156 #endif
157 #ifdef LTC_SHA3
157 #if defined(LTC_SHA3) || defined(LTC_KECCAK)
158158 struct sha3_state sha3;
159159 #endif
160160 #ifdef LTC_SHA512
262262 extern const struct ltc_hash_descriptor whirlpool_desc;
263263 #endif
264264
265 #if defined(LTC_SHA3) || defined(LTC_KECCAK)
266 /* sha3_NNN_init are shared by SHA3 and KECCAK */
267 int sha3_512_init(hash_state * md);
268 int sha3_384_init(hash_state * md);
269 int sha3_256_init(hash_state * md);
270 int sha3_224_init(hash_state * md);
271 /* sha3_process is the same for all variants of SHA3 + KECCAK */
272 int sha3_process(hash_state * md, const unsigned char *in, unsigned long inlen);
273 #endif
274
265275 #ifdef LTC_SHA3
266 int sha3_512_init(hash_state * md);
267276 int sha3_512_test(void);
268277 extern const struct ltc_hash_descriptor sha3_512_desc;
269 int sha3_384_init(hash_state * md);
270278 int sha3_384_test(void);
271279 extern const struct ltc_hash_descriptor sha3_384_desc;
272 int sha3_256_init(hash_state * md);
273280 int sha3_256_test(void);
274281 extern const struct ltc_hash_descriptor sha3_256_desc;
275 int sha3_224_init(hash_state * md);
276282 int sha3_224_test(void);
277283 extern const struct ltc_hash_descriptor sha3_224_desc;
278 /* process + done are the same for all variants */
279 int sha3_process(hash_state * md, const unsigned char *in, unsigned long inlen);
280284 int sha3_done(hash_state *md, unsigned char *hash);
281285 /* SHAKE128 + SHAKE256 */
282286 int sha3_shake_init(hash_state *md, int num);
284288 int sha3_shake_done(hash_state *md, unsigned char *out, unsigned long outlen);
285289 int sha3_shake_test(void);
286290 int sha3_shake_memory(int num, const unsigned char *in, unsigned long inlen, unsigned char *out, unsigned long *outlen);
291 #endif
292
293 #ifdef LTC_KECCAK
294 #define keccak_512_init(a) sha3_512_init(a)
295 #define keccak_384_init(a) sha3_384_init(a)
296 #define keccak_256_init(a) sha3_256_init(a)
297 #define keccak_224_init(a) sha3_224_init(a)
298 #define keccak_process(a,b,c) sha3_process(a,b,c)
299 extern const struct ltc_hash_descriptor keccak_512_desc;
300 int keccak_512_test(void);
301 extern const struct ltc_hash_descriptor keccak_384_desc;
302 int keccak_384_test(void);
303 extern const struct ltc_hash_descriptor keccak_256_desc;
304 int keccak_256_test(void);
305 extern const struct ltc_hash_descriptor keccak_224_desc;
306 int keccak_224_test(void);
307 int keccak_done(hash_state *md, unsigned char *hash);
287308 #endif
288309
289310 #ifdef LTC_SHA512
373373 @param k The integer to multiply the point by
374374 @param G The point to multiply
375375 @param R The destination for kG
376 @param a ECC curve parameter a (if NULL we assume a == -3)
376 @param a ECC curve parameter a
377377 @param modulus The modulus for the field
378378 @param map Boolean indicated whether to map back to affine or not
379379 (can be ignored if you work in affine only)
380380 @return CRYPT_OK on success
381381 */
382382 int (*ecc_ptmul)( void *k,
383 ecc_point *G,
384 ecc_point *R,
385 void *a,
386 void *modulus,
387 int map);
383 const ecc_point *G,
384 ecc_point *R,
385 void *a,
386 void *modulus,
387 int map);
388388
389389 /** ECC GF(p) point addition
390390 @param P The first point
391391 @param Q The second point
392392 @param R The destination of P + Q
393 @param a ECC curve parameter a (if NULL we assume a == -3)
393 @param ma The curve parameter "a" in montgomery form
394394 @param modulus The modulus
395395 @param mp The "b" value from montgomery_setup()
396396 @return CRYPT_OK on success
397397 */
398 int (*ecc_ptadd)(ecc_point *P,
399 ecc_point *Q,
400 ecc_point *R,
401 void *a,
402 void *modulus,
403 void *mp);
398 int (*ecc_ptadd)(const ecc_point *P,
399 const ecc_point *Q,
400 ecc_point *R,
401 void *ma,
402 void *modulus,
403 void *mp);
404404
405405 /** ECC GF(p) point double
406406 @param P The first point
407407 @param R The destination of 2P
408 @param a ECC curve parameter a (if NULL we assume a == -3)
408 @param ma The curve parameter "a" in montgomery form
409409 @param modulus The modulus
410410 @param mp The "b" value from montgomery_setup()
411411 @return CRYPT_OK on success
412412 */
413 int (*ecc_ptdbl)(ecc_point *P,
414 ecc_point *R,
415 void *a,
416 void *modulus,
417 void *mp);
413 int (*ecc_ptdbl)(const ecc_point *P,
414 ecc_point *R,
415 void *ma,
416 void *modulus,
417 void *mp);
418418
419419 /** ECC mapping from projective to affine,
420420 currently uses (x,y,z) => (x/z^2, y/z^3, 1)
434434 @param B Second point to multiply
435435 @param kB What to multiple B by
436436 @param C [out] Destination point (can overlap with A or B)
437 @param ma The curve parameter "a" in montgomery form
437438 @param modulus Modulus for curve
438439 @return CRYPT_OK on success
439440 */
440 int (*ecc_mul2add)(ecc_point *A, void *kA,
441 ecc_point *B, void *kB,
442 ecc_point *C,
443 void *a,
444 void *modulus);
441 int (*ecc_mul2add)(const ecc_point *A, void *kA,
442 const ecc_point *B, void *kB,
443 ecc_point *C,
444 void *ma,
445 void *modulus);
445446
446447 /* ---- (optional) rsa optimized math (for internal CRT) ---- */
447448
3131 PKA_RSA,
3232 PKA_DSA,
3333 PKA_EC,
34 EC_PRIME_FIELD
34 PKA_EC_PRIMEF
3535 };
36 #endif /* LTC_SOURCE */
3736
3837 typedef struct Oid {
3938 unsigned long OID[16];
40 /** Length of DER encoding */
39 /** Number of OID digits in use */
4140 unsigned long OIDlen;
4241 } oid_st;
4342
4443 int pk_get_oid(int pk, oid_st *st);
44 #endif /* LTC_SOURCE */
4545
4646 /* ---- RSA ---- */
4747 #ifdef LTC_MRSA
253253 /* max private key size */
254254 #define ECC_MAXSIZE 66
255255
256 /** Structure defines a NIST GF(p) curve */
256 /** Structure defines a GF(p) curve */
257257 typedef struct {
258 /** The size of the curve in octets */
259 int size;
260
261258 /** name of curve */
262 char *name;
259 const char *name;
263260
264261 /** The prime that defines the field the curve is in (encoded in hex) */
265 char *prime;
262 const char *prime;
266263
267264 /** The fields A param (hex) */
268 char *A;
265 const char *A;
269266
270267 /** The fields B param (hex) */
271 char *B;
268 const char *B;
272269
273270 /** The order of the curve (hex) */
274 char *order;
271 const char *order;
275272
276273 /** The x co-ordinate of the base point on the curve (hex) */
277 char *Gx;
274 const char *Gx;
278275
279276 /** The y co-ordinate of the base point on the curve (hex) */
280 char *Gy;
277 const char *Gy;
281278
282279 /** The co-factor */
283280 unsigned long cofactor;
284281
285 /** The OID stucture */
286 oid_st oid;
282 /** The OID */
283 unsigned long oid[16];
284 unsigned long oidlen;
287285 } ltc_ecc_set_type;
288286
289287 /** A point on a ECC curve, stored in Jacbobian format such that (x,y,z) => (x/z^2, y/z^3, 1) when interpretted as affine */
298296 void *z;
299297 } ecc_point;
300298
299 /** ECC key's domain parameters */
300 typedef struct {
301 /** The size of the curve in octets */
302 int size;
303 /** The prime that defines the field the curve is in */
304 void *prime;
305 /** The fields A param */
306 void *A;
307 /** The fields B param */
308 void *B;
309 /** The order of the curve */
310 void *order;
311 /** The base point G on the curve */
312 ecc_point base;
313 /** The co-factor */
314 unsigned long cofactor;
315 /** The OID */
316 unsigned long oid[16];
317 unsigned long oidlen;
318 } ltc_ecc_dp;
319
301320 /** An ECC key */
302321 typedef struct {
303322 /** Type of key, PK_PRIVATE or PK_PUBLIC */
304323 int type;
305324
306 /** Index into the ltc_ecc_sets[] for the parameters of this curve; if -1, then this key is using user supplied curve in dp */
307 int idx;
308
309 /** pointer to domain parameters; either points to NIST curves (identified by idx >= 0) or user supplied curve */
310 const ltc_ecc_set_type *dp;
311
312 /** The public key */
325 /** Structure with domain parameters */
326 ltc_ecc_dp dp;
327
328 /** Structure with the public key */
313329 ecc_point pubkey;
314330
315331 /** The private key */
323339 void ecc_sizes(int *low, int *high);
324340 int ecc_get_size(ecc_key *key);
325341
326 int ecc_dp_init(ltc_ecc_set_type *dp);
327 int ecc_dp_set(ltc_ecc_set_type *dp, char *ch_prime, char *ch_A, char *ch_B, char *ch_order, char *ch_Gx, char *ch_Gy, unsigned long cofactor, char *ch_name, char *oid);
328 int ecc_dp_set_bn(ltc_ecc_set_type *dp, void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor);
329 int ecc_dp_set_by_oid(ltc_ecc_set_type *dp, unsigned long *oid, unsigned long oidsize);
330 int ecc_dp_fill_from_sets(ltc_ecc_set_type *dp);
331 int ecc_dp_clear(ltc_ecc_set_type *dp);
342 int ecc_get_set_by_name(const char* name, const ltc_ecc_set_type** dp);
343 int ecc_set_dp(const ltc_ecc_set_type *set, ecc_key *key);
344 int ecc_generate_key(prng_state *prng, int wprng, ecc_key *key);
345 int ecc_set_key(const unsigned char *in, unsigned long inlen, int type, ecc_key *key);
346 int ecc_get_key(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
332347
333348 int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key);
334349 int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp);
337352 int ecc_export(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
338353 int ecc_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
339354 int ecc_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp);
340 int ecc_import_pkcs8(const unsigned char *in, unsigned long inlen, const void *pwd, unsigned long pwdlen, ecc_key *key, ltc_ecc_set_type *dp);
341 int ecc_export_full(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
342 int ecc_import_full(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp);
343 int ecc_export_raw(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
344 int ecc_import_raw(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp);
345355
346356 int ecc_ansi_x963_export(ecc_key *key, unsigned char *out, unsigned long *outlen);
347357 int ecc_ansi_x963_import(const unsigned char *in, unsigned long inlen, ecc_key *key);
348 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp);
358 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp);
359
360 int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, ecc_key *key);
361 int ecc_import_openssl(const unsigned char *in, unsigned long inlen, ecc_key *key);
362 int ecc_import_pkcs8(const unsigned char *in, unsigned long inlen, const void *pwd, unsigned long pwdlen, ecc_key *key);
363 int ecc_import_x509(const unsigned char *in, unsigned long inlen, ecc_key *key);
349364
350365 int ecc_shared_secret(ecc_key *private_key, ecc_key *public_key,
351366 unsigned char *out, unsigned long *outlen);
375390 const unsigned char *hash, unsigned long hashlen,
376391 int *stat, ecc_key *key);
377392
378 int ecc_verify_key(ecc_key *key);
393
394 #ifdef LTC_SOURCE
395 /* INTERNAL ONLY - it should be later moved to src/headers/tomcrypt_internal.h */
396
397 int ecc_set_dp_bn(void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor, ecc_key *key);
398 int ecc_set_dp_oid(unsigned long *oid, unsigned long oidsize, ecc_key *key);
399 int ecc_set_dp_copy(ecc_key *srckey, ecc_key *key);
400 int ecc_set_dp_size(int size, ecc_key *key);
379401
380402 /* low level functions */
381403 ecc_point *ltc_ecc_new_point(void);
382404 void ltc_ecc_del_point(ecc_point *p);
383 int ltc_ecc_is_valid_idx(int n);
384 int ltc_ecc_is_point(const ltc_ecc_set_type *dp, void *x, void *y);
385 int ltc_ecc_is_point_at_infinity(ecc_point *p, void *modulus);
405 int ltc_ecc_is_point(const ltc_ecc_dp *dp, void *x, void *y);
406 int ltc_ecc_is_point_at_infinity(const ecc_point *p, void *modulus);
386407 int ltc_ecc_import_point(const unsigned char *in, unsigned long inlen, void *prime, void *a, void *b, void *x, void *y);
387408 int ltc_ecc_export_point(unsigned char *out, unsigned long *outlen, void *x, void *y, unsigned long size, int compressed);
409 int ltc_ecc_verify_key(ecc_key *key);
388410
389411 /* point ops (mp == montgomery digit) */
390412 #if !defined(LTC_MECC_ACCEL) || defined(LTM_DESC) || defined(GMP_DESC)
391413 /* R = 2P */
392 int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *a, void *modulus, void *mp);
414 int ltc_ecc_projective_dbl_point(const ecc_point *P, ecc_point *R, void *ma, void *modulus, void *mp);
393415
394416 /* R = P + Q */
395 int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *a, void *modulus, void *mp);
417 int ltc_ecc_projective_add_point(const ecc_point *P, const ecc_point *Q, ecc_point *R, void *ma, void *modulus, void *mp);
396418 #endif
397419
398420 #if defined(LTC_MECC_FP)
410432 #endif
411433
412434 /* R = kG */
413 int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *a, void *modulus, int map);
435 int ltc_ecc_mulmod(void *k, const ecc_point *G, ecc_point *R, void *a, void *modulus, int map);
414436
415437 #ifdef LTC_ECC_SHAMIR
416438 /* kA*A + kB*B = C */
417 int ltc_ecc_mul2add(ecc_point *A, void *kA,
418 ecc_point *B, void *kB,
419 ecc_point *C,
420 void *a,
421 void *modulus);
439 int ltc_ecc_mul2add(const ecc_point *A, void *kA,
440 const ecc_point *B, void *kB,
441 ecc_point *C,
442 void *ma,
443 void *modulus);
422444
423445 #ifdef LTC_MECC_FP
424446 /* Shamir's trick with optimized point multiplication using fixed point cache */
425 int ltc_ecc_fp_mul2add(ecc_point *A, void *kA,
426 ecc_point *B, void *kB,
427 ecc_point *C,
428 void *a,
429 void *modulus);
447 int ltc_ecc_fp_mul2add(const ecc_point *A, void *kA,
448 const ecc_point *B, void *kB,
449 ecc_point *C,
450 void *ma,
451 void *modulus);
430452 #endif
431453
432454 #endif
434456
435457 /* map P to affine from projective */
436458 int ltc_ecc_map(ecc_point *P, void *modulus, void *mp);
459
460 #endif /* LTC_SOURCE */
437461
438462 #endif
439463
548572 LTC_ASN1_SETOF,
549573 LTC_ASN1_RAW_BIT_STRING,
550574 LTC_ASN1_TELETEX_STRING,
551 LTC_ASN1_CONSTRUCTED,
552 LTC_ASN1_CONTEXT_SPECIFIC,
553 /* 20 */
554575 LTC_ASN1_GENERALIZEDTIME,
576 LTC_ASN1_CUSTOM_TYPE,
555577 } ltc_asn1_type;
578
579 typedef enum {
580 LTC_ASN1_CL_UNIVERSAL = 0x0,
581 LTC_ASN1_CL_APPLICATION = 0x1,
582 LTC_ASN1_CL_CONTEXT_SPECIFIC = 0x2,
583 LTC_ASN1_CL_PRIVATE = 0x3,
584 } ltc_asn1_class;
585
586 typedef enum {
587 LTC_ASN1_PC_PRIMITIVE = 0x0,
588 LTC_ASN1_PC_CONSTRUCTED = 0x1,
589 } ltc_asn1_pc;
556590
557591 /** A LTC ASN.1 list type */
558592 typedef struct ltc_asn1_list_ {
562596 void *data;
563597 /** The size of the input or resulting output */
564598 unsigned long size;
565 /** The used flag, this is used by the CHOICE ASN.1 type to indicate which choice was made */
599 /** The used flag
600 * 1. This is used by the CHOICE ASN.1 type to indicate which choice was made
601 * 2. This is used by the ASN.1 decoder to indicate if an element is used
602 * 3. This is used by the flexi-decoder to indicate the first byte of the identifier */
566603 int used;
567604 /** Flag used to indicate optional items in ASN.1 sequences */
568605 int optional;
569 /** Flag used to indicate context specific tags on ASN.1 sequence items */
570 unsigned char tag;
606 /** ASN.1 identifier */
607 ltc_asn1_class class;
608 ltc_asn1_pc pc;
609 ulong64 tag;
571610 /** prev/next entry in the list */
572611 struct ltc_asn1_list_ *prev, *next, *child, *parent;
573612 } ltc_asn1_list;
580619 LTC_MACRO_list[LTC_MACRO_temp].data = (void*)(Data); \
581620 LTC_MACRO_list[LTC_MACRO_temp].size = (Size); \
582621 LTC_MACRO_list[LTC_MACRO_temp].used = 0; \
622 LTC_MACRO_list[LTC_MACRO_temp].optional = 0; \
623 LTC_MACRO_list[LTC_MACRO_temp].class = 0; \
624 LTC_MACRO_list[LTC_MACRO_temp].pc = 0; \
583625 LTC_MACRO_list[LTC_MACRO_temp].tag = 0; \
584 LTC_MACRO_list[LTC_MACRO_temp].optional = 0; \
585626 } while (0)
627
628 #define __LTC_SET_ASN1_IDENTIFIER(list, index, Class, Pc, Tag) \
629 do { \
630 int LTC_MACRO_temp = (index); \
631 ltc_asn1_list *LTC_MACRO_list = (list); \
632 LTC_MACRO_list[LTC_MACRO_temp].type = LTC_ASN1_CUSTOM_TYPE; \
633 LTC_MACRO_list[LTC_MACRO_temp].class = (Class); \
634 LTC_MACRO_list[LTC_MACRO_temp].pc = (Pc); \
635 LTC_MACRO_list[LTC_MACRO_temp].tag = (Tag); \
636 } while (0)
637
638 #define LTC_SET_ASN1_CUSTOM_CONSTRUCTED(list, index, Class, Tag, Data) \
639 do { \
640 int LTC_MACRO_temp##__LINE__ = (index); \
641 LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, 1); \
642 __LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_CONSTRUCTED, Tag); \
643 } while (0)
644
645 #define LTC_SET_ASN1_CUSTOM_PRIMITIVE(list, index, Class, Tag, Type, Data, Size) \
646 do { \
647 int LTC_MACRO_temp##__LINE__ = (index); \
648 LTC_SET_ASN1(list, LTC_MACRO_temp##__LINE__, LTC_ASN1_CUSTOM_TYPE, Data, Size); \
649 __LTC_SET_ASN1_IDENTIFIER(list, LTC_MACRO_temp##__LINE__, Class, LTC_ASN1_PC_PRIMITIVE, Tag); \
650 list[LTC_MACRO_temp##__LINE__].used = (int)(Type); \
651 } while (0)
652
653 extern const char* der_asn1_class_to_string_map[];
654 extern const unsigned long der_asn1_class_to_string_map_sz;
655
656 extern const char* der_asn1_pc_to_string_map[];
657 extern const unsigned long der_asn1_pc_to_string_map_sz;
658
659 extern const char* der_asn1_tag_to_string_map[];
660 extern const unsigned long der_asn1_tag_to_string_map_sz;
586661
587662 /* SEQUENCE */
588663 int der_encode_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
590665
591666 #define der_encode_sequence(list, inlen, out, outlen) der_encode_sequence_ex(list, inlen, out, outlen, LTC_ASN1_SEQUENCE)
592667
668 /** The supported bitmap for all the
669 * decoders with a `flags` argument.
670 */
671 enum ltc_der_seq {
672 LTC_DER_SEQ_ZERO = 0x0u,
673
674 /** Bit0 - [0]=Unordered (SET or SETOF)
675 * [1]=Ordered (SEQUENCE) */
676 LTC_DER_SEQ_UNORDERED = LTC_DER_SEQ_ZERO,
677 LTC_DER_SEQ_ORDERED = 0x1u,
678
679 /** Bit1 - [0]=Relaxed
680 * [1]=Strict */
681 LTC_DER_SEQ_RELAXED = LTC_DER_SEQ_ZERO,
682 LTC_DER_SEQ_STRICT = 0x2u,
683
684 /** Alternative naming */
685 LTC_DER_SEQ_SET = LTC_DER_SEQ_UNORDERED,
686 LTC_DER_SEQ_SEQUENCE = LTC_DER_SEQ_ORDERED,
687 };
688
593689 int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen,
594 ltc_asn1_list *list, unsigned long outlen, int ordered);
595
596 #define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 1)
690 ltc_asn1_list *list, unsigned long outlen, unsigned int flags);
691
692 #define der_decode_sequence(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_RELAXED)
693 #define der_decode_sequence_strict(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_STRICT)
597694
598695 int der_length_sequence(ltc_asn1_list *list, unsigned long inlen,
599696 unsigned long *outlen);
600697
601698
699 /* Custom-types */
700 int der_encode_custom_type(const ltc_asn1_list *root,
701 unsigned char *out, unsigned long *outlen);
702
703 int der_decode_custom_type(const unsigned char *in, unsigned long inlen,
704 ltc_asn1_list *root);
705
706 int der_length_custom_type(const ltc_asn1_list *root,
707 unsigned long *outlen,
708 unsigned long *payloadlen);
709
602710 #ifdef LTC_SOURCE
603711 /* internal helper functions */
712 int der_decode_custom_type_ex(const unsigned char *in, unsigned long inlen,
713 ltc_asn1_list *root,
714 ltc_asn1_list *list, unsigned long outlen, unsigned int flags);
715
716 int der_encode_asn1_identifier(const ltc_asn1_list *id, unsigned char *out, unsigned long *outlen);
717 int der_decode_asn1_identifier(const unsigned char *in, unsigned long *inlen, ltc_asn1_list *id);
718 int der_length_asn1_identifier(const ltc_asn1_list *id, unsigned long *idlen);
719
720 int der_encode_asn1_length(unsigned long len, unsigned char* out, unsigned long* outlen);
721 int der_decode_asn1_length(const unsigned char* len, unsigned long* lenlen, unsigned long* outlen);
722 int der_length_asn1_length(unsigned long len, unsigned long *outlen);
723
604724 int der_length_sequence_ex(ltc_asn1_list *list, unsigned long inlen,
605725 unsigned long *outlen, unsigned long *payloadlen);
606 /* SUBJECT PUBLIC KEY INFO */
607 int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,
608 unsigned int algorithm, void* public_key, unsigned long public_key_len,
609 unsigned long parameters_type, void* parameters, unsigned long parameters_len);
610
611 int der_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,
612 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
613 unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len);
614
615 int der_decode_subject_public_key_info_ex(const unsigned char *in, unsigned long inlen,
616 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
617 unsigned long parameters_type, void* parameters, unsigned long parameters_len,
618 unsigned long *parameters_outsize);
726
727 extern const ltc_asn1_type der_asn1_tag_to_type_map[];
728 extern const unsigned long der_asn1_tag_to_type_map_sz;
729
730 extern const int der_asn1_type_to_identifier_map[];
731 extern const unsigned long der_asn1_type_to_identifier_map_sz;
619732 #endif /* LTC_SOURCE */
620733
621734 /* SET */
622 #define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, 0)
735 #define der_decode_set(in, inlen, list, outlen) der_decode_sequence_ex(in, inlen, list, outlen, LTC_DER_SEQ_SET)
623736 #define der_length_set der_length_sequence
624737 int der_encode_set(ltc_asn1_list *list, unsigned long inlen,
625738 unsigned char *out, unsigned long *outlen);
630743 /* VA list handy helpers with triplets of <type, size, data> */
631744 int der_encode_sequence_multi(unsigned char *out, unsigned long *outlen, ...);
632745 int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...);
746 #ifdef LTC_SOURCE
747 /* internal helper functions */
748 int der_decode_sequence_multi_ex(const unsigned char *in, unsigned long inlen, unsigned int flags, ...);
749 #endif /* LTC_SOURCE */
633750
634751 /* FLEXI DECODER handle unknown list decoder */
635752 int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out);
785902
786903 int der_length_generalizedtime(ltc_generalizedtime *gtime, unsigned long *outlen);
787904
905 #ifdef LTC_SOURCE
906 /* internal helper functions */
907 /* SUBJECT PUBLIC KEY INFO */
908 int x509_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,
909 unsigned int algorithm, void* public_key, unsigned long public_key_len,
910 unsigned long parameters_type, void* parameters, unsigned long parameters_len);
911
912 int x509_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,
913 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
914 unsigned long parameters_type, void* parameters, unsigned long *parameters_len);
915 #endif /* LTC_SOURCE */
788916
789917 #endif
790918
2222 int blake2bmac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen)
2323 {
2424 #ifdef LTC_NO_FILE
25 LTC_UNUSED_PARAM(fname);
26 LTC_UNUSED_PARAM(key);
27 LTC_UNUSED_PARAM(keylen);
28 LTC_UNUSED_PARAM(mac);
29 LTC_UNUSED_PARAM(maclen);
2530 return CRYPT_NOP;
2631 #else
2732 blake2bmac_state st;
2222 int blake2smac_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen)
2323 {
2424 #ifdef LTC_NO_FILE
25 LTC_UNUSED_PARAM(fname);
26 LTC_UNUSED_PARAM(key);
27 LTC_UNUSED_PARAM(keylen);
28 LTC_UNUSED_PARAM(mac);
29 LTC_UNUSED_PARAM(maclen);
2530 return CRYPT_NOP;
2631 #else
2732 blake2smac_state st;
3030 unsigned char *out, unsigned long *outlen)
3131 {
3232 #ifdef LTC_NO_FILE
33 LTC_UNUSED_PARAM(cipher);
34 LTC_UNUSED_PARAM(key);
35 LTC_UNUSED_PARAM(keylen);
36 LTC_UNUSED_PARAM(fname);
37 LTC_UNUSED_PARAM(out);
38 LTC_UNUSED_PARAM(outlen);
3339 return CRYPT_NOP;
3440 #else
3541 size_t x;
2929 unsigned char *out, unsigned long *outlen)
3030 {
3131 #ifdef LTC_NO_FILE
32 LTC_UNUSED_PARAM(hash);
33 LTC_UNUSED_PARAM(fname);
34 LTC_UNUSED_PARAM(key);
35 LTC_UNUSED_PARAM(keylen);
36 LTC_UNUSED_PARAM(out);
37 LTC_UNUSED_PARAM(outlen);
3238 return CRYPT_NOP;
3339 #else
3440 hmac_state hmac;
3030 unsigned char *out, unsigned long *outlen)
3131 {
3232 #ifdef LTC_NO_FILE
33 LTC_UNUSED_PARAM(cipher);
34 LTC_UNUSED_PARAM(key);
35 LTC_UNUSED_PARAM(keylen);
36 LTC_UNUSED_PARAM(filename);
37 LTC_UNUSED_PARAM(out);
38 LTC_UNUSED_PARAM(outlen);
3339 return CRYPT_NOP;
3440 #else
3541 size_t x;
3030 unsigned char *out, unsigned long *outlen)
3131 {
3232 #ifdef LTC_NO_FILE
33 LTC_UNUSED_PARAM(cipher);
34 LTC_UNUSED_PARAM(key);
35 LTC_UNUSED_PARAM(keylen);
36 LTC_UNUSED_PARAM(filename);
37 LTC_UNUSED_PARAM(out);
38 LTC_UNUSED_PARAM(outlen);
3339 return CRYPT_NOP;
3440 #else
3541 size_t x;
2727 int poly1305_file(const char *fname, const unsigned char *key, unsigned long keylen, unsigned char *mac, unsigned long *maclen)
2828 {
2929 #ifdef LTC_NO_FILE
30 LTC_UNUSED_PARAM(fname);
31 LTC_UNUSED_PARAM(key);
32 LTC_UNUSED_PARAM(keylen);
33 LTC_UNUSED_PARAM(mac);
34 LTC_UNUSED_PARAM(maclen);
3035 return CRYPT_NOP;
3136 #else
3237 poly1305_state st;
3030 unsigned char *out, unsigned long *outlen)
3131 {
3232 #ifdef LTC_NO_FILE
33 LTC_UNUSED_PARAM(cipher);
34 LTC_UNUSED_PARAM(key);
35 LTC_UNUSED_PARAM(keylen);
36 LTC_UNUSED_PARAM(filename);
37 LTC_UNUSED_PARAM(out);
38 LTC_UNUSED_PARAM(outlen);
3339 return CRYPT_NOP;
3440 #else
3541 size_t x;
77 */
88 #include "tomcrypt.h"
99
10 #ifdef LTC_MDSA
10 #if defined(LTC_MDSA) || defined(LTC_MECC)
1111 /**
1212 Generate a random number N with given bitlength (note: MSB can be 0)
1313 */
264264 return CRYPT_OK;
265265 }
266266
267 /* sqrtmod_prime */
268 static int sqrtmod_prime(void *a, void *b, void *c)
269 {
270 LTC_ARGCHK(a != NULL);
271 LTC_ARGCHK(b != NULL);
272 LTC_ARGCHK(c != NULL);
273 fprintf(stderr, "TFM does not support sqrtmod_prime\n"); /* XXX-FIXME */
274 return CRYPT_ERROR;
275 }
276
267277 /* div */
268278 static int divide(void *a, void *b, void *c, void *d)
269279 {
423433
424434 #if defined(LTC_MECC) && defined(LTC_MECC_ACCEL)
425435
426 static int tfm_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *Mp)
436 static int tfm_ecc_projective_dbl_point(const ecc_point *P, ecc_point *R, void *ma, void *modulus, void *Mp)
427437 {
428438 fp_int t1, t2;
429439 fp_digit mp;
442452 fp_copy(P->x, R->x);
443453 fp_copy(P->y, R->y);
444454 fp_copy(P->z, R->z);
455 }
456
457 if (ltc_ecc_is_point_at_infinity(P, modulus)) {
458 /* if P is point at infinity >> Result = point at infinity */
459 ltc_mp.set_int(R->x, 1);
460 ltc_mp.set_int(R->y, 1);
461 ltc_mp.set_int(R->z, 0);
462 return CRYPT_OK;
445463 }
446464
447465 /* t1 = Z * Z */
456474 fp_sub(R->z, modulus, R->z);
457475 }
458476
459 /* &t2 = X - T1 */
460 fp_sub(R->x, &t1, &t2);
461 if (fp_cmp_d(&t2, 0) == FP_LT) {
462 fp_add(&t2, modulus, &t2);
463 }
464 /* T1 = X + T1 */
465 fp_add(&t1, R->x, &t1);
466 if (fp_cmp(&t1, modulus) != FP_LT) {
467 fp_sub(&t1, modulus, &t1);
468 }
469 /* T2 = T1 * T2 */
470 fp_mul(&t1, &t2, &t2);
471 fp_montgomery_reduce(&t2, modulus, mp);
472 /* T1 = 2T2 */
473 fp_add(&t2, &t2, &t1);
474 if (fp_cmp(&t1, modulus) != FP_LT) {
475 fp_sub(&t1, modulus, &t1);
476 }
477 /* T1 = T1 + T2 */
478 fp_add(&t1, &t2, &t1);
479 if (fp_cmp(&t1, modulus) != FP_LT) {
480 fp_sub(&t1, modulus, &t1);
477 if (ma == NULL) { /* special case for curves with a == -3 (10% faster than general case) */
478 /* T2 = X - T1 */
479 fp_sub(R->x, &t1, &t2);
480 if (fp_cmp_d(&t2, 0) == LTC_MP_LT) {
481 fp_add(&t2, modulus, &t2);
482 }
483 /* T1 = X + T1 */
484 fp_add(&t1, R->x, &t1);
485 if (fp_cmp(&t1, modulus) != FP_LT) {
486 fp_sub(&t1, modulus, &t1);
487 }
488 /* T2 = T1 * T2 */
489 fp_mul(&t1, &t2, &t2);
490 fp_montgomery_reduce(&t2, modulus, mp);
491 /* T1 = 2T2 */
492 fp_add(&t2, &t2, &t1);
493 if (fp_cmp(&t1, modulus) != FP_LT) {
494 fp_sub(&t1, modulus, &t1);
495 }
496 /* T1 = T1 + T2 */
497 fp_add(&t1, &t2, &t1);
498 if (fp_cmp(&t1, modulus) != FP_LT) {
499 fp_sub(&t1, modulus, &t1);
500 }
501 }
502 else {
503 /* T2 = T1 * T1 */
504 fp_sqr(&t1, &t2);
505 fp_montgomery_reduce(&t2, modulus, mp);
506 /* T1 = T2 * a */
507 fp_mul(&t2, ma, &t1);
508 fp_montgomery_reduce(&t1, modulus, mp);
509 /* T2 = X * X */
510 fp_sqr(R->x, &t2);
511 fp_montgomery_reduce(&t2, modulus, mp);
512 /* T1 = T1 + T2 */
513 fp_add(&t1, &t2, &t1);
514 if (fp_cmp(&t1, modulus) != FP_LT) {
515 fp_sub(&t1, modulus, &t1);
516 }
517 /* T1 = T1 + T2 */
518 fp_add(&t1, &t2, &t1);
519 if (fp_cmp(&t1, modulus) != FP_LT) {
520 fp_sub(&t1, modulus, &t1);
521 }
522 /* T1 = T1 + T2 */
523 fp_add(&t1, &t2, &t1);
524 if (fp_cmp(&t1, modulus) != FP_LT) {
525 fp_sub(&t1, modulus, &t1);
526 }
481527 }
482528
483529 /* Y = 2Y */
540586 @param Mp The "b" value from montgomery_setup()
541587 @return CRYPT_OK on success
542588 */
543 static int tfm_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *Mp)
589 static int tfm_ecc_projective_add_point(const ecc_point *P, const ecc_point *Q, ecc_point *R, void *ma, void *modulus, void *Mp)
544590 {
545591 fp_int t1, t2, x, y, z;
546592 fp_digit mp;
559605 fp_init(&y);
560606 fp_init(&z);
561607
608 if (ltc_ecc_is_point_at_infinity(P, modulus)) {
609 /* P is point at infinity >> Result = Q */
610 ltc_mp.copy(Q->x, R->x);
611 ltc_mp.copy(Q->y, R->y);
612 ltc_mp.copy(Q->z, R->z);
613 return CRYPT_OK;
614 }
615
616 if (ltc_ecc_is_point_at_infinity(Q, modulus)) {
617 /* Q is point at infinity >> Result = P */
618 ltc_mp.copy(P->x, R->x);
619 ltc_mp.copy(P->y, R->y);
620 ltc_mp.copy(P->z, R->z);
621 return CRYPT_OK;
622 }
623
562624 /* should we dbl instead? */
563625 fp_sub(modulus, Q->y, &t1);
564626 if ( (fp_cmp(P->x, Q->x) == FP_EQ) &&
565627 (Q->z != NULL && fp_cmp(P->z, Q->z) == FP_EQ) &&
566628 (fp_cmp(P->y, Q->y) == FP_EQ || fp_cmp(P->y, &t1) == FP_EQ)) {
567 return tfm_ecc_projective_dbl_point(P, R, modulus, Mp);
629 return tfm_ecc_projective_dbl_point(P, R, ma, modulus, Mp);
568630 }
569631
570632 fp_copy(P->x, &x);
740802 &mul,
741803 &muli,
742804 &sqr,
805 &sqrtmod_prime,
743806 &divide,
744807 &div_2,
745808 &modi,
151151 #if defined(LTC_SHA3)
152152 " SHA3\n"
153153 #endif
154 #if defined(LTC_KECCAK)
155 " KECCAK\n"
156 #endif
154157 #if defined(LTC_SHA512)
155158 " SHA-512\n"
156159 #endif
4646 _C_STRINGIFY(CRYPT_FILE_NOTFOUND),
4747 _C_STRINGIFY(CRYPT_PK_INVALID_TYPE),
4848 _C_STRINGIFY(CRYPT_OVERFLOW),
49 _C_STRINGIFY(CRYPT_UNUSED1),
49 _C_STRINGIFY(CRYPT_PK_ASN1_ERROR),
5050 _C_STRINGIFY(CRYPT_INPUT_TOO_LONG),
5151 _C_STRINGIFY(CRYPT_PK_INVALID_SIZE),
5252 _C_STRINGIFY(CRYPT_INVALID_PRIME_SIZE),
128128 _C_STRINGIFY(LTC_ASN1_SETOF),
129129 _C_STRINGIFY(LTC_ASN1_RAW_BIT_STRING),
130130 _C_STRINGIFY(LTC_ASN1_TELETEX_STRING),
131 _C_STRINGIFY(LTC_ASN1_CONSTRUCTED),
132 _C_STRINGIFY(LTC_ASN1_CONTEXT_SPECIFIC),
133131 _C_STRINGIFY(LTC_ASN1_GENERALIZEDTIME),
132 _C_STRINGIFY(LTC_ASN1_CUSTOM_TYPE),
134133 #endif
135134
136135 #ifdef LTC_CTR_MODE
5959 REGISTER_HASH(&sha3_384_desc);
6060 REGISTER_HASH(&sha3_512_desc);
6161 #endif
62 #ifdef LTC_KECCAK
63 REGISTER_HASH(&keccak_224_desc);
64 REGISTER_HASH(&keccak_256_desc);
65 REGISTER_HASH(&keccak_384_desc);
66 REGISTER_HASH(&keccak_512_desc);
67 #endif
6268 #ifdef LTC_RIPEMD128
6369 REGISTER_HASH(&rmd128_desc);
6470 #endif
4545
4646 "An overflow of a value was detected/prevented.",
4747
48 "UNUSED1.",
48 "An ASN.1 decoding error occurred.",
4949
5050 "The input was longer than expected.",
5151
4444 case PKA_EC:
4545 XMEMCPY(st, &ec_oid, sizeof(*st));
4646 break;
47 case EC_PRIME_FIELD:
47 case PKA_EC_PRIMEF:
4848 XMEMCPY(st, &ec_primef, sizeof(*st));
4949 break;
5050 default:
5252 if ((err = cipher_descriptor[ctr->cipher].accel_ctr_encrypt(pt, ct, len/ctr->blocklen, ctr->ctr, ctr->mode, &ctr->key)) != CRYPT_OK) {
5353 return err;
5454 }
55 pt += (len / ctr->blocklen) * ctr->blocklen;
56 ct += (len / ctr->blocklen) * ctr->blocklen;
5557 len %= ctr->blocklen;
5658 }
5759
2727 unsigned char *out, unsigned long *outlen)
2828 {
2929 unsigned long dlen, blen, x, y;
30 int err;
3031
3132 LTC_ARGCHK(in != NULL);
3233 LTC_ARGCHK(out != NULL);
4647 x = 1;
4748
4849 /* get the length of the data */
49 if (in[x] & 0x80) {
50 /* long format get number of length bytes */
51 y = in[x++] & 0x7F;
52
53 /* invalid if 0 or > 2 */
54 if (y == 0 || y > 2) {
55 return CRYPT_INVALID_PACKET;
56 }
57
58 /* read the data len */
59 dlen = 0;
60 while (y--) {
61 dlen = (dlen << 8) | (unsigned long)in[x++];
62 }
63 } else {
64 /* short format */
65 dlen = in[x++] & 0x7F;
50 y = inlen - 1;
51 if ((err = der_decode_asn1_length(in + x, &y, &dlen)) != CRYPT_OK) {
52 return err;
6653 }
67
54 x += y;
6855 /* is the data len too long or too short? */
69 if ((dlen == 0) || (dlen + x > inlen)) {
56 if ((dlen == 0) || (dlen > (inlen - x))) {
7057 return CRYPT_INVALID_PACKET;
7158 }
7259
3030 unsigned char *out, unsigned long *outlen)
3131 {
3232 unsigned long dlen, blen, x, y;
33 int err;
3334
3435 LTC_ARGCHK(in != NULL);
3536 LTC_ARGCHK(out != NULL);
4950 x = 1;
5051
5152 /* get the length of the data */
52 if (in[x] & 0x80) {
53 /* long format get number of length bytes */
54 y = in[x++] & 0x7F;
55
56 /* invalid if 0 or > 2 */
57 if (y == 0 || y > 2) {
58 return CRYPT_INVALID_PACKET;
59 }
60
61 /* read the data len */
62 dlen = 0;
63 while (y--) {
64 dlen = (dlen << 8) | (unsigned long)in[x++];
65 }
66 } else {
67 /* short format */
68 dlen = in[x++] & 0x7F;
53 y = inlen - 1;
54 if ((err = der_decode_asn1_length(in + x, &y, &dlen)) != CRYPT_OK) {
55 return err;
6956 }
70
57 x += y;
7158 /* is the data len too long or too short? */
72 if ((dlen == 0) || (dlen + x > inlen)) {
59 if ((dlen == 0) || (dlen > (inlen - x))) {
7360 return CRYPT_INVALID_PACKET;
7461 }
7562
4949 y = ((inlen + 7) >> 3) + 1;
5050
5151 out[x++] = 0x03;
52 if (y < 128) {
53 out[x++] = (unsigned char)y;
54 } else if (y < 256) {
55 out[x++] = 0x81;
56 out[x++] = (unsigned char)y;
57 } else if (y < 65536) {
58 out[x++] = 0x82;
59 out[x++] = (unsigned char)((y>>8)&255);
60 out[x++] = (unsigned char)(y&255);
52 len = *outlen - x;
53 if ((err = der_encode_asn1_length(y, out + x, &len)) != CRYPT_OK) {
54 return err;
6155 }
56 x += len;
6257
6358 /* store number of zero padding bits */
6459 out[x++] = (unsigned char)((8 - inlen) & 7);
5151 y = ((inlen + 7) >> 3) + 1;
5252
5353 out[x++] = 0x03;
54 if (y < 128) {
55 out[x++] = (unsigned char)y;
56 } else if (y < 256) {
57 out[x++] = 0x81;
58 out[x++] = (unsigned char)y;
59 } else if (y < 65536) {
60 out[x++] = 0x82;
61 out[x++] = (unsigned char)((y>>8)&255);
62 out[x++] = (unsigned char)(y&255);
54 len = *outlen - x;
55 if ((err = der_encode_asn1_length(y, out + x, &len)) != CRYPT_OK) {
56 return err;
6357 }
58 x += len;
6459
6560 /* store number of zero padding bits */
6661 out[x++] = (unsigned char)((8 - inlen) & 7);
2121 */
2222 int der_length_bit_string(unsigned long nbits, unsigned long *outlen)
2323 {
24 unsigned long nbytes;
24 unsigned long nbytes, x;
25 int err;
26
2527 LTC_ARGCHK(outlen != NULL);
2628
2729 /* get the number of the bytes */
2830 nbytes = (nbits >> 3) + ((nbits & 7) ? 1 : 0) + 1;
2931
30 if (nbytes < 128) {
31 /* 03 LL PP DD DD DD ... */
32 *outlen = 2 + nbytes;
33 } else if (nbytes < 256) {
34 /* 03 81 LL PP DD DD DD ... */
35 *outlen = 3 + nbytes;
36 } else if (nbytes < 65536) {
37 /* 03 82 LL LL PP DD DD DD ... */
38 *outlen = 4 + nbytes;
39 } else {
40 return CRYPT_INVALID_ARG;
32 if ((err = der_length_asn1_length(nbytes, &x)) != CRYPT_OK) {
33 return err;
4134 }
35 *outlen = 1 + x + nbytes;
4236
4337 return CRYPT_OK;
4438 }
204204 }
205205 break;
206206
207 case LTC_ASN1_CUSTOM_TYPE:
208 if (der_decode_custom_type(in, *inlen, &list[x]) == CRYPT_OK) {
209 if (der_length_custom_type(&list[x], &z, NULL) == CRYPT_OK) {
210 list[x].used = 1;
211 *inlen = z;
212 return CRYPT_OK;
213 }
214 }
215 break;
216
207217 case LTC_ASN1_CHOICE:
208 case LTC_ASN1_CONSTRUCTED:
209 case LTC_ASN1_CONTEXT_SPECIFIC:
210218 case LTC_ASN1_EOL:
211219 return CRYPT_INVALID_ARG;
212220 }
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10
11 /**
12 @file der_decode_custom_type.c
13 ASN.1 DER, decode a Custom type, Steffen Jaeckel
14 */
15
16 #ifdef LTC_DER
17
18 /**
19 Decode a Custom type
20 @param in The DER encoded input
21 @param inlen The size of the input
22 @param root The item that defines the custom type to decode
23 @return CRYPT_OK on success
24 */
25 int der_decode_custom_type(const unsigned char *in, unsigned long inlen,
26 ltc_asn1_list *root)
27 {
28 LTC_ARGCHK(root != NULL);
29 return der_decode_custom_type_ex(in, inlen, root, NULL, 0, LTC_DER_SEQ_ORDERED | LTC_DER_SEQ_RELAXED);
30 }
31
32 /**
33 Extended-decode a Custom type
34
35 This function is used to decode custom types and sequences/sets
36 For custom types root is used
37 For sequences/sets list and outlen are used
38
39 @param in The DER encoded input
40 @param inlen The size of the input
41 @param root The item that defines the custom type to decode
42 @param list The list of items to decode
43 @param outlen The number of items in the list
44 @param flags c.f. enum ltc_der_seq
45 @return CRYPT_OK on success
46 */
47 int der_decode_custom_type_ex(const unsigned char *in, unsigned long inlen,
48 ltc_asn1_list *root,
49 ltc_asn1_list *list, unsigned long outlen,
50 unsigned int flags)
51 {
52 int err, seq_err, i, ordered;
53 ltc_asn1_type type;
54 ltc_asn1_list ident;
55 unsigned long size, x, y, z, blksize;
56 unsigned char* in_new = NULL;
57 void *data;
58
59 LTC_ARGCHK(in != NULL);
60
61 /* get blk size */
62 if (inlen < 2) {
63 return CRYPT_INVALID_PACKET;
64 }
65 x = 0;
66
67 if (root == NULL) {
68 LTC_ARGCHK(list != NULL);
69
70 /* sequence type? We allow 0x30 SEQUENCE and 0x31 SET since fundamentally they're the same structure */
71 if (in[x] != 0x30 && in[x] != 0x31) {
72 return CRYPT_INVALID_PACKET;
73 }
74 ++x;
75 } else {
76 if (root->type != LTC_ASN1_CUSTOM_TYPE) {
77 return CRYPT_INVALID_PACKET;
78 }
79
80 /* Alloc a copy of the data for primitive handling. */
81 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
82 in_new = XMALLOC(inlen);
83 if (in_new == NULL) {
84 return CRYPT_MEM;
85 }
86 XMEMCPY(in_new, in, inlen);
87 in = in_new;
88 }
89
90 y = inlen;
91 if ((err = der_decode_asn1_identifier(in, &y, &ident)) != CRYPT_OK) {
92 goto LBL_ERR;
93 }
94 if ((ident.type != root->type) ||
95 (ident.class != root->class) ||
96 (ident.pc != root->pc) ||
97 (ident.tag != root->tag)) {
98 err = CRYPT_INVALID_PACKET;
99 goto LBL_ERR;
100 }
101 x += y;
102
103 list = root->data;
104 outlen = root->size;
105 }
106
107 if (root != NULL && root->pc == LTC_ASN1_PC_PRIMITIVE) {
108 if (((unsigned long)root->used >= der_asn1_type_to_identifier_map_sz) ||
109 (der_asn1_type_to_identifier_map[root->used] == -1)) {
110 err = CRYPT_INVALID_PACKET;
111 goto LBL_ERR;
112 }
113
114 root->type = (ltc_asn1_type)root->used;
115 list = root;
116 outlen = 1;
117
118 x -= 1;
119 in_new[x] = (unsigned char)der_asn1_type_to_identifier_map[list[0].type];
120 blksize = inlen - x;
121 } else {
122
123 y = inlen - x;
124 if ((err = der_decode_asn1_length(&in[x], &y, &blksize)) != CRYPT_OK) {
125 goto LBL_ERR;
126 }
127 x += y;
128 }
129
130 /* would this blksize overflow? */
131 if (blksize > (inlen - x)) {
132 err = CRYPT_INVALID_PACKET;
133 goto LBL_ERR;
134 }
135
136 /* mark all as unused */
137 for (i = 0; i < (int)outlen; i++) {
138 list[i].used = 0;
139 }
140 ordered = flags & LTC_DER_SEQ_ORDERED;
141
142 /* ok read data */
143 seq_err = CRYPT_OK;
144 blksize += x;
145 inlen -= x;
146 for (i = 0; i < (int)outlen; i++) {
147 z = 0;
148 type = list[i].type;
149 size = list[i].size;
150 data = list[i].data;
151 if (!ordered && list[i].used == 1) { continue; }
152
153 if (type == LTC_ASN1_EOL) {
154 break;
155 }
156
157 if (root != NULL && root->pc == LTC_ASN1_PC_PRIMITIVE && i != 0) {
158 err = CRYPT_PK_ASN1_ERROR;
159 goto LBL_ERR;
160 }
161
162 switch (type) {
163 case LTC_ASN1_BOOLEAN:
164 z = inlen;
165 if ((err = der_decode_boolean(in + x, z, ((int *)data))) != CRYPT_OK) {
166 if (!ordered || list[i].optional) { continue; }
167 goto LBL_ERR;
168 }
169 if ((err = der_length_boolean(&z)) != CRYPT_OK) {
170 goto LBL_ERR;
171 }
172 break;
173
174 case LTC_ASN1_INTEGER:
175 z = inlen;
176 if ((err = der_decode_integer(in + x, z, data)) != CRYPT_OK) {
177 if (!ordered || list[i].optional) { continue; }
178 goto LBL_ERR;
179 }
180 if ((err = der_length_integer(data, &z)) != CRYPT_OK) {
181 goto LBL_ERR;
182 }
183 break;
184
185 case LTC_ASN1_SHORT_INTEGER:
186 z = inlen;
187 if ((err = der_decode_short_integer(in + x, z, data)) != CRYPT_OK) {
188 if (!ordered || list[i].optional) { continue; }
189 goto LBL_ERR;
190 }
191 if ((err = der_length_short_integer(((unsigned long*)data)[0], &z)) != CRYPT_OK) {
192 goto LBL_ERR;
193 }
194
195 break;
196
197 case LTC_ASN1_BIT_STRING:
198 z = inlen;
199 if ((err = der_decode_bit_string(in + x, z, data, &size)) != CRYPT_OK) {
200 if (!ordered || list[i].optional) { continue; }
201 goto LBL_ERR;
202 }
203 list[i].size = size;
204 if ((err = der_length_bit_string(size, &z)) != CRYPT_OK) {
205 goto LBL_ERR;
206 }
207 break;
208
209 case LTC_ASN1_RAW_BIT_STRING:
210 z = inlen;
211 if ((err = der_decode_raw_bit_string(in + x, z, data, &size)) != CRYPT_OK) {
212 if (!ordered || list[i].optional) { continue; }
213 goto LBL_ERR;
214 }
215 list[i].size = size;
216 if ((err = der_length_bit_string(size, &z)) != CRYPT_OK) {
217 goto LBL_ERR;
218 }
219 break;
220
221 case LTC_ASN1_OCTET_STRING:
222 z = inlen;
223 if ((err = der_decode_octet_string(in + x, z, data, &size)) != CRYPT_OK) {
224 if (!ordered || list[i].optional) { continue; }
225 goto LBL_ERR;
226 }
227 list[i].size = size;
228 if ((err = der_length_octet_string(size, &z)) != CRYPT_OK) {
229 goto LBL_ERR;
230 }
231 break;
232
233 case LTC_ASN1_NULL:
234 if (inlen < 2 || in[x] != 0x05 || in[x+1] != 0x00) {
235 if (!ordered || list[i].optional) { continue; }
236 err = CRYPT_INVALID_PACKET;
237 goto LBL_ERR;
238 }
239 z = 2;
240 break;
241
242 case LTC_ASN1_OBJECT_IDENTIFIER:
243 z = inlen;
244 if ((err = der_decode_object_identifier(in + x, z, data, &size)) != CRYPT_OK) {
245 if (!ordered || list[i].optional) { continue; }
246 goto LBL_ERR;
247 }
248 list[i].size = size;
249 if ((err = der_length_object_identifier(data, size, &z)) != CRYPT_OK) {
250 goto LBL_ERR;
251 }
252 break;
253
254 case LTC_ASN1_TELETEX_STRING:
255 z = inlen;
256 if ((err = der_decode_teletex_string(in + x, z, data, &size)) != CRYPT_OK) {
257 if (!ordered || list[i].optional) { continue; }
258 goto LBL_ERR;
259 }
260 list[i].size = size;
261 if ((err = der_length_teletex_string(data, size, &z)) != CRYPT_OK) {
262 goto LBL_ERR;
263 }
264 break;
265
266 case LTC_ASN1_IA5_STRING:
267 z = inlen;
268 if ((err = der_decode_ia5_string(in + x, z, data, &size)) != CRYPT_OK) {
269 if (!ordered || list[i].optional) { continue; }
270 goto LBL_ERR;
271 }
272 list[i].size = size;
273 if ((err = der_length_ia5_string(data, size, &z)) != CRYPT_OK) {
274 goto LBL_ERR;
275 }
276 break;
277
278 case LTC_ASN1_PRINTABLE_STRING:
279 z = inlen;
280 if ((err = der_decode_printable_string(in + x, z, data, &size)) != CRYPT_OK) {
281 if (!ordered || list[i].optional) { continue; }
282 goto LBL_ERR;
283 }
284 list[i].size = size;
285 if ((err = der_length_printable_string(data, size, &z)) != CRYPT_OK) {
286 goto LBL_ERR;
287 }
288 break;
289
290 case LTC_ASN1_UTF8_STRING:
291 z = inlen;
292 if ((err = der_decode_utf8_string(in + x, z, data, &size)) != CRYPT_OK) {
293 if (!ordered || list[i].optional) { continue; }
294 goto LBL_ERR;
295 }
296 list[i].size = size;
297 if ((err = der_length_utf8_string(data, size, &z)) != CRYPT_OK) {
298 goto LBL_ERR;
299 }
300 break;
301
302 case LTC_ASN1_UTCTIME:
303 z = inlen;
304 if ((err = der_decode_utctime(in + x, &z, data)) != CRYPT_OK) {
305 if (!ordered || list[i].optional) { continue; }
306 goto LBL_ERR;
307 }
308 break;
309
310 case LTC_ASN1_GENERALIZEDTIME:
311 z = inlen;
312 if ((err = der_decode_generalizedtime(in + x, &z, data)) != CRYPT_OK) {
313 if (!ordered || list[i].optional) { continue; }
314 goto LBL_ERR;
315 }
316 break;
317
318 case LTC_ASN1_SET:
319 z = inlen;
320 if ((err = der_decode_set(in + x, z, data, size)) != CRYPT_OK) {
321 if (!ordered || list[i].optional) { continue; }
322 goto LBL_ERR;
323 }
324 if ((err = der_length_sequence(data, size, &z)) != CRYPT_OK) {
325 goto LBL_ERR;
326 }
327 break;
328
329 case LTC_ASN1_SETOF:
330 case LTC_ASN1_SEQUENCE:
331 /* detect if we have the right type */
332 if ((type == LTC_ASN1_SETOF && (in[x] & 0x3F) != 0x31) || (type == LTC_ASN1_SEQUENCE && (in[x] & 0x3F) != 0x30)) {
333 err = CRYPT_INVALID_PACKET;
334 goto LBL_ERR;
335 }
336
337 z = inlen;
338 err = der_decode_sequence_ex(in + x, z, data, size, flags);
339 if (err == CRYPT_INPUT_TOO_LONG) {
340 seq_err = CRYPT_INPUT_TOO_LONG;
341 err = CRYPT_OK;
342 }
343 if (err != CRYPT_OK) {
344 if (!ordered || list[i].optional) { continue; }
345 goto LBL_ERR;
346 }
347 if ((err = der_length_sequence(data, size, &z)) != CRYPT_OK) {
348 goto LBL_ERR;
349 }
350 break;
351
352 case LTC_ASN1_CUSTOM_TYPE:
353 z = inlen;
354 err = der_decode_custom_type(in + x, z, &list[i]);
355 if (err == CRYPT_INPUT_TOO_LONG) {
356 seq_err = CRYPT_INPUT_TOO_LONG;
357 err = CRYPT_OK;
358 }
359 if (err != CRYPT_OK) {
360 if (!ordered || list[i].optional) { continue; }
361 goto LBL_ERR;
362 }
363 if ((err = der_length_custom_type(&list[i], &z, NULL)) != CRYPT_OK) {
364 goto LBL_ERR;
365 }
366 break;
367
368 case LTC_ASN1_CHOICE:
369 z = inlen;
370 if ((err = der_decode_choice(in + x, &z, data, size)) != CRYPT_OK) {
371 if (!ordered || list[i].optional) { continue; }
372 goto LBL_ERR;
373 }
374 break;
375
376 case LTC_ASN1_EOL:
377 err = CRYPT_INVALID_ARG;
378 goto LBL_ERR;
379 }
380 x += z;
381 inlen -= z;
382 list[i].used = 1;
383 if (!ordered) {
384 /* restart the decoder */
385 i = -1;
386 }
387 }
388
389 for (i = 0; i < (int)outlen; i++) {
390 if (list[i].used == 0 && list[i].optional == 0) {
391 err = CRYPT_INVALID_PACKET;
392 goto LBL_ERR;
393 }
394 }
395
396 if (blksize == x && seq_err == CRYPT_OK && inlen == 0) {
397 /* everything decoded and no errors in nested sequences */
398 err = CRYPT_OK;
399 } else if (blksize == x && seq_err == CRYPT_INPUT_TOO_LONG && inlen == 0) {
400 /* a sequence reported too-long input, but now we've decoded everything */
401 err = CRYPT_OK;
402 } else if (blksize != x && ((flags & LTC_DER_SEQ_STRICT) == LTC_DER_SEQ_STRICT)) {
403 err = CRYPT_INVALID_PACKET;
404 } else {
405 err = CRYPT_INPUT_TOO_LONG;
406 }
407
408 LBL_ERR:
409 if (in_new != NULL) {
410 XFREE(in_new);
411 }
412 return err;
413 }
414
415 #endif
416
417 /* ref: $Format:%D$ */
418 /* git commit: $Format:%H$ */
419 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10
11 /**
12 @file der_encode_custom_type.c
13 ASN.1 DER, encode a Custom Type, Steffen Jaeckel
14 */
15
16 #ifdef LTC_DER
17
18 /**
19 Encode a Custom Type
20
21 This function is a bit special compared to the others, as it requires the
22 root-ltc_asn1_list where the type is defined.
23
24 @param root The root of the list of items to encode
25 @param out [out] The destination
26 @param outlen [in/out] The size of the output
27 @return CRYPT_OK on success
28 */
29 int der_encode_custom_type(const ltc_asn1_list *root,
30 unsigned char *out, unsigned long *outlen)
31 {
32 int err;
33 ltc_asn1_type type;
34 const ltc_asn1_list *list;
35 unsigned long size, x, y, z, i, inlen, id_len;
36 void *data;
37
38 LTC_ARGCHK(root != NULL);
39 LTC_ARGCHK(out != NULL);
40 LTC_ARGCHK(outlen != NULL);
41
42 /* get size of output that will be required */
43 y = 0; z = 0;
44 if ((err = der_length_custom_type(root, &y, &z)) != CRYPT_OK) return CRYPT_INVALID_ARG;
45
46 /* too big ? */
47 if (*outlen < y) {
48 *outlen = y;
49 err = CRYPT_BUFFER_OVERFLOW;
50 goto LBL_ERR;
51 }
52
53 /* get length of the identifier, so we know the offset where to start writing */
54 if ((err = der_length_asn1_identifier(root, &id_len)) != CRYPT_OK) return CRYPT_INVALID_ARG;
55 x = id_len;
56
57
58 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
59 list = root;
60 inlen = 1;
61 /* In case it's a PRIMITIVE type we encode directly to the output
62 * but leave space for a potentially longer identifier as it will
63 * simply be replaced afterwards.
64 */
65 x -= 1;
66 } else {
67 list = root->data;
68 inlen = root->size;
69 /* store length, identifier will be added later */
70 y = *outlen - x;
71 if ((err = der_encode_asn1_length(z, &out[x], &y)) != CRYPT_OK) {
72 goto LBL_ERR;
73 }
74 x += y;
75 }
76
77 /* store data */
78 *outlen -= x;
79 for (i = 0; i < inlen; i++) {
80 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
81 type = (ltc_asn1_type)list[i].used;
82 } else {
83 type = list[i].type;
84 }
85 size = list[i].size;
86 data = list[i].data;
87
88 if (type == LTC_ASN1_EOL) {
89 break;
90 }
91
92 switch (type) {
93 case LTC_ASN1_BOOLEAN:
94 z = *outlen;
95 if ((err = der_encode_boolean(*((int *)data), out + x, &z)) != CRYPT_OK) {
96 goto LBL_ERR;
97 }
98 break;
99
100 case LTC_ASN1_INTEGER:
101 z = *outlen;
102 if ((err = der_encode_integer(data, out + x, &z)) != CRYPT_OK) {
103 goto LBL_ERR;
104 }
105 break;
106
107 case LTC_ASN1_SHORT_INTEGER:
108 z = *outlen;
109 if ((err = der_encode_short_integer(*((unsigned long*)data), out + x, &z)) != CRYPT_OK) {
110 goto LBL_ERR;
111 }
112 break;
113
114 case LTC_ASN1_BIT_STRING:
115 z = *outlen;
116 if ((err = der_encode_bit_string(data, size, out + x, &z)) != CRYPT_OK) {
117 goto LBL_ERR;
118 }
119 break;
120
121 case LTC_ASN1_RAW_BIT_STRING:
122 z = *outlen;
123 if ((err = der_encode_raw_bit_string(data, size, out + x, &z)) != CRYPT_OK) {
124 goto LBL_ERR;
125 }
126 break;
127
128 case LTC_ASN1_OCTET_STRING:
129 z = *outlen;
130 if ((err = der_encode_octet_string(data, size, out + x, &z)) != CRYPT_OK) {
131 goto LBL_ERR;
132 }
133 break;
134
135 case LTC_ASN1_NULL:
136 out[x] = 0x05;
137 out[x+1] = 0x00;
138 z = 2;
139 break;
140
141 case LTC_ASN1_OBJECT_IDENTIFIER:
142 z = *outlen;
143 if ((err = der_encode_object_identifier(data, size, out + x, &z)) != CRYPT_OK) {
144 goto LBL_ERR;
145 }
146 break;
147
148 case LTC_ASN1_IA5_STRING:
149 z = *outlen;
150 if ((err = der_encode_ia5_string(data, size, out + x, &z)) != CRYPT_OK) {
151 goto LBL_ERR;
152 }
153 break;
154
155 case LTC_ASN1_PRINTABLE_STRING:
156 z = *outlen;
157 if ((err = der_encode_printable_string(data, size, out + x, &z)) != CRYPT_OK) {
158 goto LBL_ERR;
159 }
160 break;
161
162 case LTC_ASN1_UTF8_STRING:
163 z = *outlen;
164 if ((err = der_encode_utf8_string(data, size, out + x, &z)) != CRYPT_OK) {
165 goto LBL_ERR;
166 }
167 break;
168
169 case LTC_ASN1_UTCTIME:
170 z = *outlen;
171 if ((err = der_encode_utctime(data, out + x, &z)) != CRYPT_OK) {
172 goto LBL_ERR;
173 }
174 break;
175
176 case LTC_ASN1_GENERALIZEDTIME:
177 z = *outlen;
178 if ((err = der_encode_generalizedtime(data, out + x, &z)) != CRYPT_OK) {
179 goto LBL_ERR;
180 }
181 break;
182
183 case LTC_ASN1_SET:
184 z = *outlen;
185 if ((err = der_encode_set(data, size, out + x, &z)) != CRYPT_OK) {
186 goto LBL_ERR;
187 }
188 break;
189
190 case LTC_ASN1_SETOF:
191 z = *outlen;
192 if ((err = der_encode_setof(data, size, out + x, &z)) != CRYPT_OK) {
193 goto LBL_ERR;
194 }
195 break;
196
197 case LTC_ASN1_SEQUENCE:
198 z = *outlen;
199 if ((err = der_encode_sequence_ex(data, size, out + x, &z, type)) != CRYPT_OK) {
200 goto LBL_ERR;
201 }
202 break;
203
204 case LTC_ASN1_CUSTOM_TYPE:
205 z = *outlen;
206 if ((err = der_encode_custom_type(&list[i], out + x, &z)) != CRYPT_OK) {
207 goto LBL_ERR;
208 }
209 break;
210
211 case LTC_ASN1_CHOICE:
212 case LTC_ASN1_EOL:
213 case LTC_ASN1_TELETEX_STRING:
214 err = CRYPT_INVALID_ARG;
215 goto LBL_ERR;
216 }
217
218
219 x += z;
220 *outlen -= z;
221 }
222
223 if ((err = der_encode_asn1_identifier(root, out, &id_len)) != CRYPT_OK) {
224 goto LBL_ERR;
225 }
226 *outlen = x;
227 err = CRYPT_OK;
228
229 LBL_ERR:
230 return err;
231 }
232
233 #endif
234
235 /* ref: $Format:%D$ */
236 /* git commit: $Format:%H$ */
237 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_length_custom_type.c
12 ASN.1 DER, length of a custom type, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16
17 /**
18 Get the length of a DER custom type
19
20 This function is a bit special compared to the others, as it requires the
21 root-ltc_asn1_list where the type is defined.
22
23 @param root The root of the struct to encode
24 @param outlen [out] The length required in octets to store it
25 @param payloadlen [out] The length of the payload in octets
26 @return CRYPT_OK on success
27 */
28 int der_length_custom_type(const ltc_asn1_list *root, unsigned long *outlen, unsigned long *payloadlen)
29 {
30 int err;
31 const ltc_asn1_list *list;
32 ltc_asn1_type type;
33 unsigned long size, x, y, i, inlen, id_len;
34 void *data;
35
36 LTC_ARGCHK(root != NULL);
37 LTC_ARGCHK(outlen != NULL);
38
39 /* get size of output that will be required */
40 if ((err = der_length_asn1_identifier(root, &id_len)) != CRYPT_OK) {
41 return err;
42 }
43 y = id_len;
44
45 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
46 list = root;
47 inlen = 1;
48 } else {
49 list = root->data;
50 inlen = root->size;
51 }
52 for (i = 0; i < inlen; i++) {
53 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
54 type = (ltc_asn1_type)list[i].used;
55 } else {
56 type = list[i].type;
57 }
58 size = list[i].size;
59 data = list[i].data;
60
61 if (type == LTC_ASN1_EOL) {
62 break;
63 }
64
65 /* some items may be optional during import */
66 if (!list[i].used && list[i].optional) continue;
67
68 switch (type) {
69 case LTC_ASN1_BOOLEAN:
70 if ((err = der_length_boolean(&x)) != CRYPT_OK) {
71 goto LBL_ERR;
72 }
73 y += x;
74 break;
75
76 case LTC_ASN1_INTEGER:
77 if ((err = der_length_integer(data, &x)) != CRYPT_OK) {
78 goto LBL_ERR;
79 }
80 y += x;
81 break;
82
83 case LTC_ASN1_SHORT_INTEGER:
84 if ((err = der_length_short_integer(*((unsigned long *)data), &x)) != CRYPT_OK) {
85 goto LBL_ERR;
86 }
87 y += x;
88 break;
89
90 case LTC_ASN1_BIT_STRING:
91 case LTC_ASN1_RAW_BIT_STRING:
92 if ((err = der_length_bit_string(size, &x)) != CRYPT_OK) {
93 goto LBL_ERR;
94 }
95 y += x;
96 break;
97
98 case LTC_ASN1_OCTET_STRING:
99 if ((err = der_length_octet_string(size, &x)) != CRYPT_OK) {
100 goto LBL_ERR;
101 }
102 y += x;
103 break;
104
105 case LTC_ASN1_NULL:
106 y += 2;
107 break;
108
109 case LTC_ASN1_OBJECT_IDENTIFIER:
110 if ((err = der_length_object_identifier(data, size, &x)) != CRYPT_OK) {
111 goto LBL_ERR;
112 }
113 y += x;
114 break;
115
116 case LTC_ASN1_IA5_STRING:
117 if ((err = der_length_ia5_string(data, size, &x)) != CRYPT_OK) {
118 goto LBL_ERR;
119 }
120 y += x;
121 break;
122
123 case LTC_ASN1_TELETEX_STRING:
124 if ((err = der_length_teletex_string(data, size, &x)) != CRYPT_OK) {
125 goto LBL_ERR;
126 }
127 y += x;
128 break;
129
130 case LTC_ASN1_PRINTABLE_STRING:
131 if ((err = der_length_printable_string(data, size, &x)) != CRYPT_OK) {
132 goto LBL_ERR;
133 }
134 y += x;
135 break;
136
137 case LTC_ASN1_UTCTIME:
138 if ((err = der_length_utctime(data, &x)) != CRYPT_OK) {
139 goto LBL_ERR;
140 }
141 y += x;
142 break;
143
144 case LTC_ASN1_GENERALIZEDTIME:
145 if ((err = der_length_generalizedtime(data, &x)) != CRYPT_OK) {
146 goto LBL_ERR;
147 }
148 y += x;
149 break;
150
151 case LTC_ASN1_UTF8_STRING:
152 if ((err = der_length_utf8_string(data, size, &x)) != CRYPT_OK) {
153 goto LBL_ERR;
154 }
155 y += x;
156 break;
157
158 case LTC_ASN1_CUSTOM_TYPE:
159 if ((err = der_length_custom_type(&list[i], &x, NULL)) != CRYPT_OK) {
160 goto LBL_ERR;
161 }
162 y += x;
163 break;
164
165 case LTC_ASN1_SET:
166 case LTC_ASN1_SETOF:
167 case LTC_ASN1_SEQUENCE:
168 if ((err = der_length_sequence(data, size, &x)) != CRYPT_OK) {
169 goto LBL_ERR;
170 }
171 y += x;
172 break;
173
174 case LTC_ASN1_CHOICE:
175 case LTC_ASN1_EOL:
176 err = CRYPT_INVALID_ARG;
177 goto LBL_ERR;
178 }
179 }
180
181 if (root->pc == LTC_ASN1_PC_PRIMITIVE) {
182 /* In case it's a PRIMITIVE element we're going
183 * to only replace the identifier of the one element
184 * by the custom identifier.
185 */
186 y -= 1;
187 if (payloadlen != NULL) {
188 *payloadlen = y - id_len;
189 }
190 } else {
191 /* calc length of length */
192 if ((err = der_length_asn1_length(y, &x)) != CRYPT_OK) {
193 goto LBL_ERR;
194 }
195 if (payloadlen != NULL) {
196 *payloadlen = y - id_len;
197 }
198 y += x;
199 }
200
201 /* store size */
202 *outlen = y;
203
204 LBL_ERR:
205 return err;
206 }
207
208 #endif
209
210 /* ref: $Format:%D$ */
211 /* git commit: $Format:%H$ */
212 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_asn1_maps.c
12 ASN.1 DER, a collection of maps to convert between different representations, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16
17 /**
18 A Map from ltc_asn1_type to the regularly used ASN.1 identifier
19 */
20 const int der_asn1_type_to_identifier_map[] =
21 {
22 /* 0 */
23 -1, /* LTC_ASN1_EOL, */
24 1, /* LTC_ASN1_BOOLEAN, */
25 2, /* LTC_ASN1_INTEGER, */
26 2, /* LTC_ASN1_SHORT_INTEGER, */
27 3, /* LTC_ASN1_BIT_STRING, */
28 /* 5 */
29 4, /* LTC_ASN1_OCTET_STRING, */
30 5, /* LTC_ASN1_NULL, */
31 6, /* LTC_ASN1_OBJECT_IDENTIFIER, */
32 22, /* LTC_ASN1_IA5_STRING, */
33 19, /* LTC_ASN1_PRINTABLE_STRING, */
34 /* 10 */
35 12, /* LTC_ASN1_UTF8_STRING, */
36 23, /* LTC_ASN1_UTCTIME, */
37 -1, /* LTC_ASN1_CHOICE, */
38 48, /* LTC_ASN1_SEQUENCE, */
39 49, /* LTC_ASN1_SET, */
40 /* 15 */
41 49, /* LTC_ASN1_SETOF, */
42 3, /* LTC_ASN1_RAW_BIT_STRING, */
43 20, /* LTC_ASN1_TELETEX_STRING, */
44 24, /* LTC_ASN1_GENERALIZEDTIME, */
45 -1, /* LTC_ASN1_CUSTOM_TYPE, */
46 };
47 const unsigned long der_asn1_type_to_identifier_map_sz = sizeof(der_asn1_type_to_identifier_map)/sizeof(der_asn1_type_to_identifier_map[0]);
48
49 /**
50 A Map from the ASN.1 Class to its string
51 */
52 const char* der_asn1_class_to_string_map[] =
53 {
54 "UNIVERSAL",
55 "APPLICATION",
56 "CONTEXT-SPECIFIC",
57 "PRIVATE",
58 };
59 const unsigned long der_asn1_class_to_string_map_sz = sizeof(der_asn1_class_to_string_map)/sizeof(der_asn1_class_to_string_map[0]);
60
61 /**
62 A Map from the ASN.1 P/C-bit to its string
63 */
64 const char* der_asn1_pc_to_string_map[] =
65 {
66 "PRIMITIVE",
67 "CONSTRUCTED",
68 };
69 const unsigned long der_asn1_pc_to_string_map_sz = sizeof(der_asn1_pc_to_string_map)/sizeof(der_asn1_pc_to_string_map[0]);
70
71 /**
72 A Map from the ASN.1 tag to its string
73 */
74 const char* der_asn1_tag_to_string_map[] =
75 {
76 "Reserved for use by the encoding rules",
77 "Boolean type",
78 "Integer type",
79 "Bitstring type",
80 "Octetstring type",
81 "Null type",
82 "Object identifier type",
83 "Object descriptor type",
84 "External type and Instance-of type",
85 "Real type",
86 "Enumerated type",
87 "Embedded-pdv type",
88 "UTF8String type",
89 "Relative object identifier type",
90 "The time type",
91 "Reserved for future editions of this Recommendation | International Standard",
92 "Sequence and Sequence-of types",
93 "Set and Set-of types",
94 "NumericString type",
95 "PrintableString type",
96 "TeletexString (T61String) type",
97 "VideotexString type",
98 "IA5String type",
99 "UTCTime type",
100 "GeneralizedTime type",
101 "GraphicString type",
102 "VisibleString (ISO646String) type",
103 "GeneralString type",
104 "UniversalString type",
105 "UnrestrictedCharacterString type",
106 "BMPString type",
107 "Date type",
108 "TimeOfDay type",
109 "DateTime type",
110 "Duration type",
111 "OID internationalized resource identifier type",
112 "Relative OID internationalized resource identifier type",
113 };
114 const unsigned long der_asn1_tag_to_string_map_sz = sizeof(der_asn1_tag_to_string_map)/sizeof(der_asn1_tag_to_string_map[0]);
115
116 /**
117 A Map from ASN.1 Tags to ltc_asn1_type
118 */
119 const ltc_asn1_type der_asn1_tag_to_type_map[] =
120 {
121 /* 0 */
122 LTC_ASN1_EOL, /* Reserved for use by the encoding rules */
123 LTC_ASN1_BOOLEAN, /* Boolean type */
124 LTC_ASN1_INTEGER, /* Integer type */
125 LTC_ASN1_BIT_STRING, /* Bitstring type */
126 LTC_ASN1_OCTET_STRING, /* Octetstring type */
127 /* 5 */
128 LTC_ASN1_NULL, /* Null type */
129 LTC_ASN1_OBJECT_IDENTIFIER, /* Object identifier type */
130 LTC_ASN1_CUSTOM_TYPE, /* Object descriptor type */
131 LTC_ASN1_CUSTOM_TYPE, /* External type and Instance-of type */
132 LTC_ASN1_CUSTOM_TYPE, /* Real type */
133 /* 10 */
134 LTC_ASN1_CUSTOM_TYPE, /* Enumerated type */
135 LTC_ASN1_CUSTOM_TYPE, /* Embedded-pdv type */
136 LTC_ASN1_UTF8_STRING, /* UTF8String type */
137 LTC_ASN1_CUSTOM_TYPE, /* Relative object identifier type */
138 LTC_ASN1_CUSTOM_TYPE, /* The time type */
139 /* 15 */
140 LTC_ASN1_EOL, /* Reserved for future editions of this Recommendation | International Standard */
141 LTC_ASN1_SEQUENCE, /* Sequence and Sequence-of types */
142 LTC_ASN1_SET, /* Set and Set-of types */
143 LTC_ASN1_CUSTOM_TYPE, /* NumericString types */
144 LTC_ASN1_PRINTABLE_STRING, /* PrintableString types */
145 /* 20 */
146 LTC_ASN1_TELETEX_STRING, /* TeletexString (T61String) types */
147 LTC_ASN1_CUSTOM_TYPE, /* VideotexString types */
148 LTC_ASN1_IA5_STRING, /* IA5String types */
149 LTC_ASN1_UTCTIME, /* UTCTime types */
150 LTC_ASN1_GENERALIZEDTIME, /* GeneralizedTime types */
151 /* 25 */
152 LTC_ASN1_CUSTOM_TYPE, /* GraphicString types */
153 LTC_ASN1_CUSTOM_TYPE, /* VisibleString (ISO646String) types */
154 LTC_ASN1_CUSTOM_TYPE, /* GeneralString types */
155 LTC_ASN1_CUSTOM_TYPE, /* UniversalString types */
156 LTC_ASN1_CUSTOM_TYPE, /* UnrestrictedCharacterString types */
157 /* 30 */
158 LTC_ASN1_CUSTOM_TYPE, /* BMPString types */
159 };
160 const unsigned long der_asn1_tag_to_type_map_sz = sizeof(der_asn1_tag_to_type_map)/sizeof(der_asn1_tag_to_type_map[0]);
161
162 #endif
163
164 /* ref: $Format:%D$ */
165 /* git commit: $Format:%H$ */
166 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_decode_asn1_identifier.c
12 ASN.1 DER, decode the ASN.1 Identifier, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /* c.f. X.680 & X.690, some decisions backed by X.690 ch. 10.2 */
17 static const unsigned char tag_constructed_map[] =
18 {
19 /* 0 */
20 255,
21 LTC_ASN1_PC_PRIMITIVE,
22 LTC_ASN1_PC_PRIMITIVE,
23 LTC_ASN1_PC_PRIMITIVE,
24 LTC_ASN1_PC_PRIMITIVE,
25 /* 5 */
26 LTC_ASN1_PC_PRIMITIVE,
27 LTC_ASN1_PC_PRIMITIVE,
28 LTC_ASN1_PC_PRIMITIVE,
29 LTC_ASN1_PC_PRIMITIVE,
30 LTC_ASN1_PC_PRIMITIVE,
31 /* 10 */
32 LTC_ASN1_PC_PRIMITIVE,
33 LTC_ASN1_PC_PRIMITIVE,
34 LTC_ASN1_PC_PRIMITIVE,
35 LTC_ASN1_PC_PRIMITIVE,
36 LTC_ASN1_PC_PRIMITIVE,
37 /* 15 */
38 255,
39 LTC_ASN1_PC_CONSTRUCTED,
40 LTC_ASN1_PC_CONSTRUCTED,
41 LTC_ASN1_PC_PRIMITIVE,
42 LTC_ASN1_PC_PRIMITIVE,
43 /* 20 */
44 LTC_ASN1_PC_PRIMITIVE,
45 LTC_ASN1_PC_PRIMITIVE,
46 LTC_ASN1_PC_PRIMITIVE,
47 LTC_ASN1_PC_PRIMITIVE,
48 LTC_ASN1_PC_PRIMITIVE,
49 /* 25 */
50 LTC_ASN1_PC_PRIMITIVE,
51 LTC_ASN1_PC_PRIMITIVE,
52 LTC_ASN1_PC_PRIMITIVE,
53 LTC_ASN1_PC_PRIMITIVE,
54 };
55 static const unsigned long tag_constructed_map_sz = sizeof(tag_constructed_map)/sizeof(tag_constructed_map[0]);
56
57 /**
58 Decode the ASN.1 Identifier
59 @param id Where to store the decoded Identifier
60 @param in Where to read the Identifier from
61 @param inlen [in/out] The size of in available/read
62 @return CRYPT_OK if successful
63 */
64 int der_decode_asn1_identifier(const unsigned char *in, unsigned long *inlen, ltc_asn1_list *id)
65 {
66 ulong64 tmp;
67 unsigned long tag_len;
68 int err;
69
70 LTC_ARGCHK(id != NULL);
71 LTC_ARGCHK(in != NULL);
72 LTC_ARGCHK(inlen != NULL);
73
74 if (*inlen == 0) {
75 return CRYPT_BUFFER_OVERFLOW;
76 }
77
78 tag_len = 1;
79 id->class = (in[0] >> 6) & 0x3;
80 id->pc = (in[0] >> 5) & 0x1;
81 id->tag = in[0] & 0x1f;
82
83 err = CRYPT_OK;
84 if (id->tag == 0x1f) {
85 id->tag = 0;
86 do {
87 if (*inlen < tag_len) {
88 /* break the loop and trigger the BOF error-code */
89 tmp = 0xff;
90 break;
91 }
92 id->tag <<= 7;
93 id->tag |= in[tag_len] & 0x7f;
94 tmp = in[tag_len] & 0x80;
95 tag_len++;
96 } while ((tmp != 0) && (tag_len < 10));
97
98 if (tmp != 0) {
99 err = CRYPT_BUFFER_OVERFLOW;
100 } else if (id->tag < 0x1f) {
101 err = CRYPT_PK_ASN1_ERROR;
102 }
103 }
104
105 if (err != CRYPT_OK) {
106 id->pc = 0;
107 id->class = 0;
108 id->tag = 0;
109 } else {
110 *inlen = tag_len;
111 if ((id->class == LTC_ASN1_CL_UNIVERSAL) &&
112 (id->tag < der_asn1_tag_to_type_map_sz) &&
113 (id->tag < tag_constructed_map_sz) &&
114 (id->pc == tag_constructed_map[id->tag])) {
115 id->type = der_asn1_tag_to_type_map[id->tag];
116 } else {
117 if ((id->class == LTC_ASN1_CL_UNIVERSAL) && (id->tag == 0)) {
118 id->type = LTC_ASN1_EOL;
119 } else {
120 id->type = LTC_ASN1_CUSTOM_TYPE;
121 }
122 }
123 }
124
125 return CRYPT_OK;
126 }
127
128 #endif
129
130 /* ref: $Format:%D$ */
131 /* git commit: $Format:%H$ */
132 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_decode_asn1_length.c
12 ASN.1 DER, decode the ASN.1 Length field, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /**
17 Decode the ASN.1 Length field
18 @param in Where to read the length field from
19 @param inlen [in/out] The size of in available/read
20 @param outlen [out] The decoded ASN.1 length
21 @return CRYPT_OK if successful
22 */
23 int der_decode_asn1_length(const unsigned char *in, unsigned long *inlen, unsigned long *outlen)
24 {
25 unsigned long real_len, decoded_len, offset, i;
26
27 LTC_ARGCHK(in != NULL);
28 LTC_ARGCHK(inlen != NULL);
29
30 if (*inlen < 1) {
31 return CRYPT_BUFFER_OVERFLOW;
32 }
33
34 real_len = in[0];
35
36 if (real_len < 128) {
37 decoded_len = real_len;
38 offset = 1;
39 } else {
40 real_len &= 0x7F;
41 if (real_len == 0) {
42 return CRYPT_PK_ASN1_ERROR;
43 } else if (real_len > sizeof(decoded_len)) {
44 return CRYPT_OVERFLOW;
45 } else if (real_len > (*inlen - 1)) {
46 return CRYPT_BUFFER_OVERFLOW;
47 }
48 decoded_len = 0;
49 offset = 1 + real_len;
50 for (i = 0; i < real_len; i++) {
51 decoded_len = (decoded_len << 8) | in[1 + i];
52 }
53 }
54
55 if (outlen != NULL) *outlen = decoded_len;
56 if (decoded_len > (*inlen - offset)) return CRYPT_OVERFLOW;
57 *inlen = offset;
58
59 return CRYPT_OK;
60 }
61
62 #endif
63
64 /* ref: $Format:%D$ */
65 /* git commit: $Format:%H$ */
66 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_encode_asn1_identifier.c
12 ASN.1 DER, encode the ASN.1 Identifier, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /**
17 Encode the ASN.1 Identifier
18 @param id The ASN.1 Identifer to encode
19 @param out Where to write the identifier to
20 @param outlen [in/out] The size of out available/written
21 @return CRYPT_OK if successful
22 */
23 int der_encode_asn1_identifier(const ltc_asn1_list *id, unsigned char *out, unsigned long *outlen)
24 {
25 ulong64 tmp;
26 unsigned long tag_len;
27
28 LTC_ARGCHK(id != NULL);
29 LTC_ARGCHK(outlen != NULL);
30
31 if (id->type != LTC_ASN1_CUSTOM_TYPE) {
32 if ((unsigned)id->type >= der_asn1_type_to_identifier_map_sz) {
33 return CRYPT_INVALID_ARG;
34 }
35 if (der_asn1_type_to_identifier_map[id->type] == -1) {
36 return CRYPT_INVALID_ARG;
37 }
38 if (out != NULL) {
39 *out = der_asn1_type_to_identifier_map[id->type];
40 }
41 *outlen = 1;
42 return CRYPT_OK;
43 } else {
44 if (id->class < LTC_ASN1_CL_UNIVERSAL || id->class > LTC_ASN1_CL_PRIVATE) {
45 return CRYPT_INVALID_ARG;
46 }
47 if (id->pc < LTC_ASN1_PC_PRIMITIVE || id->pc > LTC_ASN1_PC_CONSTRUCTED) {
48 return CRYPT_INVALID_ARG;
49 }
50 if (id->tag > (ULONG_MAX >> (8 + 7))) {
51 return CRYPT_INVALID_ARG;
52 }
53 }
54
55 if (out != NULL) {
56 if (*outlen < 1) {
57 return CRYPT_BUFFER_OVERFLOW;
58 }
59
60 out[0] = id->class << 6 | id->pc << 5;
61 }
62
63 if (id->tag < 0x1f) {
64 if (out != NULL) {
65 out[0] |= id->tag & 0x1f;
66 }
67 *outlen = 1;
68 } else {
69 tag_len = 0;
70 tmp = id->tag;
71 do {
72 tag_len++;
73 tmp >>= 7;
74 } while (tmp);
75
76 if (out != NULL) {
77 if (*outlen < tag_len + 1) {
78 return CRYPT_BUFFER_OVERFLOW;
79 }
80 out[0] |= 0x1f;
81 for (tmp = 1; tmp <= tag_len; ++tmp) {
82 out[tmp] = ((id->tag >> (7 * (tag_len - tmp))) & 0x7f) | 0x80;
83 }
84 out[tag_len] &= ~0x80;
85 }
86 *outlen = tag_len + 1;
87 }
88
89 return CRYPT_OK;
90 }
91
92 #endif
93
94 /* ref: $Format:%D$ */
95 /* git commit: $Format:%H$ */
96 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_encode_asn1_length.c
12 ASN.1 DER, encode the ASN.1 length field, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /**
17 Encode the ASN.1 length field
18 @param len The length to encode
19 @param out Where to write the length field to
20 @param outlen [in/out] The size of out available/written
21 @return CRYPT_OK if successful
22 */
23 int der_encode_asn1_length(unsigned long len, unsigned char *out, unsigned long *outlen)
24 {
25 unsigned long x, y;
26
27 LTC_ARGCHK(outlen != NULL);
28
29 x = len;
30 y = 0;
31
32 while(x != 0) {
33 y++;
34 x >>= 8;
35 }
36 if (y == 0) {
37 return CRYPT_PK_ASN1_ERROR;
38 }
39
40 if (out == NULL) {
41 if (len < 128) {
42 x = y;
43 } else {
44 x = y + 1;
45 }
46 } else {
47 if (*outlen < y) {
48 return CRYPT_BUFFER_OVERFLOW;
49 }
50 x = 0;
51 if (len < 128) {
52 out[x++] = (unsigned char)len;
53 } else if (len <= 0xffUL) {
54 out[x++] = 0x81;
55 out[x++] = (unsigned char)len;
56 } else if (len <= 0xffffUL) {
57 out[x++] = 0x82;
58 out[x++] = (unsigned char)((len>>8UL)&255);
59 out[x++] = (unsigned char)(len&255);
60 } else if (len <= 0xffffffUL) {
61 out[x++] = 0x83;
62 out[x++] = (unsigned char)((len>>16UL)&255);
63 out[x++] = (unsigned char)((len>>8UL)&255);
64 out[x++] = (unsigned char)(len&255);
65 #if ULONG_MAX != ULLONG_MAX
66 } else {
67 out[x++] = 0x84;
68 out[x++] = (unsigned char)((len>>24UL)&255);
69 out[x++] = (unsigned char)((len>>16UL)&255);
70 out[x++] = (unsigned char)((len>>8UL)&255);
71 out[x++] = (unsigned char)(len&255);
72 }
73 #else
74 } else if (len <= 0xffffffffUL) {
75 out[x++] = 0x84;
76 out[x++] = (unsigned char)((len>>24UL)&255);
77 out[x++] = (unsigned char)((len>>16UL)&255);
78 out[x++] = (unsigned char)((len>>8UL)&255);
79 out[x++] = (unsigned char)(len&255);
80 } else if (len <= 0xffffffffffULL) {
81 out[x++] = 0x85;
82 out[x++] = (unsigned char)((len>>32ULL)&255);
83 out[x++] = (unsigned char)((len>>24ULL)&255);
84 out[x++] = (unsigned char)((len>>16ULL)&255);
85 out[x++] = (unsigned char)((len>>8ULL)&255);
86 out[x++] = (unsigned char)(len&255);
87 } else if (len <= 0xffffffffffffULL) {
88 out[x++] = 0x86;
89 out[x++] = (unsigned char)((len>>40ULL)&255);
90 out[x++] = (unsigned char)((len>>32ULL)&255);
91 out[x++] = (unsigned char)((len>>24ULL)&255);
92 out[x++] = (unsigned char)((len>>16ULL)&255);
93 out[x++] = (unsigned char)((len>>8ULL)&255);
94 out[x++] = (unsigned char)(len&255);
95 } else if (len <= 0xffffffffffffffULL) {
96 out[x++] = 0x87;
97 out[x++] = (unsigned char)((len>>48ULL)&255);
98 out[x++] = (unsigned char)((len>>40ULL)&255);
99 out[x++] = (unsigned char)((len>>32ULL)&255);
100 out[x++] = (unsigned char)((len>>24ULL)&255);
101 out[x++] = (unsigned char)((len>>16ULL)&255);
102 out[x++] = (unsigned char)((len>>8ULL)&255);
103 out[x++] = (unsigned char)(len&255);
104 } else {
105 out[x++] = 0x88;
106 out[x++] = (unsigned char)((len>>56ULL)&255);
107 out[x++] = (unsigned char)((len>>48ULL)&255);
108 out[x++] = (unsigned char)((len>>40ULL)&255);
109 out[x++] = (unsigned char)((len>>32ULL)&255);
110 out[x++] = (unsigned char)((len>>24ULL)&255);
111 out[x++] = (unsigned char)((len>>16ULL)&255);
112 out[x++] = (unsigned char)((len>>8ULL)&255);
113 out[x++] = (unsigned char)(len&255);
114 }
115 #endif
116 }
117 *outlen = x;
118
119 return CRYPT_OK;
120 }
121
122 #endif
123
124 /* ref: $Format:%D$ */
125 /* git commit: $Format:%H$ */
126 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_length_asn1_identifier.c
12 ASN.1 DER, determine the length when encoding the ASN.1 Identifier, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /**
17 Determine the length required when encoding the ASN.1 Identifier
18 @param id The ASN.1 identifier to encode
19 @param idlen [out] The required length to encode list
20 @return CRYPT_OK if successful
21 */
22
23 int der_length_asn1_identifier(const ltc_asn1_list *id, unsigned long *idlen)
24 {
25 return der_encode_asn1_identifier(id, NULL, idlen);
26 }
27
28 #endif
29
30 /* ref: $Format:%D$ */
31 /* git commit: $Format:%H$ */
32 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_length_asn1_length.c
12 ASN.1 DER, determine the length of the ASN.1 length field, Steffen Jaeckel
13 */
14
15 #ifdef LTC_DER
16 /**
17 Determine the length required to encode len in the ASN.1 length field
18 @param len The length to encode
19 @param outlen [out] The length that's required to store len
20 @return CRYPT_OK if successful
21 */
22 int der_length_asn1_length(unsigned long len, unsigned long *outlen)
23 {
24 return der_encode_asn1_length(len, NULL, outlen);
25 }
26
27 #endif
28
29 /* ref: $Format:%D$ */
30 /* git commit: $Format:%H$ */
31 /* commit time: $Format:%ai$ */
2727 unsigned char *out, unsigned long *outlen)
2828 {
2929 unsigned long x, y, len;
30 int t;
30 int t, err;
3131
3232 LTC_ARGCHK(in != NULL);
3333 LTC_ARGCHK(out != NULL);
4444 }
4545 x = 1;
4646
47 /* decode the length */
48 if (in[x] & 0x80) {
49 /* valid # of bytes in length are 1,2,3 */
50 y = in[x] & 0x7F;
51 if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
52 return CRYPT_INVALID_PACKET;
53 }
54
55 /* read the length in */
56 len = 0;
57 ++x;
58 while (y--) {
59 len = (len << 8) | in[x++];
60 }
61 } else {
62 len = in[x++] & 0x7F;
47 /* get the length of the data */
48 y = inlen - x;
49 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
50 return err;
6351 }
52 x += y;
6453
6554 /* is it too long? */
6655 if (len > *outlen) {
6857 return CRYPT_BUFFER_OVERFLOW;
6958 }
7059
71 if (len + x > inlen) {
60 if (len > (inlen - x)) {
7261 return CRYPT_INVALID_PACKET;
7362 }
7463
4646 /* encode the header+len */
4747 x = 0;
4848 out[x++] = 0x16;
49 if (inlen < 128) {
50 out[x++] = (unsigned char)inlen;
51 } else if (inlen < 256) {
52 out[x++] = 0x81;
53 out[x++] = (unsigned char)inlen;
54 } else if (inlen < 65536UL) {
55 out[x++] = 0x82;
56 out[x++] = (unsigned char)((inlen>>8)&255);
57 out[x++] = (unsigned char)(inlen&255);
58 } else if (inlen < 16777216UL) {
59 out[x++] = 0x83;
60 out[x++] = (unsigned char)((inlen>>16)&255);
61 out[x++] = (unsigned char)((inlen>>8)&255);
62 out[x++] = (unsigned char)(inlen&255);
63 } else {
64 return CRYPT_INVALID_ARG;
49 len = *outlen - x;
50 if ((err = der_encode_asn1_length(inlen, out + x, &len)) != CRYPT_OK) {
51 return err;
6552 }
53 x += len;
6654
6755 /* store octets */
6856 for (y = 0; y < inlen; y++) {
153153 int der_length_ia5_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen)
154154 {
155155 unsigned long x;
156 int err;
156157
157158 LTC_ARGCHK(outlen != NULL);
158159 LTC_ARGCHK(octets != NULL);
164165 }
165166 }
166167
167 if (noctets < 128) {
168 /* 16 LL DD DD DD ... */
169 *outlen = 2 + noctets;
170 } else if (noctets < 256) {
171 /* 16 81 LL DD DD DD ... */
172 *outlen = 3 + noctets;
173 } else if (noctets < 65536UL) {
174 /* 16 82 LL LL DD DD DD ... */
175 *outlen = 4 + noctets;
176 } else if (noctets < 16777216UL) {
177 /* 16 83 LL LL LL DD DD DD ... */
178 *outlen = 5 + noctets;
179 } else {
180 return CRYPT_INVALID_ARG;
168 if ((err = der_length_asn1_length(noctets, &x)) != CRYPT_OK) {
169 return err;
181170 }
171 *outlen = 1 + x + noctets;
182172
183173 return CRYPT_OK;
184174 }
2424 */
2525 int der_decode_integer(const unsigned char *in, unsigned long inlen, void *num)
2626 {
27 unsigned long x, y, z;
27 unsigned long x, y;
2828 int err;
2929
3030 LTC_ARGCHK(num != NULL);
4141 return CRYPT_INVALID_PACKET;
4242 }
4343
44 /* now decode the len stuff */
45 z = in[x++];
44 /* get the length of the data */
45 inlen -= x;
46 if ((err = der_decode_asn1_length(in + x, &inlen, &y)) != CRYPT_OK) {
47 return err;
48 }
49 x += inlen;
4650
47 if ((z & 0x80) == 0x00) {
48 /* short form */
49
50 /* will it overflow? */
51 if (x + z > inlen) {
52 return CRYPT_INVALID_PACKET;
53 }
54
55 /* no so read it */
56 if ((err = mp_read_unsigned_bin(num, (unsigned char *)in + x, z)) != CRYPT_OK) {
57 return err;
58 }
59 } else {
60 /* long form */
61 z &= 0x7F;
62
63 /* will number of length bytes overflow? (or > 4) */
64 if (((x + z) > inlen) || (z > 4) || (z == 0)) {
65 return CRYPT_INVALID_PACKET;
66 }
67
68 /* now read it in */
69 y = 0;
70 while (z--) {
71 y = ((unsigned long)(in[x++])) | (y << 8);
72 }
73
74 /* now will reading y bytes overrun? */
75 if ((x + y) > inlen) {
76 return CRYPT_INVALID_PACKET;
77 }
78
79 /* no so read it */
80 if ((err = mp_read_unsigned_bin(num, (unsigned char *)in + x, y)) != CRYPT_OK) {
81 return err;
82 }
51 if ((err = mp_read_unsigned_bin(num, (unsigned char *)in + x, y)) != CRYPT_OK) {
52 return err;
8353 }
8454
8555 /* see if it's negative */
2525 */
2626 int der_encode_integer(void *num, unsigned char *out, unsigned long *outlen)
2727 {
28 unsigned long tmplen, y;
28 unsigned long tmplen, y, len;
2929 int err, leading_zero;
3030
3131 LTC_ARGCHK(num != NULL);
6262
6363 /* now store initial data */
6464 *out++ = 0x02;
65 if (y < 128) {
66 /* short form */
67 *out++ = (unsigned char)y;
68 } else if (y < 256) {
69 *out++ = 0x81;
70 *out++ = (unsigned char)y;
71 } else if (y < 65536UL) {
72 *out++ = 0x82;
73 *out++ = (unsigned char)((y>>8)&255);
74 *out++ = (unsigned char)y;
75 } else if (y < 16777216UL) {
76 *out++ = 0x83;
77 *out++ = (unsigned char)((y>>16)&255);
78 *out++ = (unsigned char)((y>>8)&255);
79 *out++ = (unsigned char)y;
80 } else {
81 return CRYPT_INVALID_ARG;
65 len = *outlen - 1;
66 if ((err = der_encode_asn1_length(y, out, &len)) != CRYPT_OK) {
67 return err;
8268 }
69 out += len;
8370
8471 /* now store msbyte of zero if num is non-zero */
8572 if (leading_zero) {
2323 int der_length_integer(void *num, unsigned long *outlen)
2424 {
2525 unsigned long z, len;
26 int leading_zero;
26 int leading_zero, err;
2727
2828 LTC_ARGCHK(num != NULL);
2929 LTC_ARGCHK(outlen != NULL);
3939 }
4040
4141 /* size for bignum */
42 z = len = leading_zero + mp_unsigned_bin_size(num);
42 len = leading_zero + mp_unsigned_bin_size(num);
4343 } else {
4444 /* it's negative */
4545 /* find power of 2 that is a multiple of eight and greater than count bits */
4646 z = mp_count_bits(num);
4747 z = z + (8 - (z & 7));
4848 if (((mp_cnt_lsb(num)+1)==mp_count_bits(num)) && ((mp_count_bits(num)&7)==0)) --z;
49 len = z = z >> 3;
49 len = z >> 3;
5050 }
5151
52 /* now we need a length */
53 if (z < 128) {
54 /* short form */
55 ++len;
56 } else {
57 /* long form (relies on z != 0), assumes length bytes < 128 */
58 ++len;
52 if ((err = der_length_asn1_length(len, &z)) != CRYPT_OK) {
53 return err;
54 }
55 *outlen = 1 + z + len;
5956
60 while (z) {
61 ++len;
62 z >>= 8;
63 }
64 }
65
66 /* we need a 0x02 to indicate it's INTEGER */
67 ++len;
68
69 /* return length */
70 *outlen = len;
7157 return CRYPT_OK;
7258 }
7359
2525 unsigned long *words, unsigned long *outlen)
2626 {
2727 unsigned long x, y, t, len;
28 int err;
2829
2930 LTC_ARGCHK(in != NULL);
3031 LTC_ARGCHK(words != NULL);
3738
3839 /* must be room for at least two words */
3940 if (*outlen < 2) {
41 *outlen = 2;
4042 return CRYPT_BUFFER_OVERFLOW;
4143 }
4244
4648 return CRYPT_INVALID_PACKET;
4749 }
4850
49 /* get the length */
50 if (in[x] < 128) {
51 len = in[x++];
52 } else {
53 if (in[x] < 0x81 || in[x] > 0x82) {
54 return CRYPT_INVALID_PACKET;
55 }
56 y = in[x++] & 0x7F;
57 len = 0;
58 while (y--) {
59 len = (len << 8) | (unsigned long)in[x++];
60 }
51 /* get the length of the data */
52 y = inlen - x;
53 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
54 return err;
6155 }
56 x += y;
6257
63 if (len < 1 || (len + x) > inlen) {
58 if ((len == 0) || (len > (inlen - x))) {
6459 return CRYPT_INVALID_PACKET;
6560 }
6661
7267 if (!(in[x++] & 0x80)) {
7368 /* store t */
7469 if (y >= *outlen) {
75 return CRYPT_BUFFER_OVERFLOW;
70 y++;
71 } else {
72 if (y == 0) {
73 words[0] = t / 40;
74 words[1] = t % 40;
75 y = 2;
76 } else {
77 words[y++] = t;
78 }
7679 }
77 if (y == 0) {
78 words[0] = t / 40;
79 words[1] = t % 40;
80 y = 2;
81 } else {
82 words[y++] = t;
83 }
84 t = 0;
80 t = 0;
8581 }
8682 }
8783
84 if (y > *outlen) {
85 err = CRYPT_BUFFER_OVERFLOW;
86 } else {
87 err = CRYPT_OK;
88 }
89
8890 *outlen = y;
89 return CRYPT_OK;
91 return err;
9092 }
9193
9294 #endif
5454 /* store header + length */
5555 x = 0;
5656 out[x++] = 0x06;
57 if (z < 128) {
58 out[x++] = (unsigned char)z;
59 } else if (z < 256) {
60 out[x++] = 0x81;
61 out[x++] = (unsigned char)z;
62 } else if (z < 65536UL) {
63 out[x++] = 0x82;
64 out[x++] = (unsigned char)((z>>8)&255);
65 out[x++] = (unsigned char)(z&255);
66 } else {
67 return CRYPT_INVALID_ARG;
57 y = *outlen - x;
58 if ((err = der_encode_asn1_length(z, out + x, &y)) != CRYPT_OK) {
59 return err;
6860 }
61 x += y;
6962
7063 /* store first byte */
7164 wordbuf = words[0] * 40 + words[1];
2727 unsigned char *out, unsigned long *outlen)
2828 {
2929 unsigned long x, y, len;
30 int err;
3031
3132 LTC_ARGCHK(in != NULL);
3233 LTC_ARGCHK(out != NULL);
4344 }
4445 x = 1;
4546
46 /* decode the length */
47 if (in[x] & 0x80) {
48 /* valid # of bytes in length are 1,2,3 */
49 y = in[x] & 0x7F;
50 if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
51 return CRYPT_INVALID_PACKET;
52 }
53
54 /* read the length in */
55 len = 0;
56 ++x;
57 while (y--) {
58 len = (len << 8) | in[x++];
59 }
60 } else {
61 len = in[x++] & 0x7F;
47 /* get the length of the data */
48 y = inlen - x;
49 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
50 return err;
6251 }
52 x += y;
6353
6454 /* is it too long? */
6555 if (len > *outlen) {
6757 return CRYPT_BUFFER_OVERFLOW;
6858 }
6959
70 if (len + x > inlen) {
60 if (len > (inlen - x)) {
7161 return CRYPT_INVALID_PACKET;
7262 }
7363
4747 /* encode the header+len */
4848 x = 0;
4949 out[x++] = 0x04;
50 if (inlen < 128) {
51 out[x++] = (unsigned char)inlen;
52 } else if (inlen < 256) {
53 out[x++] = 0x81;
54 out[x++] = (unsigned char)inlen;
55 } else if (inlen < 65536UL) {
56 out[x++] = 0x82;
57 out[x++] = (unsigned char)((inlen>>8)&255);
58 out[x++] = (unsigned char)(inlen&255);
59 } else if (inlen < 16777216UL) {
60 out[x++] = 0x83;
61 out[x++] = (unsigned char)((inlen>>16)&255);
62 out[x++] = (unsigned char)((inlen>>8)&255);
63 out[x++] = (unsigned char)(inlen&255);
64 } else {
65 return CRYPT_INVALID_ARG;
50 len = *outlen - x;
51 if ((err = der_encode_asn1_length(inlen, out + x, &len)) != CRYPT_OK) {
52 return err;
6653 }
54 x += len;
6755
6856 /* store octets */
6957 for (y = 0; y < inlen; y++) {
2121 */
2222 int der_length_octet_string(unsigned long noctets, unsigned long *outlen)
2323 {
24 unsigned long x;
25 int err;
26
2427 LTC_ARGCHK(outlen != NULL);
2528
26 if (noctets < 128) {
27 /* 04 LL DD DD DD ... */
28 *outlen = 2 + noctets;
29 } else if (noctets < 256) {
30 /* 04 81 LL DD DD DD ... */
31 *outlen = 3 + noctets;
32 } else if (noctets < 65536UL) {
33 /* 04 82 LL LL DD DD DD ... */
34 *outlen = 4 + noctets;
35 } else if (noctets < 16777216UL) {
36 /* 04 83 LL LL LL DD DD DD ... */
37 *outlen = 5 + noctets;
38 } else {
39 return CRYPT_INVALID_ARG;
29 if ((err = der_length_asn1_length(noctets, &x)) != CRYPT_OK) {
30 return err;
4031 }
32 *outlen = 1 + x + noctets;
4133
4234 return CRYPT_OK;
4335 }
2727 unsigned char *out, unsigned long *outlen)
2828 {
2929 unsigned long x, y, len;
30 int t;
30 int t, err;
3131
3232 LTC_ARGCHK(in != NULL);
3333 LTC_ARGCHK(out != NULL);
4444 }
4545 x = 1;
4646
47 /* decode the length */
48 if (in[x] & 0x80) {
49 /* valid # of bytes in length are 1,2,3 */
50 y = in[x] & 0x7F;
51 if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
52 return CRYPT_INVALID_PACKET;
53 }
54
55 /* read the length in */
56 len = 0;
57 ++x;
58 while (y--) {
59 len = (len << 8) | in[x++];
60 }
61 } else {
62 len = in[x++] & 0x7F;
47 /* get the length of the data */
48 y = inlen - x;
49 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
50 return err;
6351 }
52 x += y;
6453
6554 /* is it too long? */
6655 if (len > *outlen) {
6857 return CRYPT_BUFFER_OVERFLOW;
6958 }
7059
71 if (len + x > inlen) {
60 if (len > (inlen - x)) {
7261 return CRYPT_INVALID_PACKET;
7362 }
7463
4646 /* encode the header+len */
4747 x = 0;
4848 out[x++] = 0x13;
49 if (inlen < 128) {
50 out[x++] = (unsigned char)inlen;
51 } else if (inlen < 256) {
52 out[x++] = 0x81;
53 out[x++] = (unsigned char)inlen;
54 } else if (inlen < 65536UL) {
55 out[x++] = 0x82;
56 out[x++] = (unsigned char)((inlen>>8)&255);
57 out[x++] = (unsigned char)(inlen&255);
58 } else if (inlen < 16777216UL) {
59 out[x++] = 0x83;
60 out[x++] = (unsigned char)((inlen>>16)&255);
61 out[x++] = (unsigned char)((inlen>>8)&255);
62 out[x++] = (unsigned char)(inlen&255);
63 } else {
64 return CRYPT_INVALID_ARG;
49 len = *outlen - x;
50 if ((err = der_encode_asn1_length(inlen, out + x, &len)) != CRYPT_OK) {
51 return err;
6552 }
53 x += len;
6654
6755 /* store octets */
6856 for (y = 0; y < inlen; y++) {
125125 int der_length_printable_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen)
126126 {
127127 unsigned long x;
128 int err;
128129
129130 LTC_ARGCHK(outlen != NULL);
130131 LTC_ARGCHK(octets != NULL);
136137 }
137138 }
138139
139 if (noctets < 128) {
140 /* 16 LL DD DD DD ... */
141 *outlen = 2 + noctets;
142 } else if (noctets < 256) {
143 /* 16 81 LL DD DD DD ... */
144 *outlen = 3 + noctets;
145 } else if (noctets < 65536UL) {
146 /* 16 82 LL LL DD DD DD ... */
147 *outlen = 4 + noctets;
148 } else if (noctets < 16777216UL) {
149 /* 16 83 LL LL LL DD DD DD ... */
150 *outlen = 5 + noctets;
151 } else {
152 return CRYPT_INVALID_ARG;
140 if ((err = der_length_asn1_length(noctets, &x)) != CRYPT_OK) {
141 return err;
153142 }
143 *outlen = 1 + x + noctets;
154144
155145 return CRYPT_OK;
156146 }
2121 @param inlen The size of the input
2222 @param list The list of items to decode
2323 @param outlen The number of items in the list
24 @param ordered Search an unordeded or ordered list
24 @param flags c.f. enum ltc_der_seq
2525 @return CRYPT_OK on success
2626 */
2727 int der_decode_sequence_ex(const unsigned char *in, unsigned long inlen,
28 ltc_asn1_list *list, unsigned long outlen, int ordered)
28 ltc_asn1_list *list, unsigned long outlen, unsigned int flags)
2929 {
30 int err, i;
31 ltc_asn1_type type;
32 unsigned long size, x, y, z, blksize;
33 void *data;
34
35 LTC_ARGCHK(in != NULL);
36 LTC_ARGCHK(list != NULL);
37
38 /* get blk size */
39 if (inlen < 2) {
40 return CRYPT_INVALID_PACKET;
41 }
42
43 /* sequence type? We allow 0x30 SEQUENCE and 0x31 SET since fundamentally they're the same structure */
44 x = 0;
45 if (in[x] != 0x30 && in[x] != 0x31) {
46 return CRYPT_INVALID_PACKET;
47 }
48 ++x;
49
50 /* check if the msb is set, which signals that the
51 * 7 lsb bits represent the number of bytes of the length
52 */
53 if (in[x] < 128) {
54 blksize = in[x++];
55 } else {
56 if (in[x] < 0x81 || in[x] > 0x83) {
57 return CRYPT_INVALID_PACKET;
58 }
59 y = in[x++] & 0x7F;
60
61 /* would reading the len bytes overrun? */
62 if (x + y > inlen) {
63 return CRYPT_INVALID_PACKET;
64 }
65
66 /* read len */
67 blksize = 0;
68 while (y--) {
69 blksize = (blksize << 8) | (unsigned long)in[x++];
70 }
71 }
72
73 /* would this blksize overflow? */
74 if (x + blksize > inlen) {
75 return CRYPT_INVALID_PACKET;
76 }
77
78 /* mark all as unused */
79 for (i = 0; i < (int)outlen; i++) {
80 list[i].used = 0;
81 }
82
83 /* ok read data */
84 inlen = blksize;
85 for (i = 0; i < (int)outlen; i++) {
86 z = 0;
87 type = list[i].type;
88 size = list[i].size;
89 data = list[i].data;
90 if (!ordered && list[i].used == 1) { continue; }
91
92 if (type == LTC_ASN1_EOL) {
93 break;
94 }
95
96 /* handle context specific tags - just skip the tag + len bytes */
97 z = 0;
98 if (list[i].tag > 0 && list[i].tag == in[x + z++]) {
99 if (in[x+z] & 0x80) {
100 y = in[x + z++] & 0x7F;
101 if (y == 0 || y > 2) { return CRYPT_INVALID_PACKET; }
102 z += y;
103 } else {
104 z++;
105 }
106 x += z;
107 inlen -= z;
108 }
109
110 switch (type) {
111 case LTC_ASN1_BOOLEAN:
112 z = inlen;
113 if ((err = der_decode_boolean(in + x, z, ((int *)data))) != CRYPT_OK) {
114 if (!ordered || list[i].optional) { continue; }
115 goto LBL_ERR;
116 }
117 if ((err = der_length_boolean(&z)) != CRYPT_OK) {
118 goto LBL_ERR;
119 }
120 break;
121
122 case LTC_ASN1_INTEGER:
123 z = inlen;
124 if ((err = der_decode_integer(in + x, z, data)) != CRYPT_OK) {
125 if (!ordered || list[i].optional) { continue; }
126 goto LBL_ERR;
127 }
128 if ((err = der_length_integer(data, &z)) != CRYPT_OK) {
129 goto LBL_ERR;
130 }
131 break;
132
133 case LTC_ASN1_SHORT_INTEGER:
134 z = inlen;
135 if ((err = der_decode_short_integer(in + x, z, data)) != CRYPT_OK) {
136 if (!ordered || list[i].optional) { continue; }
137 goto LBL_ERR;
138 }
139 if ((err = der_length_short_integer(((unsigned long*)data)[0], &z)) != CRYPT_OK) {
140 goto LBL_ERR;
141 }
142
143 break;
144
145 case LTC_ASN1_BIT_STRING:
146 z = inlen;
147 if ((err = der_decode_bit_string(in + x, z, data, &size)) != CRYPT_OK) {
148 if (!ordered || list[i].optional) { continue; }
149 goto LBL_ERR;
150 }
151 list[i].size = size;
152 if ((err = der_length_bit_string(size, &z)) != CRYPT_OK) {
153 goto LBL_ERR;
154 }
155 break;
156
157 case LTC_ASN1_RAW_BIT_STRING:
158 z = inlen;
159 if ((err = der_decode_raw_bit_string(in + x, z, data, &size)) != CRYPT_OK) {
160 if (!ordered || list[i].optional) { continue; }
161 goto LBL_ERR;
162 }
163 list[i].size = size;
164 if ((err = der_length_bit_string(size, &z)) != CRYPT_OK) {
165 goto LBL_ERR;
166 }
167 break;
168
169 case LTC_ASN1_OCTET_STRING:
170 z = inlen;
171 if ((err = der_decode_octet_string(in + x, z, data, &size)) != CRYPT_OK) {
172 if (!ordered || list[i].optional) { continue; }
173 goto LBL_ERR;
174 }
175 list[i].size = size;
176 if ((err = der_length_octet_string(size, &z)) != CRYPT_OK) {
177 goto LBL_ERR;
178 }
179 break;
180
181 case LTC_ASN1_NULL:
182 if (inlen < 2 || in[x] != 0x05 || in[x+1] != 0x00) {
183 if (!ordered || list[i].optional) { continue; }
184 err = CRYPT_INVALID_PACKET;
185 goto LBL_ERR;
186 }
187 z = 2;
188 break;
189
190 case LTC_ASN1_OBJECT_IDENTIFIER:
191 z = inlen;
192 if ((err = der_decode_object_identifier(in + x, z, data, &size)) != CRYPT_OK) {
193 if (!ordered || list[i].optional) { continue; }
194 goto LBL_ERR;
195 }
196 list[i].size = size;
197 if ((err = der_length_object_identifier(data, size, &z)) != CRYPT_OK) {
198 goto LBL_ERR;
199 }
200 break;
201
202 case LTC_ASN1_TELETEX_STRING:
203 z = inlen;
204 if ((err = der_decode_teletex_string(in + x, z, data, &size)) != CRYPT_OK) {
205 if (!ordered || list[i].optional) { continue; }
206 goto LBL_ERR;
207 }
208 list[i].size = size;
209 if ((err = der_length_teletex_string(data, size, &z)) != CRYPT_OK) {
210 goto LBL_ERR;
211 }
212 break;
213
214 case LTC_ASN1_IA5_STRING:
215 z = inlen;
216 if ((err = der_decode_ia5_string(in + x, z, data, &size)) != CRYPT_OK) {
217 if (!ordered || list[i].optional) { continue; }
218 goto LBL_ERR;
219 }
220 list[i].size = size;
221 if ((err = der_length_ia5_string(data, size, &z)) != CRYPT_OK) {
222 goto LBL_ERR;
223 }
224 break;
225
226
227 case LTC_ASN1_PRINTABLE_STRING:
228 z = inlen;
229 if ((err = der_decode_printable_string(in + x, z, data, &size)) != CRYPT_OK) {
230 if (!ordered || list[i].optional) { continue; }
231 goto LBL_ERR;
232 }
233 list[i].size = size;
234 if ((err = der_length_printable_string(data, size, &z)) != CRYPT_OK) {
235 goto LBL_ERR;
236 }
237 break;
238
239 case LTC_ASN1_UTF8_STRING:
240 z = inlen;
241 if ((err = der_decode_utf8_string(in + x, z, data, &size)) != CRYPT_OK) {
242 if (!ordered || list[i].optional) { continue; }
243 goto LBL_ERR;
244 }
245 list[i].size = size;
246 if ((err = der_length_utf8_string(data, size, &z)) != CRYPT_OK) {
247 goto LBL_ERR;
248 }
249 break;
250
251 case LTC_ASN1_UTCTIME:
252 z = inlen;
253 if ((err = der_decode_utctime(in + x, &z, data)) != CRYPT_OK) {
254 if (!ordered || list[i].optional) { continue; }
255 goto LBL_ERR;
256 }
257 break;
258
259 case LTC_ASN1_GENERALIZEDTIME:
260 z = inlen;
261 if ((err = der_decode_generalizedtime(in + x, &z, data)) != CRYPT_OK) {
262 if (!ordered) { continue; }
263 goto LBL_ERR;
264 }
265 break;
266
267 case LTC_ASN1_SET:
268 z = inlen;
269 if ((err = der_decode_set(in + x, z, data, size)) != CRYPT_OK) {
270 if (!ordered || list[i].optional) { continue; }
271 goto LBL_ERR;
272 }
273 if ((err = der_length_sequence(data, size, &z)) != CRYPT_OK) {
274 goto LBL_ERR;
275 }
276 break;
277
278 case LTC_ASN1_SETOF:
279 case LTC_ASN1_SEQUENCE:
280 /* detect if we have the right type */
281 if ((type == LTC_ASN1_SETOF && (in[x] & 0x3F) != 0x31) || (type == LTC_ASN1_SEQUENCE && (in[x] & 0x3F) != 0x30)) {
282 err = CRYPT_INVALID_PACKET;
283 goto LBL_ERR;
284 }
285
286 z = inlen;
287 if ((err = der_decode_sequence(in + x, z, data, size)) != CRYPT_OK) {
288 if (!ordered || list[i].optional) { continue; }
289 goto LBL_ERR;
290 }
291 if ((err = der_length_sequence(data, size, &z)) != CRYPT_OK) {
292 goto LBL_ERR;
293 }
294 break;
295
296
297 case LTC_ASN1_CHOICE:
298 z = inlen;
299 if ((err = der_decode_choice(in + x, &z, data, size)) != CRYPT_OK) {
300 if (!ordered || list[i].optional) { continue; }
301 goto LBL_ERR;
302 }
303 break;
304
305 case LTC_ASN1_CONSTRUCTED:
306 case LTC_ASN1_CONTEXT_SPECIFIC:
307 case LTC_ASN1_EOL:
308 err = CRYPT_INVALID_ARG;
309 goto LBL_ERR;
310 }
311 x += z;
312 inlen -= z;
313 list[i].used = 1;
314 if (!ordered) {
315 /* restart the decoder */
316 i = -1;
317 }
318 }
319
320 for (i = 0; i < (int)outlen; i++) {
321 if (list[i].used == 0 && list[i].optional == 0) {
322 err = CRYPT_INVALID_PACKET;
323 goto LBL_ERR;
324 }
325 }
326
327 if (inlen == 0) {
328 err = CRYPT_OK;
329 } else {
330 err = CRYPT_INPUT_TOO_LONG;
331 }
332
333 LBL_ERR:
334 return err;
30 return der_decode_custom_type_ex(in, inlen, NULL, list, outlen, flags);
33531 }
33632
33733 #endif
1313 */
1414
1515 #ifdef LTC_DER
16
17 static unsigned long _fetch_length(const unsigned char *in, unsigned long inlen, unsigned long *data_offset)
18 {
19 unsigned long x, z;
20
21 *data_offset = 0;
22
23 /* skip type and read len */
24 if (inlen < 2) {
25 return 0xFFFFFFFF;
26 }
27 ++in; ++(*data_offset);
28
29 /* read len */
30 x = *in++; ++(*data_offset);
31
32 /* <128 means literal */
33 if (x < 128) {
34 return x+*data_offset;
35 }
36 x &= 0x7F; /* the lower 7 bits are the length of the length */
37 inlen -= 2;
38
39 /* len means len of len! */
40 if (x == 0 || x > 4 || x > inlen) {
41 return 0xFFFFFFFF;
42 }
43
44 *data_offset += x;
45 z = 0;
46 while (x--) {
47 z = (z<<8) | ((unsigned long)*in);
48 ++in;
49 }
50 return z+*data_offset;
51 }
5216
5317 static int _new_element(ltc_asn1_list **l)
5418 {
7943 int der_decode_sequence_flexi(const unsigned char *in, unsigned long *inlen, ltc_asn1_list **out)
8044 {
8145 ltc_asn1_list *l;
82 unsigned long err, type, len, totlen, data_offset;
46 unsigned long err, identifier, len, totlen, data_offset, id_len, len_len;
8347 void *realloc_tmp;
8448
8549 LTC_ARGCHK(in != NULL);
9862
9963 /* scan the input and and get lengths and what not */
10064 while (*inlen) {
101 /* read the type byte */
102 type = *in;
103
104 /* fetch length */
105 len = _fetch_length(in, *inlen, &data_offset);
106 if (len > *inlen) {
107 err = CRYPT_INVALID_PACKET;
108 goto error;
109 }
110
11165 /* alloc new link */
11266 if ((err = _new_element(&l)) != CRYPT_OK) {
11367 goto error;
11468 }
11569
116 if ((type & 0x20) && (type != 0x30) && (type != 0x31)) {
117 /* constructed, use the 'used' field to store the original identifier */
118 l->used = type;
119 /* treat constructed elements like SETs */
120 type = 0x20;
121 }
122 else if ((type & 0xC0) == 0x80) {
123 /* context-specific, use the 'used' field to store the original identifier */
124 l->used = type;
125 /* context-specific elements are treated as opaque data */
126 type = 0x80;
70 id_len = *inlen;
71 if ((err = der_decode_asn1_identifier(in, &id_len, l)) != CRYPT_OK) {
72 goto error;
73 }
74 /* read the type byte */
75 identifier = *in;
76
77 if (l->type != LTC_ASN1_EOL) {
78 /* fetch length */
79 len_len = *inlen - id_len;
80 #if defined(LTC_TEST_DBG)
81 data_offset = 666;
82 len = 0;
83 #endif
84 if ((err = der_decode_asn1_length(&in[id_len], &len_len, &len)) != CRYPT_OK) {
85 #if defined(LTC_TEST_DBG)
86 fprintf(stderr, "E1 %02lx: hl=%4lu l=%4lu - %s (%s)\n", identifier, data_offset, len, der_asn1_tag_to_string_map[l->tag], error_to_string(err));
87 #endif
88 goto error;
89 } else if (len > (*inlen - id_len - len_len)) {
90 err = CRYPT_INVALID_PACKET;
91 #if defined(LTC_TEST_DBG)
92 fprintf(stderr, "E2 %02lx: hl=%4lu l=%4lu - %s (%s)\n", identifier, data_offset, len, der_asn1_tag_to_string_map[l->tag], error_to_string(err));
93 #endif
94 goto error;
95 }
96 data_offset = id_len + len_len;
97 #if defined(LTC_TEST_DBG) && LTC_TEST_DBG > 1
98 if (l->type == LTC_ASN1_CUSTOM_TYPE && l->class == LTC_ASN1_CL_CONTEXT_SPECIFIC) {
99 fprintf(stderr, "OK %02lx: hl=%4lu l=%4lu - Context Specific[%s %llu]\n", identifier, data_offset, len, der_asn1_pc_to_string_map[l->pc], l->tag);
100 } else {
101 fprintf(stderr, "OK %02lx: hl=%4lu l=%4lu - %s\n", identifier, data_offset, len, der_asn1_tag_to_string_map[l->tag]);
102 }
103 #endif
104 len += data_offset;
105
106 if (l->type == LTC_ASN1_CUSTOM_TYPE) {
107 /* Custom type, use the 'used' field to store the original identifier */
108 l->used = identifier;
109 if (l->pc == LTC_ASN1_PC_CONSTRUCTED) {
110 /* treat constructed elements like SEQUENCEs */
111 identifier = 0x20;
112 } else {
113 /* primitive elements are treated as opaque data */
114 identifier = 0x80;
115 }
116 }
117 } else {
118 /* Init this so gcc won't complain,
119 * as this case will only be hit when we
120 * can't decode the identifier so the
121 * switch-case should go to default anyway...
122 */
123 data_offset = 0;
124 len = 0;
127125 }
128126
129127 /* now switch on type */
130 switch (type) {
128 switch (identifier) {
131129 case 0x01: /* BOOLEAN */
132 l->type = LTC_ASN1_BOOLEAN;
130 if (l->type != LTC_ASN1_BOOLEAN) {
131 err = CRYPT_PK_ASN1_ERROR;
132 goto error;
133 }
134
135 /* init field */
133136 l->size = 1;
134137 l->data = XCALLOC(1, sizeof(int));
135138
143146 break;
144147
145148 case 0x02: /* INTEGER */
149 if (l->type != LTC_ASN1_INTEGER) {
150 err = CRYPT_PK_ASN1_ERROR;
151 goto error;
152 }
153
146154 /* init field */
147 l->type = LTC_ASN1_INTEGER;
148155 l->size = 1;
149156 if ((err = mp_init(&l->data)) != CRYPT_OK) {
150157 goto error;
162169 break;
163170
164171 case 0x03: /* BIT */
165 /* init field */
166 l->type = LTC_ASN1_BIT_STRING;
172 if (l->type != LTC_ASN1_BIT_STRING) {
173 err = CRYPT_PK_ASN1_ERROR;
174 goto error;
175 }
176
177 /* init field */
167178 l->size = len * 8; /* *8 because we store decoded bits one per char and they are encoded 8 per char. */
168179
169180 if ((l->data = XCALLOC(1, l->size)) == NULL) {
181192 break;
182193
183194 case 0x04: /* OCTET */
184
185 /* init field */
186 l->type = LTC_ASN1_OCTET_STRING;
195 if (l->type != LTC_ASN1_OCTET_STRING) {
196 err = CRYPT_PK_ASN1_ERROR;
197 goto error;
198 }
199
200 /* init field */
187201 l->size = len;
188202
189203 if ((l->data = XCALLOC(1, l->size)) == NULL) {
201215 break;
202216
203217 case 0x05: /* NULL */
218 if (l->type != LTC_ASN1_NULL) {
219 err = CRYPT_PK_ASN1_ERROR;
220 goto error;
221 }
204222
205223 /* valid NULL is 0x05 0x00 */
206224 if (in[0] != 0x05 || in[1] != 0x00) {
209227 }
210228
211229 /* simple to store ;-) */
212 l->type = LTC_ASN1_NULL;
213230 l->data = NULL;
214231 l->size = 0;
215232 len = 2;
217234 break;
218235
219236 case 0x06: /* OID */
220
221 /* init field */
222 l->type = LTC_ASN1_OBJECT_IDENTIFIER;
237 if (l->type != LTC_ASN1_OBJECT_IDENTIFIER) {
238 err = CRYPT_PK_ASN1_ERROR;
239 goto error;
240 }
241
242 /* init field */
223243 l->size = len;
224244
225245 if ((l->data = XCALLOC(len, sizeof(unsigned long))) == NULL) {
246266 case 0x0C: /* UTF8 */
247267
248268 /* init field */
249 l->type = LTC_ASN1_UTF8_STRING;
269 if (l->type != LTC_ASN1_UTF8_STRING) {
270 err = CRYPT_PK_ASN1_ERROR;
271 goto error;
272 }
250273 l->size = len;
251274
252275 if ((l->data = XCALLOC(sizeof(wchar_t), l->size)) == NULL) {
264287 break;
265288
266289 case 0x13: /* PRINTABLE */
267
268 /* init field */
269 l->type = LTC_ASN1_PRINTABLE_STRING;
290 if (l->type != LTC_ASN1_PRINTABLE_STRING) {
291 err = CRYPT_PK_ASN1_ERROR;
292 goto error;
293 }
294
295 /* init field */
270296 l->size = len;
271297
272298 if ((l->data = XCALLOC(1, l->size)) == NULL) {
284310 break;
285311
286312 case 0x14: /* TELETEXT */
287
288 /* init field */
289 l->type = LTC_ASN1_TELETEX_STRING;
313 if (l->type != LTC_ASN1_TELETEX_STRING) {
314 err = CRYPT_PK_ASN1_ERROR;
315 goto error;
316 }
317
318 /* init field */
290319 l->size = len;
291320
292321 if ((l->data = XCALLOC(1, l->size)) == NULL) {
304333 break;
305334
306335 case 0x16: /* IA5 */
307
308 /* init field */
309 l->type = LTC_ASN1_IA5_STRING;
336 if (l->type != LTC_ASN1_IA5_STRING) {
337 err = CRYPT_PK_ASN1_ERROR;
338 goto error;
339 }
340
341 /* init field */
310342 l->size = len;
311343
312344 if ((l->data = XCALLOC(1, l->size)) == NULL) {
324356 break;
325357
326358 case 0x17: /* UTC TIME */
327
328 /* init field */
329 l->type = LTC_ASN1_UTCTIME;
359 if (l->type != LTC_ASN1_UTCTIME) {
360 err = CRYPT_PK_ASN1_ERROR;
361 goto error;
362 }
363
364 /* init field */
330365 l->size = 1;
331366
332367 if ((l->data = XCALLOC(1, sizeof(ltc_utctime))) == NULL) {
345380 break;
346381
347382 case 0x18:
348 l->type = LTC_ASN1_GENERALIZEDTIME;
383 if (l->type != LTC_ASN1_GENERALIZEDTIME) {
384 err = CRYPT_PK_ASN1_ERROR;
385 goto error;
386 }
387
388 /* init field */
349389 l->size = len;
350390
351391 if ((l->data = XCALLOC(1, sizeof(ltc_generalizedtime))) == NULL) {
368408 case 0x31: /* SET */
369409
370410 /* init field */
371 if (type == 0x20) {
372 l->type = LTC_ASN1_CONSTRUCTED;
373 }
374 else if (type == 0x30) {
375 l->type = LTC_ASN1_SEQUENCE;
411 if (identifier == 0x20) {
412 if (l->type != LTC_ASN1_CUSTOM_TYPE) {
413 err = CRYPT_PK_ASN1_ERROR;
414 goto error;
415 }
416 }
417 else if (identifier == 0x30) {
418 if (l->type != LTC_ASN1_SEQUENCE) {
419 err = CRYPT_PK_ASN1_ERROR;
420 goto error;
421 }
376422 }
377423 else {
378 l->type = LTC_ASN1_SET;
424 if (l->type != LTC_ASN1_SET) {
425 err = CRYPT_PK_ASN1_ERROR;
426 goto error;
427 }
379428 }
380429
381430 if ((l->data = XMALLOC(len)) == NULL) {
390439 /* jump to the start of the data */
391440 in += data_offset;
392441 *inlen -= data_offset;
393 len = len - data_offset;
442 len -= data_offset;
443
444 /* save the decoded ASN.1 len */
445 len_len = len;
394446
395447 /* Sequence elements go as child */
396448 if ((err = der_decode_sequence_flexi(in, &len, &(l->child))) != CRYPT_OK) {
449 goto error;
450 }
451 if (len_len != len) {
452 err = CRYPT_PK_ASN1_ERROR;
397453 goto error;
398454 }
399455
409465 break;
410466
411467 case 0x80: /* Context-specific */
412 l->type = LTC_ASN1_CONTEXT_SPECIFIC;
468 if (l->type != LTC_ASN1_CUSTOM_TYPE) {
469 err = CRYPT_PK_ASN1_ERROR;
470 goto error;
471 }
413472
414473 if ((l->data = XCALLOC(1, len - data_offset)) == NULL) {
415474 err = CRYPT_MEM;
2020 Decode a SEQUENCE type using a VA list
2121 @param in Input buffer
2222 @param inlen Length of input in octets
23 @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
23 @param a1 Initialized argument list #1
24 @param a2 Initialized argument list #2 (copy of #1)
25 @param flags c.f. enum ltc_der_seq
2426 @return CRYPT_OK on success
2527 */
26 int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
28 static int _der_decode_sequence_va(const unsigned char *in, unsigned long inlen, va_list a1, va_list a2, unsigned int flags)
2729 {
2830 int err;
2931 ltc_asn1_type type;
3032 unsigned long size, x;
3133 void *data;
32 va_list args;
3334 ltc_asn1_list *list;
3435
3536 LTC_ARGCHK(in != NULL);
3637
3738 /* get size of output that will be required */
38 va_start(args, inlen);
3939 x = 0;
4040 for (;;) {
41 type = (ltc_asn1_type)va_arg(args, int);
42 size = va_arg(args, unsigned long);
43 data = va_arg(args, void*);
41 type = (ltc_asn1_type)va_arg(a1, int);
42 size = va_arg(a1, unsigned long);
43 data = va_arg(a1, void*);
4444 LTC_UNUSED_PARAM(size);
4545 LTC_UNUSED_PARAM(data);
4646
7171 break;
7272
7373 case LTC_ASN1_EOL:
74 case LTC_ASN1_CONSTRUCTED:
75 case LTC_ASN1_CONTEXT_SPECIFIC:
76 va_end(args);
74 case LTC_ASN1_CUSTOM_TYPE:
7775 return CRYPT_INVALID_ARG;
7876 }
7977 }
80 va_end(args);
8178
8279 /* allocate structure for x elements */
8380 if (x == 0) {
9087 }
9188
9289 /* fill in the structure */
93 va_start(args, inlen);
9490 x = 0;
9591 for (;;) {
96 type = (ltc_asn1_type)va_arg(args, int);
97 size = va_arg(args, unsigned long);
98 data = va_arg(args, void*);
92 type = (ltc_asn1_type)va_arg(a2, int);
93 size = va_arg(a2, unsigned long);
94 data = va_arg(a2, void*);
9995
10096 if (type == LTC_ASN1_EOL) {
10197 break;
124120 break;
125121 /* coverity[dead_error_line] */
126122 case LTC_ASN1_EOL:
127 case LTC_ASN1_CONSTRUCTED:
128 case LTC_ASN1_CONTEXT_SPECIFIC:
123 case LTC_ASN1_CUSTOM_TYPE:
129124 break;
130125 }
131126 }
132 va_end(args);
133127
134 err = der_decode_sequence(in, inlen, list, x);
128 err = der_decode_sequence_ex(in, inlen, list, x, flags);
135129 XFREE(list);
130 return err;
131 }
132
133 /**
134 Decode a SEQUENCE type using a VA list
135 @param in Input buffer
136 @param inlen Length of input in octets
137 @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
138 @return CRYPT_OK on success
139 */
140 int der_decode_sequence_multi(const unsigned char *in, unsigned long inlen, ...)
141 {
142 va_list a1, a2;
143 int err;
144
145 LTC_ARGCHK(in != NULL);
146
147 va_start(a1, inlen);
148 va_start(a2, inlen);
149
150 err = _der_decode_sequence_va(in, inlen, a1, a2, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_RELAXED);
151
152 va_end(a2);
153 va_end(a1);
154
155 return err;
156 }
157
158 /**
159 Decode a SEQUENCE type using a VA list
160 @param in Input buffer
161 @param inlen Length of input in octets
162 @param flags c.f. enum ltc_der_seq
163 @remark <...> is of the form <type, size, data> (int, unsigned long, void*)
164 @return CRYPT_OK on success
165 */
166 int der_decode_sequence_multi_ex(const unsigned char *in, unsigned long inlen, unsigned int flags, ...)
167 {
168 va_list a1, a2;
169 int err;
170
171 LTC_ARGCHK(in != NULL);
172
173 va_start(a1, flags);
174 va_start(a2, flags);
175
176 err = _der_decode_sequence_va(in, inlen, a1, a2, flags);
177
178 va_end(a2);
179 va_end(a1);
180
136181 return err;
137182 }
138183
+0
-123
src/ltc/pk/asn1/der/sequence/der_decode_subject_public_key_info.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9 /**
10 @file der_decode_subject_public_key_info.c
11 ASN.1 DER, encode a Subject Public Key structure --nmav
12 */
13
14 #ifdef LTC_DER
15
16 /* AlgorithmIdentifier := SEQUENCE {
17 * algorithm OBJECT IDENTIFIER,
18 * parameters ANY DEFINED BY algorithm
19 * }
20 *
21 * SubjectPublicKeyInfo := SEQUENCE {
22 * algorithm AlgorithmIdentifier,
23 * subjectPublicKey BIT STRING
24 * }
25 */
26 /**
27 Decode a subject public key info
28 @param in The input buffer
29 @param inlen The length of the input buffer
30 @param algorithm One out of the enum #public_key_algorithms
31 @param public_key The buffer for the public key
32 @param public_key_len [in/out] The length of the public key buffer and the written length
33 @param parameters_type The parameters' type out of the enum ltc_asn1_type
34 @param parameters The parameters to include
35 @param parameters_len The number of parameters to include
36 @return CRYPT_OK on success
37 */
38 int der_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,
39 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
40 unsigned long parameters_type, ltc_asn1_list* parameters, unsigned long parameters_len)
41 {
42 return der_decode_subject_public_key_info_ex(in, inlen, algorithm, public_key, public_key_len,
43 parameters_type, parameters, parameters_len, NULL);
44 }
45
46 int der_decode_subject_public_key_info_ex(const unsigned char *in, unsigned long inlen,
47 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
48 unsigned long parameters_type, void* parameters, unsigned long parameters_len,
49 unsigned long *parameters_outsize)
50 {
51 int err;
52 unsigned long len;
53 oid_st oid;
54 unsigned char *tmpbuf;
55 unsigned long tmpoid[16];
56 ltc_asn1_list alg_id[2];
57 ltc_asn1_list subject_pubkey[2];
58
59 LTC_ARGCHK(in != NULL);
60 LTC_ARGCHK(inlen != 0);
61 LTC_ARGCHK(public_key_len != NULL);
62
63 err = pk_get_oid(algorithm, &oid);
64 if (err != CRYPT_OK) {
65 return err;
66 }
67
68 /* see if the OpenSSL DER format RSA public key will work */
69 tmpbuf = XCALLOC(1, inlen);
70 if (tmpbuf == NULL) {
71 err = CRYPT_MEM;
72 goto LBL_ERR;
73 }
74
75 /* this includes the internal hash ID and optional params (NULL in this case) */
76 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, sizeof(tmpoid)/sizeof(tmpoid[0]));
77 LTC_SET_ASN1(alg_id, 1, (ltc_asn1_type)parameters_type, parameters, parameters_len);
78
79 /* the actual format of the SSL DER key is odd, it stores a RSAPublicKey
80 * in a **BIT** string ... so we have to extract it then proceed to convert bit to octet
81 */
82 LTC_SET_ASN1(subject_pubkey, 0, LTC_ASN1_SEQUENCE, alg_id, 2);
83 LTC_SET_ASN1(subject_pubkey, 1, LTC_ASN1_RAW_BIT_STRING, tmpbuf, inlen*8U);
84
85 err=der_decode_sequence(in, inlen, subject_pubkey, 2UL);
86 if (err != CRYPT_OK) {
87 goto LBL_ERR;
88 }
89
90 if (parameters_outsize) *parameters_outsize = alg_id[1].size;
91
92 if ((alg_id[0].size != oid.OIDlen) ||
93 XMEMCMP(oid.OID, alg_id[0].data, oid.OIDlen * sizeof(oid.OID[0]))) {
94 /* OID mismatch */
95 err = CRYPT_PK_INVALID_TYPE;
96 goto LBL_ERR;
97 }
98
99 len = subject_pubkey[1].size/8;
100 if (*public_key_len > len) {
101 XMEMCPY(public_key, subject_pubkey[1].data, len);
102 *public_key_len = len;
103 } else {
104 *public_key_len = len;
105 err = CRYPT_BUFFER_OVERFLOW;
106 goto LBL_ERR;
107 }
108
109 err = CRYPT_OK;
110
111 LBL_ERR:
112
113 XFREE(tmpbuf);
114
115 return err;
116 }
117
118 #endif
119
120 /* ref: $Format:%D$ */
121 /* git commit: $Format:%H$ */
122 /* commit time: $Format:%ai$ */
3030 int err;
3131 ltc_asn1_type type;
3232 unsigned long size, x, y, z, i;
33 unsigned char tmptag[6];
3433 void *data;
3534
3635 LTC_ARGCHK(list != NULL);
5251 x = 0;
5352 out[x++] = (type_of == LTC_ASN1_SEQUENCE) ? 0x30 : 0x31;
5453
55 if (z < 128) {
56 out[x++] = (unsigned char)z;
57 } else if (z < 256) {
58 out[x++] = 0x81;
59 out[x++] = (unsigned char)z;
60 } else if (z < 65536UL) {
61 out[x++] = 0x82;
62 out[x++] = (unsigned char)((z>>8UL)&255);
63 out[x++] = (unsigned char)(z&255);
64 } else if (z < 16777216UL) {
65 out[x++] = 0x83;
66 out[x++] = (unsigned char)((z>>16UL)&255);
67 out[x++] = (unsigned char)((z>>8UL)&255);
68 out[x++] = (unsigned char)(z&255);
54 y = *outlen - x;
55 if ((err = der_encode_asn1_length(z, &out[x], &y)) != CRYPT_OK) {
56 goto LBL_ERR;
6957 }
58 x += y;
7059
7160 /* store data */
7261 *outlen -= x;
191180 }
192181 break;
193182
183 case LTC_ASN1_CUSTOM_TYPE:
184 z = *outlen;
185 if ((err = der_encode_custom_type(&list[i], out + x, &z)) != CRYPT_OK) {
186 goto LBL_ERR;
187 }
188 break;
189
194190 case LTC_ASN1_CHOICE:
195 case LTC_ASN1_CONSTRUCTED:
196 case LTC_ASN1_CONTEXT_SPECIFIC:
197191 case LTC_ASN1_EOL:
198192 case LTC_ASN1_TELETEX_STRING:
199193 err = CRYPT_INVALID_ARG;
200194 goto LBL_ERR;
201195 }
202196
203 if (list[i].tag > 0) {
204 tmptag[0] = list[i].tag;
205 y = 0;
206 if (z < 128) {
207 tmptag[1] = (unsigned char)z;
208 y = 2;
209 } else if (z < 256) {
210 tmptag[1] = 0x81;
211 tmptag[2] = (unsigned char)z;
212 y = 3;
213 } else if (z < 65536UL) {
214 tmptag[1] = 0x82;
215 tmptag[2] = (unsigned char)((z>>8UL)&255);
216 tmptag[3] = (unsigned char)(z&255);
217 y = 4;
218 } else if (z < 16777216UL) {
219 tmptag[1] = 0x83;
220 tmptag[2] = (unsigned char)((z>>16UL)&255);
221 tmptag[3] = (unsigned char)((z>>8UL)&255);
222 tmptag[4] = (unsigned char)(z&255);
223 y = 5;
224 }
225 XMEMMOVE(out + x + y, out + x, z);
226 XMEMCPY(out + x, tmptag, y);
227
228 z += y;
229 }
230
231197 x += z;
232198 *outlen -= z;
233199 }
7070 break;
7171
7272 case LTC_ASN1_CHOICE:
73 case LTC_ASN1_CONSTRUCTED:
74 case LTC_ASN1_CONTEXT_SPECIFIC:
73 case LTC_ASN1_CUSTOM_TYPE:
7574 case LTC_ASN1_EOL:
7675 case LTC_ASN1_TELETEX_STRING:
7776 va_end(args);
123122 break;
124123
125124 case LTC_ASN1_CHOICE:
126 case LTC_ASN1_CONSTRUCTED:
127 case LTC_ASN1_CONTEXT_SPECIFIC:
125 case LTC_ASN1_CUSTOM_TYPE:
128126 case LTC_ASN1_EOL:
129127 case LTC_ASN1_TELETEX_STRING:
130128 va_end(args);
+0
-71
src/ltc/pk/asn1/der/sequence/der_encode_subject_public_key_info.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file der_encode_subject_public_key_info.c
12 ASN.1 DER, encode a Subject Public Key structure --nmav
13 */
14
15 #ifdef LTC_DER
16
17 /* AlgorithmIdentifier := SEQUENCE {
18 * algorithm OBJECT IDENTIFIER,
19 * parameters ANY DEFINED BY algorithm
20 * }
21 *
22 * SubjectPublicKeyInfo := SEQUENCE {
23 * algorithm AlgorithmIdentifier,
24 * subjectPublicKey BIT STRING
25 * }
26 */
27 /**
28 Encode a subject public key info
29 @param out The output buffer
30 @param outlen [in/out] Length of buffer and resulting length of output
31 @param algorithm One out of the enum #public_key_algorithms
32 @param public_key The buffer for the public key
33 @param public_key_len The length of the public key buffer
34 @param parameters_type The parameters' type out of the enum ltc_asn1_type
35 @param parameters The parameters to include
36 @param parameters_len The number of parameters to include
37 @return CRYPT_OK on success
38 */
39 int der_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,
40 unsigned int algorithm, void* public_key, unsigned long public_key_len,
41 unsigned long parameters_type, void* parameters, unsigned long parameters_len)
42 {
43 int err;
44 ltc_asn1_list alg_id[2];
45 oid_st oid;
46
47 LTC_ARGCHK(out != NULL);
48 LTC_ARGCHK(outlen != NULL);
49
50 err = pk_get_oid(algorithm, &oid);
51 if (err != CRYPT_OK) {
52 return err;
53 }
54
55 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid.OID, oid.OIDlen);
56 LTC_SET_ASN1(alg_id, 1, (ltc_asn1_type)parameters_type, parameters, parameters_len);
57
58 return der_encode_sequence_multi(out, outlen,
59 LTC_ASN1_SEQUENCE, (unsigned long)sizeof(alg_id)/sizeof(alg_id[0]), alg_id,
60 LTC_ASN1_RAW_BIT_STRING, public_key_len*8U, public_key,
61 LTC_ASN1_EOL, 0UL, NULL);
62
63 }
64
65 #endif
66
67 /* ref: $Format:%D$ */
68 /* git commit: $Format:%H$ */
69 /* commit time: $Format:%ai$ */
70
3232 {
3333 int err;
3434 ltc_asn1_type type;
35 unsigned long size, x, y, i, z;
35 unsigned long size, x, y, i;
3636 void *data;
3737
3838 LTC_ARGCHK(list != NULL);
142142 y += x;
143143 break;
144144
145 case LTC_ASN1_CUSTOM_TYPE:
146 if ((err = der_length_custom_type(&list[i], &x, NULL)) != CRYPT_OK) {
147 goto LBL_ERR;
148 }
149 y += x;
150 break;
151
145152 case LTC_ASN1_SET:
146153 case LTC_ASN1_SETOF:
147154 case LTC_ASN1_SEQUENCE:
151158 y += x;
152159 break;
153160
154
155161 case LTC_ASN1_CHOICE:
156 case LTC_ASN1_CONSTRUCTED:
157 case LTC_ASN1_CONTEXT_SPECIFIC:
158162 case LTC_ASN1_EOL:
159163 err = CRYPT_INVALID_ARG;
160164 goto LBL_ERR;
161165 }
162
163 /* handle context specific tags size */
164 if (list[i].tag > 0) {
165 if (x < 128) {
166 y += 2;
167 } else if (x < 256) {
168 y += 3;
169 } else if (x < 65536UL) {
170 y += 4;
171 } else if (x < 16777216UL) {
172 y += 5;
173 } else {
174 err = CRYPT_INVALID_ARG;
175 goto LBL_ERR;
176 }
177 }
178166 }
179167
180 /* calc header size */
181 z = y;
182 if (y < 128) {
183 y += 2;
184 } else if (y < 256) {
185 /* 0x30 0x81 LL */
186 y += 3;
187 } else if (y < 65536UL) {
188 /* 0x30 0x82 LL LL */
189 y += 4;
190 } else if (y < 16777216UL) {
191 /* 0x30 0x83 LL LL LL */
192 y += 5;
193 } else {
194 err = CRYPT_INVALID_ARG;
168 if ((err = der_length_asn1_length(y, &x)) != CRYPT_OK) {
195169 goto LBL_ERR;
196170 }
197171
172 if (payloadlen != NULL) {
173 *payloadlen = y;
174 }
175
198176 /* store size */
199 if (payloadlen) *payloadlen = z;
200 *outlen = y;
177 *outlen = y + x + 1;
201178 err = CRYPT_OK;
202179
203180 LBL_ERR:
3131 }
3232
3333 switch (in->type) {
34 case LTC_ASN1_CONSTRUCTED:
34 case LTC_ASN1_CUSTOM_TYPE:
3535 case LTC_ASN1_SET:
3636 case LTC_ASN1_SEQUENCE : if (in->data != NULL) { XFREE(in->data); in->data = NULL; } break;
3737 default: break;
1717 /* LTC define to ASN.1 TAG */
1818 static int _ltc_to_asn1(ltc_asn1_type v)
1919 {
20 switch (v) {
21 case LTC_ASN1_BOOLEAN: return 0x01;
22 case LTC_ASN1_INTEGER:
23 case LTC_ASN1_SHORT_INTEGER: return 0x02;
24 case LTC_ASN1_RAW_BIT_STRING:
25 case LTC_ASN1_BIT_STRING: return 0x03;
26 case LTC_ASN1_OCTET_STRING: return 0x04;
27 case LTC_ASN1_NULL: return 0x05;
28 case LTC_ASN1_OBJECT_IDENTIFIER: return 0x06;
29 case LTC_ASN1_UTF8_STRING: return 0x0C;
30 case LTC_ASN1_PRINTABLE_STRING: return 0x13;
31 case LTC_ASN1_TELETEX_STRING: return 0x14;
32 case LTC_ASN1_IA5_STRING: return 0x16;
33 case LTC_ASN1_UTCTIME: return 0x17;
34 case LTC_ASN1_GENERALIZEDTIME: return 0x18;
35 case LTC_ASN1_SEQUENCE: return 0x30;
36 case LTC_ASN1_SET:
37 case LTC_ASN1_SETOF: return 0x31;
38 case LTC_ASN1_CHOICE:
39 case LTC_ASN1_CONSTRUCTED:
40 case LTC_ASN1_CONTEXT_SPECIFIC:
41 case LTC_ASN1_EOL: return -1;
42 }
43 return -1;
20 return der_asn1_type_to_identifier_map[v];
4421 }
4522
4623
2222 */
2323 int der_length_short_integer(unsigned long num, unsigned long *outlen)
2424 {
25 unsigned long z, y, len;
25 unsigned long z, y;
26 int err;
2627
2728 LTC_ARGCHK(outlen != NULL);
2829
4041 /* handle zero */
4142 if (z == 0) {
4243 z = 1;
44 } else if ((num&(1UL<<((z<<3) - 1))) != 0) {
45 /* in case msb is set */
46 ++z;
4347 }
4448
45 /* we need a 0x02 to indicate it's INTEGER */
46 len = 1;
47
48 /* length byte */
49 ++len;
50
51 /* bytes in value */
52 len += z;
53
54 /* see if msb is set */
55 len += (num&(1UL<<((z<<3) - 1))) ? 1 : 0;
56
57 /* return length */
58 *outlen = len;
49 if ((err = der_length_asn1_length(z, &y)) != CRYPT_OK) {
50 return err;
51 }
52 *outlen = 1 + y + z;
5953
6054 return CRYPT_OK;
6155 }
2626 unsigned char *out, unsigned long *outlen)
2727 {
2828 unsigned long x, y, len;
29 int t;
29 int t, err;
3030
3131 LTC_ARGCHK(in != NULL);
3232 LTC_ARGCHK(out != NULL);
4343 }
4444 x = 1;
4545
46 /* decode the length */
47 if (in[x] & 0x80) {
48 /* valid # of bytes in length are 1,2,3 */
49 y = in[x] & 0x7F;
50 if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
51 return CRYPT_INVALID_PACKET;
52 }
53
54 /* read the length in */
55 len = 0;
56 ++x;
57 while (y--) {
58 len = (len << 8) | in[x++];
59 }
60 } else {
61 len = in[x++] & 0x7F;
46 /* get the length of the data */
47 y = inlen - x;
48 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
49 return err;
6250 }
51 x += y;
6352
6453 /* is it too long? */
6554 if (len > *outlen) {
6756 return CRYPT_BUFFER_OVERFLOW;
6857 }
6958
70 if (len + x > inlen) {
59 if (len > (inlen - x)) {
7160 return CRYPT_INVALID_PACKET;
7261 }
7362
169169 int der_length_teletex_string(const unsigned char *octets, unsigned long noctets, unsigned long *outlen)
170170 {
171171 unsigned long x;
172 int err;
172173
173174 LTC_ARGCHK(outlen != NULL);
174175 LTC_ARGCHK(octets != NULL);
180181 }
181182 }
182183
183 if (noctets < 128) {
184 /* 16 LL DD DD DD ... */
185 *outlen = 2 + noctets;
186 } else if (noctets < 256) {
187 /* 16 81 LL DD DD DD ... */
188 *outlen = 3 + noctets;
189 } else if (noctets < 65536UL) {
190 /* 16 82 LL LL DD DD DD ... */
191 *outlen = 4 + noctets;
192 } else if (noctets < 16777216UL) {
193 /* 16 83 LL LL LL DD DD DD ... */
194 *outlen = 5 + noctets;
195 } else {
196 return CRYPT_INVALID_ARG;
184 if ((err = der_length_asn1_length(noctets, &x)) != CRYPT_OK) {
185 return err;
197186 }
187 *outlen = 1 + x + noctets;
198188
199189 return CRYPT_OK;
200190 }
2828 {
2929 wchar_t tmp;
3030 unsigned long x, y, z, len;
31 int err;
3132
3233 LTC_ARGCHK(in != NULL);
3334 LTC_ARGCHK(out != NULL);
4445 }
4546 x = 1;
4647
47 /* decode the length */
48 if (in[x] & 0x80) {
49 /* valid # of bytes in length are 1,2,3 */
50 y = in[x] & 0x7F;
51 if ((y == 0) || (y > 3) || ((x + y) > inlen)) {
52 return CRYPT_INVALID_PACKET;
53 }
48 /* get the length of the data */
49 y = inlen - x;
50 if ((err = der_decode_asn1_length(in + x, &y, &len)) != CRYPT_OK) {
51 return err;
52 }
53 x += y;
5454
55 /* read the length in */
56 len = 0;
57 ++x;
58 while (y--) {
59 len = (len << 8) | in[x++];
60 }
61 } else {
62 len = in[x++] & 0x7F;
63 }
64
65 if (len + x > inlen) {
55 if (len > (inlen - x)) {
6656 return CRYPT_INVALID_PACKET;
6757 }
6858
9080 tmp = (tmp << 6) | ((wchar_t)in[x++] & 0x3F);
9181 }
9282
93 if (y > *outlen) {
94 *outlen = y;
95 return CRYPT_BUFFER_OVERFLOW;
83 if (y < *outlen) {
84 out[y] = tmp;
9685 }
97 out[y++] = tmp;
86 y++;
87 }
88 if (y > *outlen) {
89 err = CRYPT_BUFFER_OVERFLOW;
90 } else {
91 err = CRYPT_OK;
9892 }
9993 *outlen = y;
10094
101 return CRYPT_OK;
95 return err;
10296 }
10397
10498 #endif
2727 unsigned char *out, unsigned long *outlen)
2828 {
2929 unsigned long x, y, len;
30 int err;
3031
3132 LTC_ARGCHK(in != NULL);
3233 LTC_ARGCHK(out != NULL);
3738 if (!der_utf8_valid_char(in[x])) return CRYPT_INVALID_ARG;
3839 len += der_utf8_charsize(in[x]);
3940 }
40
41 if (len < 128) {
42 y = 2 + len;
43 } else if (len < 256) {
44 y = 3 + len;
45 } else if (len < 65536UL) {
46 y = 4 + len;
47 } else if (len < 16777216UL) {
48 y = 5 + len;
49 } else {
50 return CRYPT_INVALID_ARG;
41 if ((err = der_length_asn1_length(len, &x)) != CRYPT_OK) {
42 return err;
5143 }
44 x += len + 1;
5245
5346 /* too big? */
54 if (y > *outlen) {
55 *outlen = len;
47 if (x > *outlen) {
48 *outlen = x;
5649 return CRYPT_BUFFER_OVERFLOW;
5750 }
5851
5952 /* encode the header+len */
6053 x = 0;
6154 out[x++] = 0x0C;
62 if (len < 128) {
63 out[x++] = (unsigned char)len;
64 } else if (len < 256) {
65 out[x++] = 0x81;
66 out[x++] = (unsigned char)len;
67 } else if (len < 65536UL) {
68 out[x++] = 0x82;
69 out[x++] = (unsigned char)((len>>8)&255);
70 out[x++] = (unsigned char)(len&255);
71 } else if (len < 16777216UL) {
72 out[x++] = 0x83;
73 out[x++] = (unsigned char)((len>>16)&255);
74 out[x++] = (unsigned char)((len>>8)&255);
75 out[x++] = (unsigned char)(len&255);
76 } else {
77 /* coverity[dead_error_line] */
78 return CRYPT_INVALID_ARG;
55
56 y = *outlen - x;
57 if ((err = der_encode_asn1_length(len, out + x, &y)) != CRYPT_OK) {
58 return err;
7959 }
60 x += y;
8061
8162 /* store UTF8 */
8263 for (y = 0; y < inlen; y++) {
9071 }
9172 }
9273
93 /* retun length */
74 /* return length */
9475 *outlen = x;
9576
9677 return CRYPT_OK;
6464 int der_length_utf8_string(const wchar_t *in, unsigned long noctets, unsigned long *outlen)
6565 {
6666 unsigned long x, len;
67 int err;
6768
6869 LTC_ARGCHK(in != NULL);
6970 LTC_ARGCHK(outlen != NULL);
7475 len += der_utf8_charsize(in[x]);
7576 }
7677
77 if (len < 128) {
78 /* 0C LL DD DD DD ... */
79 *outlen = 2 + len;
80 } else if (len < 256) {
81 /* 0C 81 LL DD DD DD ... */
82 *outlen = 3 + len;
83 } else if (len < 65536UL) {
84 /* 0C 82 LL LL DD DD DD ... */
85 *outlen = 4 + len;
86 } else if (len < 16777216UL) {
87 /* 0C 83 LL LL LL DD DD DD ... */
88 *outlen = 5 + len;
89 } else {
90 return CRYPT_INVALID_ARG;
78 if ((err = der_length_asn1_length(len, &x)) != CRYPT_OK) {
79 return err;
9180 }
81 *outlen = 1 + x + len;
9282
9383 return CRYPT_OK;
9484 }
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file x509_decode_subject_public_key_info.c
12 ASN.1 DER/X.509, encode a SubjectPublicKeyInfo structure --nmav
13 */
14
15 #ifdef LTC_DER
16
17 /* AlgorithmIdentifier := SEQUENCE {
18 * algorithm OBJECT IDENTIFIER,
19 * parameters ANY DEFINED BY algorithm
20 * }
21 *
22 * SubjectPublicKeyInfo := SEQUENCE {
23 * algorithm AlgorithmIdentifier,
24 * subjectPublicKey BIT STRING
25 * }
26 */
27 /**
28 Decode a SubjectPublicKeyInfo
29 @param in The input buffer
30 @param inlen The length of the input buffer
31 @param algorithm One out of the enum #public_key_algorithms
32 @param public_key The buffer for the public key
33 @param public_key_len [in/out] The length of the public key buffer and the written length
34 @param parameters_type The parameters' type out of the enum ltc_asn1_type
35 @param parameters The parameters to include
36 @param parameters_len [in/out]The number of parameters to include
37 @return CRYPT_OK on success
38 */
39 int x509_decode_subject_public_key_info(const unsigned char *in, unsigned long inlen,
40 unsigned int algorithm, void* public_key, unsigned long* public_key_len,
41 unsigned long parameters_type, void* parameters, unsigned long *parameters_len)
42 {
43 int err;
44 unsigned long len;
45 oid_st oid;
46 unsigned char *tmpbuf;
47 unsigned long tmpoid[16];
48 ltc_asn1_list alg_id[2];
49 ltc_asn1_list subject_pubkey[2];
50
51 LTC_ARGCHK(in != NULL);
52 LTC_ARGCHK(inlen != 0);
53 LTC_ARGCHK(public_key_len != NULL);
54 LTC_ARGCHK(parameters_len != NULL);
55
56 err = pk_get_oid(algorithm, &oid);
57 if (err != CRYPT_OK) {
58 return err;
59 }
60
61 /* see if the OpenSSL DER format RSA public key will work */
62 tmpbuf = XCALLOC(1, inlen);
63 if (tmpbuf == NULL) {
64 err = CRYPT_MEM;
65 goto LBL_ERR;
66 }
67
68 /* this includes the internal hash ID and optional params (NULL in this case) */
69 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, sizeof(tmpoid)/sizeof(tmpoid[0]));
70 LTC_SET_ASN1(alg_id, 1, (ltc_asn1_type)parameters_type, parameters, *parameters_len);
71
72 /* the actual format of the SSL DER key is odd, it stores a RSAPublicKey
73 * in a **BIT** string ... so we have to extract it then proceed to convert bit to octet
74 */
75 LTC_SET_ASN1(subject_pubkey, 0, LTC_ASN1_SEQUENCE, alg_id, 2);
76 LTC_SET_ASN1(subject_pubkey, 1, LTC_ASN1_RAW_BIT_STRING, tmpbuf, inlen*8U);
77
78 err=der_decode_sequence(in, inlen, subject_pubkey, 2UL);
79 if (err != CRYPT_OK) {
80 goto LBL_ERR;
81 }
82
83 *parameters_len = alg_id[1].size;
84
85 if ((alg_id[0].size != oid.OIDlen) ||
86 XMEMCMP(oid.OID, alg_id[0].data, oid.OIDlen * sizeof(oid.OID[0]))) {
87 /* OID mismatch */
88 err = CRYPT_PK_INVALID_TYPE;
89 goto LBL_ERR;
90 }
91
92 len = subject_pubkey[1].size/8;
93 if (*public_key_len > len) {
94 XMEMCPY(public_key, subject_pubkey[1].data, len);
95 *public_key_len = len;
96 } else {
97 *public_key_len = len;
98 err = CRYPT_BUFFER_OVERFLOW;
99 goto LBL_ERR;
100 }
101
102 err = CRYPT_OK;
103
104 LBL_ERR:
105
106 XFREE(tmpbuf);
107
108 return err;
109 }
110
111 #endif
112
113 /* ref: $Format:%D$ */
114 /* git commit: $Format:%H$ */
115 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 /**
11 @file x509_encode_subject_public_key_info.c
12 ASN.1 DER/X.509, encode a SubjectPublicKeyInfo structure --nmav
13 */
14
15 #ifdef LTC_DER
16
17 /* AlgorithmIdentifier := SEQUENCE {
18 * algorithm OBJECT IDENTIFIER,
19 * parameters ANY DEFINED BY algorithm
20 * }
21 *
22 * SubjectPublicKeyInfo := SEQUENCE {
23 * algorithm AlgorithmIdentifier,
24 * subjectPublicKey BIT STRING
25 * }
26 */
27 /**
28 Encode a SubjectPublicKeyInfo
29 @param out The output buffer
30 @param outlen [in/out] Length of buffer and resulting length of output
31 @param algorithm One out of the enum #public_key_algorithms
32 @param public_key The buffer for the public key
33 @param public_key_len The length of the public key buffer
34 @param parameters_type The parameters' type out of the enum ltc_asn1_type
35 @param parameters The parameters to include
36 @param parameters_len The number of parameters to include
37 @return CRYPT_OK on success
38 */
39 int x509_encode_subject_public_key_info(unsigned char *out, unsigned long *outlen,
40 unsigned int algorithm, void* public_key, unsigned long public_key_len,
41 unsigned long parameters_type, void* parameters, unsigned long parameters_len)
42 {
43 int err;
44 ltc_asn1_list alg_id[2];
45 oid_st oid;
46
47 LTC_ARGCHK(out != NULL);
48 LTC_ARGCHK(outlen != NULL);
49
50 err = pk_get_oid(algorithm, &oid);
51 if (err != CRYPT_OK) {
52 return err;
53 }
54
55 LTC_SET_ASN1(alg_id, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid.OID, oid.OIDlen);
56 LTC_SET_ASN1(alg_id, 1, (ltc_asn1_type)parameters_type, parameters, parameters_len);
57
58 return der_encode_sequence_multi(out, outlen,
59 LTC_ASN1_SEQUENCE, (unsigned long)sizeof(alg_id)/sizeof(alg_id[0]), alg_id,
60 LTC_ASN1_RAW_BIT_STRING, public_key_len*8U, public_key,
61 LTC_ASN1_EOL, 0UL, NULL);
62
63 }
64
65 #endif
66
67 /* ref: $Format:%D$ */
68 /* git commit: $Format:%H$ */
69 /* commit time: $Format:%ai$ */
70
8585 LTC_SET_ASN1(int_list, 1, LTC_ASN1_INTEGER, key->q, 1UL);
8686 LTC_SET_ASN1(int_list, 2, LTC_ASN1_INTEGER, key->g, 1UL);
8787
88 err = der_encode_subject_public_key_info(out, outlen, PKA_DSA, tmp,
88 err = x509_encode_subject_public_key_info(out, outlen, PKA_DSA, tmp,
8989 tmplen, LTC_ASN1_SEQUENCE, int_list,
9090 sizeof(int_list) / sizeof(int_list[0]));
9191
2424 int dsa_import(const unsigned char *in, unsigned long inlen, dsa_key *key)
2525 {
2626 int err, stat;
27 unsigned long zero = 0;
27 unsigned long zero = 0, len;
2828 unsigned char* tmpbuf = NULL;
2929 unsigned char flags[1];
3030
101101 goto LBL_ERR;
102102 }
103103
104 err = der_decode_subject_public_key_info(in, inlen, PKA_DSA,
104 len = 3;
105 err = x509_decode_subject_public_key_info(in, inlen, PKA_DSA,
105106 tmpbuf, &tmpbuf_len,
106 LTC_ASN1_SEQUENCE, params, 3);
107 LTC_ASN1_SEQUENCE, params, &len);
107108 if (err != CRYPT_OK) {
108109 XFREE(tmpbuf);
109110 goto LBL_ERR;
110110 LTC_SET_ASN1(sig_seq, 0, LTC_ASN1_INTEGER, r, 1UL);
111111 LTC_SET_ASN1(sig_seq, 1, LTC_ASN1_INTEGER, s, 1UL);
112112
113 err = der_decode_sequence(sig, siglen, sig_seq, 2);
113 err = der_decode_sequence_strict(sig, siglen, sig_seq, 2);
114114 if (err != CRYPT_OK) {
115115 goto LBL_ERR;
116116 }
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
1815
1916 #ifdef LTC_MECC
2017
21 /* This array holds the curve parameters:
22 * - it ***MUST*** be organized by size from smallest to largest
23 * - due to curve lookup by keysize the ordering is very important
24 * - be careful when adding/removing items to/from this list
18 /* This array holds the curve parameters.
2519 * Curves (prime field only) are taken from:
2620 * - http://www.secg.org/collateral/sec2_final.pdf (named: SECP*)
2721 * - http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf (named: NISTP*)
3024 */
3125 const ltc_ecc_set_type ltc_ecc_sets[] = {
3226 #if defined(LTC_ECC_SECP112R1) || defined(LTC_ECC112)
33 { /* this curve ***MUST*** be the first from all with size 14 (backward compatibility reasons) */
34 /* size/bytes */ 14,
27 {
3528 /* curve name */ "SECP112R1",
3629 /* prime */ "DB7C2ABF62E35E668076BEAD208B",
3730 /* A */ "DB7C2ABF62E35E668076BEAD2088",
4033 /* Gx */ "09487239995A5EE76B55F9C2F098",
4134 /* Gy */ "A89CE5AF8724C0A23E0E0FF77500",
4235 /* cofactor */ 1,
43 /* OID struct */ { {1,3,132,0,6}, 5 }
36 /* OID */ { 1,3,132,0,6 }, 5
4437 },
4538 #endif
4639 #ifdef LTC_ECC_SECP112R2
4740 {
48 /* size/bytes */ 14,
4941 /* curve name */ "SECP112R2",
5042 /* prime */ "DB7C2ABF62E35E668076BEAD208B",
5143 /* A */ "6127C24C05F38A0AAAF65C0EF02C",
5446 /* Gx */ "4BA30AB5E892B4E1649DD0928643",
5547 /* Gy */ "ADCD46F5882E3747DEF36E956E97",
5648 /* cofactor */ 4,
57 /* OID struct */ { {1,3,132,0,7}, 5 }
49 /* OID */ { 1,3,132,0,7 }, 5
5850 },
5951 #endif
6052 #if defined(LTC_ECC_SECP128R1) || defined(LTC_ECC128)
61 { /* this curve ***MUST*** be the first from all with size 16 (backward compatibility reasons) */
62 /* size/bytes */ 16,
53 {
6354 /* curve name */ "SECP128R1",
6455 /* prime */ "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
6556 /* A */ "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC",
6859 /* Gx */ "161FF7528B899B2D0C28607CA52C5B86",
6960 /* Gy */ "CF5AC8395BAFEB13C02DA292DDED7A83",
7061 /* cofactor */ 1,
71 /* OID struct */ { {1,3,132,0,28}, 5 }
62 /* OID */ { 1,3,132,0,28 }, 5
7263 },
7364 #endif
7465 #ifdef LTC_ECC_SECP128R2
7566 {
76 /* size/bytes */ 16,
7767 /* curve name */ "SECP128R2",
7868 /* prime */ "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF",
7969 /* A */ "D6031998D1B3BBFEBF59CC9BBFF9AEE1",
8272 /* Gx */ "7B6AA5D85E572983E6FB32A7CDEBC140",
8373 /* Gy */ "27B6916A894D3AEE7106FE805FC34B44",
8474 /* cofactor */ 4,
85 /* OID struct */ { {1,3,132,0,29}, 5 }
75 /* OID */ { 1,3,132,0,29 }, 5
8676 },
8777 #endif
8878 #if defined(LTC_ECC_SECP160R1) || defined(LTC_ECC160)
89 { /* this curve ***MUST*** be the first from all with size 20 (backward compatibility reasons) */
90 /* size/bytes */ 20,
79 {
9180 /* curve name */ "SECP160R1",
9281 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF",
9382 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC",
9685 /* Gx */ "4A96B5688EF573284664698968C38BB913CBFC82",
9786 /* Gy */ "23A628553168947D59DCC912042351377AC5FB32",
9887 /* cofactor */ 1,
99 /* OID struct */ { {1,3,132,0,8}, 5 }
88 /* OID */ { 1,3,132,0,8 }, 5
10089 },
10190 #endif
10291 #ifdef LTC_ECC_SECP160R2
10392 {
104 /* size/bytes */ 20,
10593 /* curve name */ "SECP160R2",
10694 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
10795 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70",
11098 /* Gx */ "52DCB034293A117E1F4FF11B30F7199D3144CE6D",
11199 /* Gy */ "FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E",
112100 /* cofactor */ 1,
113 /* OID struct */ { {1,3,132,0,30}, 5 }
101 /* OID */ { 1,3,132,0,30 }, 5
114102 },
115103 #endif
116104 #ifdef LTC_ECC_SECP160K1
117105 {
118 /* size/bytes */ 20,
119106 /* curve name */ "SECP160K1",
120107 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73",
121108 /* A */ "0000000000000000000000000000000000000000",
124111 /* Gx */ "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB",
125112 /* Gy */ "938CF935318FDCED6BC28286531733C3F03C4FEE",
126113 /* cofactor */ 1,
127 /* OID struct */ { {1,3,132,0,9}, 5 }
114 /* OID */ { 1,3,132,0,9 }, 5
115 },
116 #endif
117 #if defined(LTC_ECC_SECP192R1) || defined(LTC_ECC192)
118 {
119 /* curve name */ "SECP192R1", /* same as: NISTP192 PRIME192V1, old libtomcrypt name: ECC-192 */
120 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
121 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
122 /* B */ "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
123 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
124 /* Gx */ "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
125 /* Gy */ "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
126 /* cofactor */ 1,
127 /* OID */ { 1,2,840,10045,3,1,1 }, 7
128 },
129 #endif
130 #ifdef LTC_ECC_PRIME192V2
131 {
132 /* curve name */ "PRIME192V2",
133 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
134 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
135 /* B */ "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
136 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",
137 /* Gx */ "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
138 /* Gy */ "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15",
139 /* cofactor */ 1,
140 /* OID */ { 1,2,840,10045,3,1,2 }, 7
141 },
142 #endif
143 #ifdef LTC_ECC_PRIME192V3
144 {
145 /* curve name */ "PRIME192V3",
146 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
147 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
148 /* B */ "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
149 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",
150 /* Gx */ "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
151 /* Gy */ "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0",
152 /* cofactor */ 1,
153 /* OID */ { 1,2,840,10045,3,1,3 }, 7
154 },
155 #endif
156 #ifdef LTC_ECC_SECP192K1
157 {
158 /* curve name */ "SECP192K1",
159 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
160 /* A */ "000000000000000000000000000000000000000000000000",
161 /* B */ "000000000000000000000000000000000000000000000003",
162 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
163 /* Gx */ "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
164 /* Gy */ "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
165 /* cofactor */ 1,
166 /* OID */ { 1,3,132,0,31 }, 5
167 },
168 #endif
169 #if defined(LTC_ECC_SECP224R1) || defined(LTC_ECC224)
170 {
171 /* curve name */ "SECP224R1", /* same as: NISTP224, old libtomcrypt name: ECC-224 */
172 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
173 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
174 /* B */ "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
175 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
176 /* Gx */ "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
177 /* Gy */ "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
178 /* cofactor */ 1,
179 /* OID */ { 1,3,132,0,33 }, 5
180 },
181 #endif
182 #ifdef LTC_ECC_SECP224K1
183 {
184 /* curve name */ "SECP224K1",
185 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
186 /* A */ "00000000000000000000000000000000000000000000000000000000",
187 /* B */ "00000000000000000000000000000000000000000000000000000005",
188 /* order */ "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
189 /* Gx */ "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
190 /* Gy */ "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
191 /* cofactor */ 1,
192 /* OID */ { 1,3,132,0,32 }, 5
193 },
194 #endif
195 #if defined(LTC_ECC_SECP256R1) || defined(LTC_ECC256)
196 {
197 /* curve name */ "SECP256R1", /* same as: NISTP256 PRIME256V1, old libtomcrypt name: ECC-256 */
198 /* prime */ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
199 /* A */ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
200 /* B */ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
201 /* order */ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
202 /* Gx */ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
203 /* Gy */ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
204 /* cofactor */ 1,
205 /* OID */ { 1,2,840,10045,3,1,7 }, 7
206 },
207 #endif
208 #ifdef LTC_ECC_SECP256K1
209 {
210 /* curve name */ "SECP256K1",
211 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
212 /* A */ "0000000000000000000000000000000000000000000000000000000000000000",
213 /* B */ "0000000000000000000000000000000000000000000000000000000000000007",
214 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
215 /* Gx */ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
216 /* Gy */ "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
217 /* cofactor */ 1,
218 /* OID */ { 1,3,132,0,10 }, 5
219 },
220 #endif
221 #if defined(LTC_ECC_SECP384R1) || defined(LTC_ECC384)
222 {
223 /* curve name */ "SECP384R1", /* same as: NISTP384, old libtomcrypt name: ECC-384 */
224 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
225 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
226 /* B */ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
227 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
228 /* Gx */ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
229 /* Gy */ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
230 /* cofactor */ 1,
231 /* OID */ { 1,3,132,0,34 }, 5
232 },
233 #endif
234 #if defined(LTC_ECC_SECP521R1) || defined(LTC_ECC521)
235 {
236 /* curve name */ "SECP521R1", /* same as: NISTP521, old libtomcrypt name: ECC-521 */
237 /* prime */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
238 /* A */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
239 /* B */ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
240 /* order */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
241 /* Gx */ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
242 /* Gy */ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
243 /* cofactor */ 1,
244 /* OID */ { 1,3,132,0,35 }, 5
245 },
246 #endif
247 #ifdef LTC_ECC_PRIME239V1
248 {
249 /* curve name */ "PRIME239V1",
250 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
251 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
252 /* B */ "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
253 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",
254 /* Gx */ "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
255 /* Gy */ "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE",
256 /* cofactor */ 1,
257 /* OID */ { 1,2,840,10045,3,1,4 }, 7
258 },
259 #endif
260 #ifdef LTC_ECC_PRIME239V2
261 {
262 /* curve name */ "PRIME239V2",
263 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
264 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
265 /* B */ "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
266 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",
267 /* Gx */ "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
268 /* Gy */ "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA",
269 /* cofactor */ 1,
270 /* OID */ { 1,2,840,10045,3,1,5 }, 7
271 },
272 #endif
273 #ifdef LTC_ECC_PRIME239V3
274 {
275 /* curve name */ "PRIME239V3",
276 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
277 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
278 /* B */ "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
279 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",
280 /* Gx */ "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
281 /* Gy */ "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3",
282 /* cofactor */ 1,
283 /* OID */ { 1,2,840,10045,3,1,6 }, 7
128284 },
129285 #endif
130286 #ifdef LTC_ECC_BRAINPOOLP160R1
131287 {
132 /* size/bytes */ 20,
133288 /* curve name */ "BRAINPOOLP160R1",
134289 /* prime */ "E95E4A5F737059DC60DFC7AD95B3D8139515620F",
135290 /* A */ "340E7BE2A280EB74E2BE61BADA745D97E8F7C300",
138293 /* Gx */ "BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3",
139294 /* Gy */ "1667CB477A1A8EC338F94741669C976316DA6321",
140295 /* cofactor */ 1,
141 /* OID struct */ { {1,3,36,3,3,2,8,1,1,1}, 10 }
142 },
143 #endif
144 #if defined(LTC_ECC_SECP192R1) || defined(LTC_ECC192)
145 { /* this curve ***MUST*** be the first from all with size 24 (backward compatibility reasons) */
146 /* size/bytes */ 24,
147 /* curve name */ "SECP192R1", /* same as: NISTP192 PRIME192V1, old libtomcrypt name: ECC-192 */
148 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
149 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
150 /* B */ "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1",
151 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831",
152 /* Gx */ "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012",
153 /* Gy */ "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811",
154 /* cofactor */ 1,
155 /* OID struct */ { {1,2,840,10045,3,1,1}, 7 }
156 },
157 #endif
158 #ifdef LTC_ECC_PRIME192V2
159 {
160 /* size/bytes */ 24,
161 /* curve name */ "PRIME192V2",
162 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
163 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
164 /* B */ "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953",
165 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31",
166 /* Gx */ "EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A",
167 /* Gy */ "6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15",
168 /* cofactor */ 1,
169 /* OID struct */ { {1,2,840,10045,3,1,2}, 7 }
170 },
171 #endif
172 #ifdef LTC_ECC_PRIME192V3
173 {
174 /* size/bytes */ 24,
175 /* curve name */ "PRIME192V3",
176 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF",
177 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC",
178 /* B */ "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916",
179 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13",
180 /* Gx */ "7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896",
181 /* Gy */ "38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0",
182 /* cofactor */ 1,
183 /* OID struct */ { {1,2,840,10045,3,1,3}, 7 }
184 },
185 #endif
186 #ifdef LTC_ECC_SECP192K1
187 {
188 /* size/bytes */ 24,
189 /* curve name */ "SECP192K1",
190 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37",
191 /* A */ "000000000000000000000000000000000000000000000000",
192 /* B */ "000000000000000000000000000000000000000000000003",
193 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D",
194 /* Gx */ "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D",
195 /* Gy */ "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D",
196 /* cofactor */ 1,
197 /* OID struct */ { {1,3,132,0,31}, 5 }
296 /* OID */ { 1,3,36,3,3,2,8,1,1,1 }, 10
198297 },
199298 #endif
200299 #ifdef LTC_ECC_BRAINPOOLP192R1
201300 {
202 /* size/bytes */ 24,
203301 /* curve name */ "BRAINPOOLP192R1",
204302 /* prime */ "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
205303 /* A */ "6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF",
208306 /* Gx */ "C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6",
209307 /* Gy */ "14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F",
210308 /* cofactor */ 1,
211 /* OID struct */ { {1,3,36,3,3,2,8,1,1,3}, 10 }
212 },
213 #endif
214 #if defined(LTC_ECC_SECP224R1) || defined(LTC_ECC224)
215 { /* this curve ***MUST*** be the first from all with size 28 (backward compatibility reasons) */
216 /* size/bytes */ 28,
217 /* curve name */ "SECP224R1", /* same as: NISTP224, old libtomcrypt name: ECC-224 */
218 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001",
219 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE",
220 /* B */ "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4",
221 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D",
222 /* Gx */ "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21",
223 /* Gy */ "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34",
224 /* cofactor */ 1,
225 /* OID struct */ { {1,3,132,0,33}, 5 }
226 },
227 #endif
228 #ifdef LTC_ECC_SECP224K1
229 {
230 /* size/bytes */ 28,
231 /* curve name */ "SECP224K1",
232 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D",
233 /* A */ "00000000000000000000000000000000000000000000000000000000",
234 /* B */ "00000000000000000000000000000000000000000000000000000005",
235 /* order */ "010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7",
236 /* Gx */ "A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C",
237 /* Gy */ "7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5",
238 /* cofactor */ 1,
239 /* OID struct */ { {1,3,132,0,32}, 5 }
309 /* OID */ { 1,3,36,3,3,2,8,1,1,3 }, 10
240310 },
241311 #endif
242312 #ifdef LTC_ECC_BRAINPOOLP224R1
243313 {
244 /* size/bytes */ 28,
245314 /* curve name */ "BRAINPOOLP224R1",
246315 /* prime */ "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
247316 /* A */ "68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43",
250319 /* Gx */ "0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D",
251320 /* Gy */ "58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD",
252321 /* cofactor */ 1,
253 /* OID struct */ { {1,3,36,3,3,2,8,1,1,5}, 10 }
254 },
255 #endif
256 #ifdef LTC_ECC_PRIME239V1
257 {
258 /* size/bytes */ 30,
259 /* curve name */ "PRIME239V1",
260 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
261 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
262 /* B */ "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A",
263 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B",
264 /* Gx */ "0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF",
265 /* Gy */ "7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE",
266 /* cofactor */ 1,
267 /* OID struct */ { {1,2,840,10045,3,1,4}, 7 }
268 },
269 #endif
270 #ifdef LTC_ECC_PRIME239V2
271 {
272 /* size/bytes */ 30,
273 /* curve name */ "PRIME239V2",
274 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
275 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
276 /* B */ "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C",
277 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063",
278 /* Gx */ "38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7",
279 /* Gy */ "5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA",
280 /* cofactor */ 1,
281 /* OID struct */ { {1,2,840,10045,3,1,5}, 7 }
282 },
283 #endif
284 #ifdef LTC_ECC_PRIME239V3
285 {
286 /* size/bytes */ 30,
287 /* curve name */ "PRIME239V3",
288 /* prime */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF",
289 /* A */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC",
290 /* B */ "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E",
291 /* order */ "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551",
292 /* Gx */ "6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A",
293 /* Gy */ "1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3",
294 /* cofactor */ 1,
295 /* OID struct */ { {1,2,840,10045,3,1,6}, 7 }
296 },
297 #endif
298 #if defined(LTC_ECC_SECP256R1) || defined(LTC_ECC256)
299 { /* this curve ***MUST*** be the first from all with size 32 (backward compatibility reasons) */
300 /* size/bytes */ 32,
301 /* curve name */ "SECP256R1", /* same as: NISTP256 PRIME256V1, old libtomcrypt name: ECC-256 */
302 /* prime */ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
303 /* A */ "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC",
304 /* B */ "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B",
305 /* order */ "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
306 /* Gx */ "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
307 /* Gy */ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
308 /* cofactor */ 1,
309 /* OID struct */ { {1,2,840,10045,3,1,7}, 7 }
310 },
311 #endif
312 #ifdef LTC_ECC_SECP256K1
313 {
314 /* size/bytes */ 32,
315 /* curve name */ "SECP256K1",
316 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F",
317 /* A */ "0000000000000000000000000000000000000000000000000000000000000000",
318 /* B */ "0000000000000000000000000000000000000000000000000000000000000007",
319 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141",
320 /* Gx */ "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798",
321 /* Gy */ "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8",
322 /* cofactor */ 1,
323 /* OID struct */ { {1,3,132,0,10}, 5 }
322 /* OID */ { 1,3,36,3,3,2,8,1,1,5 }, 10
324323 },
325324 #endif
326325 #ifdef LTC_ECC_BRAINPOOLP256R1
327326 {
328 /* size/bytes */ 32,
329327 /* curve name */ "BRAINPOOLP256R1",
330328 /* prime */ "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
331329 /* A */ "7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9",
334332 /* Gx */ "8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262",
335333 /* Gy */ "547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997",
336334 /* cofactor */ 1,
337 /* OID struct */ { {1,3,36,3,3,2,8,1,1,7}, 10 }
335 /* OID */ { 1,3,36,3,3,2,8,1,1,7 }, 10
338336 },
339337 #endif
340338 #ifdef LTC_ECC_BRAINPOOLP320R1
341339 {
342 /* size/bytes */ 40,
343340 /* curve name */ "BRAINPOOLP320R1",
344341 /* prime */ "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
345342 /* A */ "3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F492F375A97D860EB4",
348345 /* Gx */ "43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C710AF8D0D39E20611",
349346 /* Gy */ "14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7D35245D1692E8EE1",
350347 /* cofactor */ 1,
351 /* OID struct */ { {1,3,36,3,3,2,8,1,1,9}, 10 }
352 },
353 #endif
354 #if defined(LTC_ECC_SECP384R1) || defined(LTC_ECC384)
355 { /* this curve ***MUST*** be the first from all with size 48 (backward compatibility reasons) */
356 /* size/bytes */ 48,
357 /* curve name */ "SECP384R1", /* same as: NISTP384, old libtomcrypt name: ECC-384 */
358 /* prime */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
359 /* A */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
360 /* B */ "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
361 /* order */ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
362 /* Gx */ "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
363 /* Gy */ "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
364 /* cofactor */ 1,
365 /* OID struct */ { {1,3,132,0,34}, 5 }
348 /* OID */ { 1,3,36,3,3,2,8,1,1,9 }, 10
366349 },
367350 #endif
368351 #ifdef LTC_ECC_BRAINPOOLP384R1
369352 {
370 /* size/bytes */ 48,
371353 /* curve name */ "BRAINPOOLP384R1",
372354 /* prime */ "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
373355 /* A */ "7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503AD4EB04A8C7DD22CE2826",
376358 /* Gx */ "1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E",
377359 /* Gy */ "8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315",
378360 /* cofactor */ 1,
379 /* OID struct */ { {1,3,36,3,3,2,8,1,1,11}, 10 }
361 /* OID */ { 1,3,36,3,3,2,8,1,1,11 }, 10
380362 },
381363 #endif
382364 #ifdef LTC_ECC_BRAINPOOLP512R1
383365 {
384 /* size/bytes */ 64,
385366 /* curve name */ "BRAINPOOLP512R1",
386367 /* prime */ "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
387368 /* A */ "7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA",
390371 /* Gx */ "81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822",
391372 /* Gy */ "7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892",
392373 /* cofactor */ 1,
393 /* OID struct */ { {1,3,36,3,3,2,8,1,1,13}, 10 }
394 },
395 #endif
396 #if defined(LTC_ECC_SECP521R1) || defined(LTC_ECC521)
397 { /* this curve ***MUST*** be the first from all with size 66 (backward compatibility reasons) */
398 /* size/bytes */ 66,
399 /* curve name */ "SECP521R1", /* same as: NISTP521, old libtomcrypt name: ECC-521 */
400 /* prime */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF",
401 /* A */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC",
402 /* B */ "0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00",
403 /* order */ "01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409",
404 /* Gx */ "00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66",
405 /* Gy */ "011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD16650",
406 /* cofactor */ 1,
407 /* OID struct */ { {1,3,132,0,35}, 5 }
408 },
409 #endif
410 {
411 0,
374 /* OID */ { 1,3,36,3,3,2,8,1,1,13 }, 10
375 },
376 #endif
377 #ifdef LTC_ECC_BRAINPOOLP160T1
378 {
379 /* curve name */ "BRAINPOOLP160T1",
380 /* prime */ "E95E4A5F737059DC60DFC7AD95B3D8139515620F",
381 /* A */ "E95E4A5F737059DC60DFC7AD95B3D8139515620C",
382 /* B */ "7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380",
383 /* order */ "E95E4A5F737059DC60DF5991D45029409E60FC09",
384 /* Gx */ "B199B13B9B34EFC1397E64BAEB05ACC265FF2378",
385 /* Gy */ "ADD6718B7C7C1961F0991B842443772152C9E0AD",
386 /* cofactor */ 1,
387 /* OID */ { 1,3,36,3,3,2,8,1,1,2 }, 10
388 },
389 #endif
390 #ifdef LTC_ECC_BRAINPOOLP192T1
391 {
392 /* curve name */ "BRAINPOOLP192T1",
393 /* prime */ "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297",
394 /* A */ "C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294",
395 /* B */ "13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79",
396 /* order */ "C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1",
397 /* Gx */ "3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129",
398 /* Gy */ "097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9",
399 /* cofactor */ 1,
400 /* OID */ { 1,3,36,3,3,2,8,1,1,4 }, 10
401 },
402 #endif
403 #ifdef LTC_ECC_BRAINPOOLP224T1
404 {
405 /* curve name */ "BRAINPOOLP224T1",
406 /* prime */ "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF",
407 /* A */ "D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC",
408 /* B */ "4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D",
409 /* order */ "D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F",
410 /* Gx */ "6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580",
411 /* Gy */ "0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C",
412 /* cofactor */ 1,
413 /* OID */ { 1,3,36,3,3,2,8,1,1,6 }, 10
414 },
415 #endif
416 #ifdef LTC_ECC_BRAINPOOLP256T1
417 {
418 /* curve name */ "BRAINPOOLP256T1",
419 /* prime */ "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377",
420 /* A */ "A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374",
421 /* B */ "662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04",
422 /* order */ "A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7",
423 /* Gx */ "A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4",
424 /* Gy */ "2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE",
425 /* cofactor */ 1,
426 /* OID */ { 1,3,36,3,3,2,8,1,1,8 }, 10
427 },
428 #endif
429 #ifdef LTC_ECC_BRAINPOOLP320T1
430 {
431 /* curve name */ "BRAINPOOLP320T1",
432 /* prime */ "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E27",
433 /* A */ "D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28FCD412B1F1B32E24",
434 /* B */ "A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CEB5B4FEF422340353",
435 /* order */ "D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E98691555B44C59311",
436 /* Gx */ "925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF3357F624A21BED52",
437 /* Gy */ "63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B1B9BC0455FB0D2C3",
438 /* cofactor */ 1,
439 /* OID */ { 1,3,36,3,3,2,8,1,1,10 }, 10
440 },
441 #endif
442 #ifdef LTC_ECC_BRAINPOOLP384T1
443 {
444 /* curve name */ "BRAINPOOLP384T1",
445 /* prime */ "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53",
446 /* A */ "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC50",
447 /* B */ "7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE",
448 /* order */ "8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565",
449 /* Gx */ "18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC",
450 /* Gy */ "25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928",
451 /* cofactor */ 1,
452 /* OID */ { 1,3,36,3,3,2,8,1,1,12 }, 10
453 },
454 #endif
455 #ifdef LTC_ECC_BRAINPOOLP512T1
456 {
457 /* curve name */ "BRAINPOOLP512T1",
458 /* prime */ "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3",
459 /* A */ "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0",
460 /* B */ "7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E",
461 /* order */ "AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069",
462 /* Gx */ "640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA",
463 /* Gy */ "5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332",
464 /* cofactor */ 1,
465 /* OID */ { 1,3,36,3,3,2,8,1,1,14 }, 10
466 },
467 #endif
468 {
412469 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
413470 0,
414 { { 0 }, 0 }
471 { 0 }, 0
415472 }
416473 };
417474
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
3330 LTC_ARGCHK(out != NULL);
3431 LTC_ARGCHK(outlen != NULL);
3532
36 if (ltc_ecc_is_valid_idx(key->idx) == 0) {
37 return CRYPT_INVALID_ARG;
38 }
39 numlen = key->dp->size;
33 numlen = key->dp.size;
4034 xlen = mp_unsigned_bin_size(key->pubkey.x);
4135 ylen = mp_unsigned_bin_size(key->pubkey.y);
4236
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2825 return ecc_ansi_x963_import_ex(in, inlen, key, NULL);
2926 }
3027
31 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp)
28 int ecc_ansi_x963_import_ex(const unsigned char *in, unsigned long inlen, ecc_key *key, const ltc_ecc_set_type *dp)
3229 {
33 int x, err;
30 int err;
3431
3532 LTC_ARGCHK(in != NULL);
3633 LTC_ARGCHK(key != NULL);
4037 return CRYPT_INVALID_ARG;
4138 }
4239
43 /* init key */
44 if (mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL) != CRYPT_OK) {
45 return CRYPT_MEM;
40 /* initialize key->dp */
41 if (dp == NULL) {
42 /* this case works only for uncompressed public keys */
43 if ((err = ecc_set_dp_size((inlen-1)>>1, key)) != CRYPT_OK) { return err; }
44 }
45 else {
46 /* this one works for both compressed / uncompressed pubkeys */
47 if ((err = ecc_set_dp(dp, key)) != CRYPT_OK) { return err; }
4648 }
4749
48 /* check for 4, 6 or 7 */
49 if (in[0] != 4 && in[0] != 6 && in[0] != 7) {
50 err = CRYPT_INVALID_PACKET;
51 goto error;
52 }
53
54 /* read data */
55 if ((err = mp_read_unsigned_bin(key->pubkey.x, (unsigned char *)in+1, (inlen-1)>>1)) != CRYPT_OK) {
56 goto error;
57 }
58
59 if ((err = mp_read_unsigned_bin(key->pubkey.y, (unsigned char *)in+1+((inlen-1)>>1), (inlen-1)>>1)) != CRYPT_OK) {
60 goto error;
61 }
62 if ((err = mp_set(key->pubkey.z, 1)) != CRYPT_OK) { goto error; }
63
64 if (dp == NULL) {
65 /* BEWARE: Here we are looking up the curve params by keysize (neither curve name nor curve oid),
66 * which might be ambiguous (there can more than one curve for given keysize).
67 * Thus the chosen curve depends on order of items in ltc_ecc_sets[] - see ecc.c file.
68 */
69 /* determine the idx */
70 for (x = 0; ltc_ecc_sets[x].size != 0; x++) {
71 if ((unsigned)ltc_ecc_sets[x].size >= ((inlen-1)>>1)) {
72 break;
73 }
74 }
75 if (ltc_ecc_sets[x].size == 0) {
76 err = CRYPT_INVALID_PACKET;
77 goto error;
78 }
79 /* set the idx */
80 key->idx = x;
81 key->dp = &ltc_ecc_sets[x];
82 } else {
83 if (((inlen-1)>>1) != (unsigned long) dp->size) {
84 err = CRYPT_INVALID_PACKET;
85 goto error;
86 }
87 key->idx = -1;
88 key->dp = dp;
89 }
90 key->type = PK_PUBLIC;
50 /* load public key */
51 if ((err = ecc_set_key((unsigned char *)in, inlen, PK_PUBLIC, key)) != CRYPT_OK) { return err; }
9152
9253 /* we're done */
9354 return CRYPT_OK;
94 error:
95 mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, NULL);
96 return err;
9755 }
9856
9957 #endif
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
3229 ecc_key *key)
3330 {
3431 unsigned char *ecc_shared, *skey, *pub_expt;
35 unsigned long x, y, hashOID[32];
32 unsigned long x, y;
33 unsigned long hashOID[32] = { 0 };
3634 int hash, err;
3735 ecc_key pubkey;
3836 ltc_asn1_list decode[3];
8684 }
8785
8886 /* import ECC key from packet */
89 if ((err = ecc_import_raw(decode[1].data, decode[1].size, &pubkey, (ltc_ecc_set_type *)key->dp)) != CRYPT_OK) {
90 goto LBL_ERR;
91 }
87 if ((err = ecc_set_dp_copy(key, &pubkey)) != CRYPT_OK) { goto LBL_ERR; }
88 if ((err = ecc_set_key(decode[1].data, decode[1].size, PK_PUBLIC, &pubkey)) != CRYPT_OK) { goto LBL_ERR; }
9289
9390 /* make shared key */
9491 x = ECC_BUF_SIZE;
+0
-36
src/ltc/pk/ecc/ecc_dp_clear.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 #ifdef LTC_MECC
17
18 int ecc_dp_clear(ltc_ecc_set_type *dp)
19 {
20 if (dp == NULL) return CRYPT_INVALID_ARG;
21
22 if (dp->name != NULL) { XFREE(dp->name ); dp->name = NULL; }
23 if (dp->prime != NULL) { XFREE(dp->prime); dp->prime = NULL; }
24 if (dp->A != NULL) { XFREE(dp->A ); dp->A = NULL; }
25 if (dp->B != NULL) { XFREE(dp->B ); dp->B = NULL; }
26 if (dp->order != NULL) { XFREE(dp->order); dp->order = NULL; }
27 if (dp->Gx != NULL) { XFREE(dp->Gx ); dp->Gx = NULL; }
28 if (dp->Gy != NULL) { XFREE(dp->Gy ); dp->Gy = NULL; }
29 dp->cofactor = 0;
30 dp->oid.OIDlen = 0;
31
32 return CRYPT_OK;
33 }
34
35 #endif
+0
-76
src/ltc/pk/ecc/ecc_dp_fill_from_sets.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 #include "tomcrypt.h"
11
12 #ifdef LTC_MECC
13
14 static int hexstrcmp(const char *hexa, const char *hexb)
15 {
16 #define MY_TOLOWER(a) ((((a)>='A')&&((a)<='Z')) ? ((a)|0x60) : (a))
17 /* ignore leading zeroes */
18 while(*hexa == '0') hexa++;
19 while(*hexb == '0') hexb++;
20 /* compare: case insensitive, hexadecimal chars only */
21 while (*hexa && *hexb) {
22 if ( (*hexa < '0' || *hexa > '9') &&
23 (*hexa < 'a' || *hexa > 'f') &&
24 (*hexa < 'A' || *hexa > 'F') ) return 1;
25 if ( (*hexb < '0' || *hexb > '9') &&
26 (*hexb < 'a' || *hexb > 'f') &&
27 (*hexb < 'A' || *hexb > 'F') ) return 1;
28 if (MY_TOLOWER(*hexa) != MY_TOLOWER(*hexb)) return 1;
29 hexa++;
30 hexb++;
31 }
32 if (*hexa == '\0' && *hexb == '\0') return 0; /* success - match */
33 return 1;
34 }
35
36 /* search known curve by curve parameters and fill in missing parameters into dp
37 * we assume every parameter has the same case (usually uppercase) and no leading zeros
38 */
39 int ecc_dp_fill_from_sets(ltc_ecc_set_type *dp)
40 {
41 ltc_ecc_set_type params;
42 int x;
43
44 if (!dp) return CRYPT_INVALID_ARG;
45 if (dp->oid.OIDlen > 0) return CRYPT_OK;
46 if (!dp->prime || !dp->A || !dp->B || !dp->order || !dp->Gx || !dp->Gy || dp->cofactor == 0) return CRYPT_INVALID_ARG;
47
48 for (x = 0; ltc_ecc_sets[x].size != 0; x++) {
49 if (hexstrcmp(ltc_ecc_sets[x].prime, dp->prime) == 0 &&
50 hexstrcmp(ltc_ecc_sets[x].A, dp->A) == 0 &&
51 hexstrcmp(ltc_ecc_sets[x].B, dp->B) == 0 &&
52 hexstrcmp(ltc_ecc_sets[x].order, dp->order) == 0 &&
53 hexstrcmp(ltc_ecc_sets[x].Gx, dp->Gx) == 0 &&
54 hexstrcmp(ltc_ecc_sets[x].Gy, dp->Gy) == 0 &&
55 ltc_ecc_sets[x].cofactor == dp->cofactor) {
56
57 params = ltc_ecc_sets[x];
58
59 /* copy oid */
60 dp->oid.OIDlen = params.oid.OIDlen;
61 XMEMCPY(dp->oid.OID, params.oid.OID, dp->oid.OIDlen * sizeof(dp->oid.OID[0]));
62
63 /* copy name */
64 if (dp->name != NULL) XFREE(dp->name);
65 if ((dp->name = XMALLOC(1+strlen(params.name))) == NULL) return CRYPT_MEM;
66 strcpy(dp->name, params.name);
67
68 return CRYPT_OK;
69 }
70 }
71
72 return CRYPT_INVALID_ARG;
73 }
74
75 #endif
+0
-84
src/ltc/pk/ecc/ecc_dp_from_oid.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12
13 #include "tomcrypt.h"
14
15 #ifdef LTC_MECC
16
17 int ecc_dp_set_by_oid(ltc_ecc_set_type *dp, unsigned long *oid, unsigned long oidsize)
18 {
19 int i;
20 unsigned long len;
21
22 for(i=0; ltc_ecc_sets[i].size != 0; i++) {
23 if ((oidsize == ltc_ecc_sets[i].oid.OIDlen) &&
24 (XMEM_NEQ(oid, ltc_ecc_sets[i].oid.OID, sizeof(unsigned long) * ltc_ecc_sets[i].oid.OIDlen) == 0)) {
25 break;
26 }
27 }
28 if (ltc_ecc_sets[i].size == 0) return CRYPT_INVALID_ARG; /* not found */
29
30 /* a */
31 len = (unsigned long)strlen(ltc_ecc_sets[i].A);
32 if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1;
33 strncpy(dp->A, ltc_ecc_sets[i].A, 1+len);
34 /* b */
35 len = (unsigned long)strlen(ltc_ecc_sets[i].B);
36 if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2;
37 strncpy(dp->B, ltc_ecc_sets[i].B, 1+len);
38 /* order */
39 len = (unsigned long)strlen(ltc_ecc_sets[i].order);
40 if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3;
41 strncpy(dp->order, ltc_ecc_sets[i].order, 1+len);
42 /* prime */
43 len = (unsigned long)strlen(ltc_ecc_sets[i].prime);
44 if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4;
45 strncpy(dp->prime, ltc_ecc_sets[i].prime, 1+len);
46 /* gx */
47 len = (unsigned long)strlen(ltc_ecc_sets[i].Gx);
48 if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5;
49 strncpy(dp->Gx, ltc_ecc_sets[i].Gx, 1+len);
50 /* gy */
51 len = (unsigned long)strlen(ltc_ecc_sets[i].Gy);
52 if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6;
53 strncpy(dp->Gy, ltc_ecc_sets[i].Gy, 1+len);
54 /* cofactor & size */
55 dp->cofactor = ltc_ecc_sets[i].cofactor;
56 dp->size = ltc_ecc_sets[i].size;
57 /* name */
58 len = (unsigned long)strlen(ltc_ecc_sets[i].name);
59 if ((dp->name = XMALLOC(1+len)) == NULL) goto cleanup7;
60 strncpy(dp->name, ltc_ecc_sets[i].name, 1+len);
61 /* oid */
62 dp->oid.OIDlen = ltc_ecc_sets[i].oid.OIDlen;
63 XMEMCPY(dp->oid.OID, ltc_ecc_sets[i].oid.OID, dp->oid.OIDlen * sizeof(dp->oid.OID[0]));
64 /* done - success */
65 return CRYPT_OK;
66
67 cleanup7:
68 XFREE(dp->Gy);
69 cleanup6:
70 XFREE(dp->Gx);
71 cleanup5:
72 XFREE(dp->prime);
73 cleanup4:
74 XFREE(dp->order);
75 cleanup3:
76 XFREE(dp->B);
77 cleanup2:
78 XFREE(dp->A);
79 cleanup1:
80 return CRYPT_MEM;
81 }
82
83 #endif
+0
-84
src/ltc/pk/ecc/ecc_dp_from_params.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12
13 #include "tomcrypt.h"
14
15 #ifdef LTC_MECC
16
17 int ecc_dp_set_bn(ltc_ecc_set_type *dp, void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor)
18 {
19 unsigned char buf[ECC_BUF_SIZE];
20 unsigned long len;
21
22 /* a */
23 mp_tohex(a, (char *)buf);
24 len = (unsigned long)strlen((char *)buf);
25 if ((dp->A = XMALLOC(1+len)) == NULL) goto cleanup1;
26 strncpy(dp->A, (char*)buf, 1+len);
27 /* b */
28 mp_tohex(b, (char *)buf);
29 len = (unsigned long)strlen((char *)buf);
30 if ((dp->B = XMALLOC(1+len)) == NULL) goto cleanup2;
31 strncpy(dp->B, (char*)buf, 1+len);
32 /* order */
33 mp_tohex(order, (char *)buf);
34 len = (unsigned long)strlen((char *)buf);
35 if ((dp->order = XMALLOC(1+len)) == NULL) goto cleanup3;
36 strncpy(dp->order, (char*)buf, 1+len);
37 /* prime */
38 mp_tohex(prime, (char *)buf);
39 len = (unsigned long)strlen((char *)buf);
40 if ((dp->prime = XMALLOC(1+len)) == NULL) goto cleanup4;
41 strncpy(dp->prime, (char*)buf, 1+len);
42 /* gx */
43 mp_tohex(gx, (char *)buf);
44 len = (unsigned long)strlen((char *)buf);
45 if ((dp->Gx = XMALLOC(1+len)) == NULL) goto cleanup5;
46 strncpy(dp->Gx, (char*)buf, 1+len);
47 /* gy */
48 mp_tohex(gy, (char *)buf);
49 len = (unsigned long)strlen((char *)buf);
50 if ((dp->Gy = XMALLOC(1+len)) == NULL) goto cleanup6;
51 strncpy(dp->Gy, (char*)buf, 1+len);
52 /* cofactor & size */
53 dp->cofactor = cofactor;
54 dp->size = mp_unsigned_bin_size(prime);
55 /* see if we can fill in the missing parameters from known curves */
56 if ((ecc_dp_fill_from_sets(dp)) != CRYPT_OK) {
57 /* custom name */
58 if ((dp->name = XMALLOC(7)) == NULL) goto cleanup7;
59 strcpy(dp->name, "custom"); /* XXX-TODO check this */
60 /* no oid */
61 dp->oid.OIDlen = 0;
62 }
63 /* done - success */
64 return CRYPT_OK;
65
66 /* XFREE(dp->name); **** warning: statement not reached *** */
67 cleanup7:
68 XFREE(dp->Gy);
69 cleanup6:
70 XFREE(dp->Gx);
71 cleanup5:
72 XFREE(dp->prime);
73 cleanup4:
74 XFREE(dp->order);
75 cleanup3:
76 XFREE(dp->B);
77 cleanup2:
78 XFREE(dp->A);
79 cleanup1:
80 return CRYPT_MEM;
81 }
82
83 #endif
+0
-36
src/ltc/pk/ecc/ecc_dp_init.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 #ifdef LTC_MECC
17
18 int ecc_dp_init(ltc_ecc_set_type *dp)
19 {
20 if (dp == NULL) return CRYPT_INVALID_ARG;
21
22 dp->name = NULL;
23 dp->prime = NULL;
24 dp->A = NULL;
25 dp->B = NULL;
26 dp->order = NULL;
27 dp->Gx = NULL;
28 dp->Gy = NULL;
29 dp->oid.OIDlen = 0;
30 dp->cofactor = 0;
31
32 return CRYPT_OK;
33 }
34
35 #endif
+0
-100
src/ltc/pk/ecc/ecc_dp_set.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15 #include <errno.h>
16
17 #ifdef LTC_MECC
18
19 int ecc_dp_set(ltc_ecc_set_type *dp, char *ch_prime, char *ch_A, char *ch_B, char *ch_order, char *ch_Gx, char *ch_Gy, unsigned long cofactor, char *ch_name, char *oid)
20 {
21 unsigned long l_name, l_prime, l_A, l_B, l_order, l_Gx, l_Gy;
22
23 if (!dp || !ch_prime || !ch_A || !ch_B || !ch_order || !ch_Gx || !ch_Gy || cofactor==0) return CRYPT_INVALID_ARG;
24
25 l_prime = (unsigned long)strlen(ch_prime);
26 l_A = (unsigned long)strlen(ch_A);
27 l_B = (unsigned long)strlen(ch_B);
28 l_order = (unsigned long)strlen(ch_order);
29 l_Gx = (unsigned long)strlen(ch_Gx);
30 l_Gy = (unsigned long)strlen(ch_Gy);
31
32 dp->cofactor = cofactor;
33
34 { /* calculate size */
35 void *p_num;
36 mp_init(&p_num);
37 mp_read_radix(p_num, ch_prime, 16);
38 dp->size = mp_unsigned_bin_size(p_num);
39 mp_clear(p_num);
40 }
41
42 if (dp->name != NULL) { XFREE(dp->name ); dp->name = NULL; }
43 if (dp->prime != NULL) { XFREE(dp->prime); dp->prime = NULL; }
44 if (dp->A != NULL) { XFREE(dp->A ); dp->A = NULL; }
45 if (dp->B != NULL) { XFREE(dp->B ); dp->B = NULL; }
46 if (dp->order != NULL) { XFREE(dp->order); dp->order = NULL; }
47 if (dp->Gx != NULL) { XFREE(dp->Gx ); dp->Gx = NULL; }
48 if (dp->Gy != NULL) { XFREE(dp->Gy ); dp->Gy = NULL; }
49
50 dp->prime = XMALLOC(1+l_prime); strncpy(dp->prime, ch_prime, 1+l_prime);
51 dp->A = XMALLOC(1+l_A); strncpy(dp->A, ch_A, 1+l_A);
52 dp->B = XMALLOC(1+l_B); strncpy(dp->B, ch_B, 1+l_B);
53 dp->order = XMALLOC(1+l_order); strncpy(dp->order, ch_order, 1+l_order);
54 dp->Gx = XMALLOC(1+l_Gx); strncpy(dp->Gx, ch_Gx, 1+l_Gx);
55 dp->Gy = XMALLOC(1+l_Gy); strncpy(dp->Gy, ch_Gy, 1+l_Gy);
56
57 /* optional parameters */
58 if (ch_name == NULL && oid == NULL) {
59 (void)ecc_dp_fill_from_sets(dp);
60 }
61 else {
62 if (ch_name != NULL) {
63 l_name = (unsigned long)strlen(ch_name);
64 dp->name = XMALLOC(1+l_name);
65 strncpy(dp->name, ch_name, 1+l_name);
66 }
67
68 if (oid != NULL) {
69 char *end_ptr;
70 unsigned int i = 0;
71 unsigned long val;
72
73 end_ptr = oid;
74 while (i < sizeof(dp->oid.OID)/sizeof(dp->oid.OID[0]) && *oid != '\0') {
75 errno = 0;
76 val = strtoul(oid, &end_ptr, 10);
77 if (errno != 0 || oid == end_ptr) break; /* parsing failed */
78 if (val > 0xFFFFFFFF) break; /* x64 check */
79 dp->oid.OID[i++] = val;
80 oid = end_ptr;
81 if (*oid != '.') break;
82 oid++;
83 }
84 if (i == 0 || *end_ptr != '\0') return CRYPT_INVALID_ARG;
85 dp->oid.OIDlen = i;
86 }
87 }
88
89 /* in case the parameters are really custom (unlikely) */
90 if (dp->name == NULL) {
91 dp->name = XMALLOC(7);
92 strcpy(dp->name, "custom");
93 dp->oid.OIDlen = 0;
94 }
95
96 return CRYPT_OK;
97 }
98
99 #endif
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
5956 }
6057
6158 /* make a random key and export the public copy */
62 if ((err = ecc_make_key_ex(prng, wprng, &pubkey, key->dp)) != CRYPT_OK) {
63 return err;
64 }
59 if ((err = ecc_set_dp_copy(key, &pubkey)) != CRYPT_OK) { return err; }
60 if ((err = ecc_generate_key(prng, wprng, &pubkey)) != CRYPT_OK) { return err; }
6561
6662 pub_expt = XMALLOC(ECC_BUF_SIZE);
6763 ecc_shared = XMALLOC(ECC_BUF_SIZE);
8177 }
8278
8379 pubkeysize = ECC_BUF_SIZE;
84 if ((err = ecc_export_raw(pub_expt, &pubkeysize, PK_PUBLIC|PK_COMPRESSED, &pubkey)) != CRYPT_OK) {
80 #ifdef USE_TFM
81 /* XXX-FIXME: TFM does not support sqrtmod_prime */
82 if ((err = ecc_get_key(pub_expt, &pubkeysize, PK_PUBLIC, &pubkey)) != CRYPT_OK) {
83 #else
84 if ((err = ecc_get_key(pub_expt, &pubkeysize, PK_PUBLIC|PK_COMPRESSED, &pubkey)) != CRYPT_OK) {
85 #endif
8586 ecc_free(&pubkey);
8687 goto LBL_ERR;
8788 }
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
4138 return CRYPT_PK_TYPE_MISMATCH;
4239 }
4340
44 if (ltc_ecc_is_valid_idx(key->idx) == 0) {
45 return CRYPT_INVALID_ARG;
46 }
47
4841 /* we store the NIST byte size */
49 key_size = key->dp->size;
42 key_size = key->dp.size;
5043
5144 if (type == PK_PRIVATE) {
5245 flags[0] = 1;
+0
-183
src/ltc/pk/ecc/ecc_export_full.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 #ifdef LTC_MECC
17
18 /**
19 Export an ECC key as a binary packet
20 @param out [out] Destination for the key
21 @param outlen [in/out] Max size and resulting size of the exported key
22 @param type The type of key you want to export (PK_PRIVATE or PK_PUBLIC)
23 @param key The key to export
24 @return CRYPT_OK if successful
25 */
26
27 int ecc_export_full(unsigned char *out, unsigned long *outlen, int type, ecc_key *key)
28 {
29 int err;
30 void *prime, *order, *a, *b, *gx, *gy;
31 unsigned char bin_a[256], bin_b[256], bin_k[256], bin_g[512], bin_xy[512];
32 unsigned long len_a, len_b, len_k, len_g, len_xy;
33 unsigned long cofactor, one = 1;
34 oid_st oid;
35 ltc_asn1_list seq_fieldid[2], seq_curve[2], seq_ecparams[6], seq_priv[4], asn_ecparams[1];
36
37 LTC_ARGCHK(out != NULL);
38 LTC_ARGCHK(outlen != NULL);
39 LTC_ARGCHK(key != NULL);
40
41 if (key->type != PK_PRIVATE && type == PK_PRIVATE) return CRYPT_PK_TYPE_MISMATCH;
42 if (ltc_ecc_is_valid_idx(key->idx) == 0) return CRYPT_INVALID_ARG;
43 if (key->dp == NULL) return CRYPT_INVALID_ARG;
44
45 if ((err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, NULL)) != CRYPT_OK) return err;
46
47 if ((err = mp_read_radix(prime, key->dp->prime, 16)) != CRYPT_OK) goto error;
48 if ((err = mp_read_radix(order, key->dp->order, 16)) != CRYPT_OK) goto error;
49 if ((err = mp_read_radix(b, key->dp->B, 16)) != CRYPT_OK) goto error;
50 if ((err = mp_read_radix(a, key->dp->A, 16)) != CRYPT_OK) goto error;
51 if ((err = mp_read_radix(gx, key->dp->Gx, 16)) != CRYPT_OK) goto error;
52 if ((err = mp_read_radix(gy, key->dp->Gy, 16)) != CRYPT_OK) goto error;
53
54 /* curve param a */
55 len_a = mp_unsigned_bin_size(a);
56 if (len_a > sizeof(bin_a)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
57 if ((err = mp_to_unsigned_bin(a, bin_a)) != CRYPT_OK) goto error;
58 if (len_a == 0) { len_a = 1; bin_a[0] = 0; } /* XXX-TODO hack to handle case a == 0 */
59
60 /* curve param b */
61 len_b = mp_unsigned_bin_size(b);
62 if (len_b > sizeof(bin_b)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
63 if ((err = mp_to_unsigned_bin(b, bin_b)) != CRYPT_OK) goto error;
64 if (len_b == 0) { len_b = 1; bin_b[0] = 0; } /* XXX-TODO hack to handle case b == 0 */
65
66 /* base point - we export uncompressed form */
67 len_g = sizeof(bin_g);
68 if ((err = ltc_ecc_export_point(bin_g, &len_g, gx, gy, key->dp->size, 0)) != CRYPT_OK) goto error;
69
70 /* public key */
71 len_xy = sizeof(bin_xy);
72 if ((err = ltc_ecc_export_point(bin_xy, &len_xy, key->pubkey.x, key->pubkey.y, key->dp->size, 0)) != CRYPT_OK) goto error;
73
74 /* co-factor */
75 cofactor = key->dp->cofactor;
76
77 /* we support only prime-field EC */
78 if ((err = pk_get_oid(EC_PRIME_FIELD, &oid)) != CRYPT_OK) goto error;
79
80 if (type & PK_CURVEOID) {
81 /* from http://tools.ietf.org/html/rfc5912
82
83 ECParameters ::= CHOICE {
84 namedCurve CURVE.&id({NamedCurve}) # OBJECT
85 }
86 */
87
88 /* BEWARE: exporting PK_CURVEOID with custom OID means we're unable to read the curve again */
89 if (key->dp->oid.OIDlen == 0) { err = CRYPT_INVALID_ARG; goto error; }
90
91 /* ECParameters used by ECPrivateKey or SubjectPublicKeyInfo below */
92 LTC_SET_ASN1(asn_ecparams, 0, LTC_ASN1_OBJECT_IDENTIFIER, key->dp->oid.OID, key->dp->oid.OIDlen);
93 }
94 else {
95 /* from http://tools.ietf.org/html/rfc3279
96
97 ECParameters ::= SEQUENCE { # SEQUENCE
98 version INTEGER { ecpVer1(1) } (ecpVer1), # INTEGER :01
99 FieldID ::= SEQUENCE { # SEQUENCE
100 fieldType FIELD-ID.&id({IOSet}), # OBJECT :prime-field
101 parameters FIELD-ID.&Type({IOSet}{@fieldType}) # INTEGER
102 }
103 Curve ::= SEQUENCE { # SEQUENCE
104 a FieldElement ::= OCTET STRING # OCTET STRING
105 b FieldElement ::= OCTET STRING # OCTET STRING
106 seed BIT STRING OPTIONAL
107 }
108 base ECPoint ::= OCTET STRING # OCTET STRING
109 order INTEGER, # INTEGER
110 cofactor INTEGER OPTIONAL # INTEGER
111 }
112 */
113
114 /* FieldID SEQUENCE */
115 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid.OID, oid.OIDlen);
116 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
117
118 /* Curve SEQUENCE */
119 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, len_a);
120 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, len_b);
121
122 /* ECParameters SEQUENCE */
123 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &one, 1UL);
124 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
125 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 2UL);
126 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, len_g);
127 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
128 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
129
130 /* ECParameters used by ECPrivateKey or SubjectPublicKeyInfo below */
131 LTC_SET_ASN1(asn_ecparams, 0, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL);
132 }
133
134 type &= ~PK_CURVEOID;
135
136 if (type == PK_PRIVATE) {
137 /* private key format: http://tools.ietf.org/html/rfc5915
138
139 ECPrivateKey ::= SEQUENCE { # SEQUENCE
140 version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), # INTEGER :01
141 privateKey OCTET STRING, # OCTET STRING
142 [0] ECParameters # see above
143 [1] publicKey # BIT STRING
144 }
145 */
146
147 /* private key */
148 len_k = mp_unsigned_bin_size(key->k);
149 if (len_k > sizeof(bin_k)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
150 if ((err = mp_to_unsigned_bin(key->k, bin_k)) != CRYPT_OK) goto error;
151
152 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &one, 1UL);
153 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, len_k);
154 LTC_SET_ASN1(seq_priv, 2, asn_ecparams[0].type, asn_ecparams[0].data, asn_ecparams[0].size);
155 LTC_SET_ASN1(seq_priv, 3, LTC_ASN1_RAW_BIT_STRING, bin_xy, 8*len_xy);
156 seq_priv[2].tag = 0xA0;
157 seq_priv[3].tag = 0xA1;
158
159 err = der_encode_sequence(seq_priv, 4, out, outlen);
160 }
161 else {
162 /* public key format: http://tools.ietf.org/html/rfc5480
163
164 SubjectPublicKeyInfo ::= SEQUENCE { # SEQUENCE
165 AlgorithmIdentifier ::= SEQUENCE { # SEQUENCE
166 algorithm OBJECT IDENTIFIER # OBJECT :id-ecPublicKey
167 ECParameters # see above
168 }
169 subjectPublicKey BIT STRING # BIT STRING
170 }
171 */
172 err = der_encode_subject_public_key_info( out, outlen,
173 PKA_EC, bin_xy, len_xy,
174 asn_ecparams[0].type, asn_ecparams[0].data, asn_ecparams[0].size );
175 }
176
177 error:
178 mp_clear_multi(prime, order, a, b, gx, gy, NULL);
179 return err;
180 }
181
182 #endif
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 /**
14 Export an ECC key as a binary packet
15 @param out [out] Destination for the key
16 @param outlen [in/out] Max size and resulting size of the exported key
17 @param type The type of key you want to export (PK_PRIVATE or PK_PUBLIC)
18 @param key The key to export
19 @return CRYPT_OK if successful
20 */
21
22 int ecc_export_openssl(unsigned char *out, unsigned long *outlen, int type, ecc_key *key)
23 {
24 int err;
25 void *prime, *order, *a, *b, *gx, *gy;
26 unsigned char bin_a[256], bin_b[256], bin_k[256], bin_g[512], bin_xy[512];
27 unsigned long len_a, len_b, len_k, len_g, len_xy;
28 unsigned long cofactor, one = 1;
29 oid_st oid;
30 ltc_asn1_list seq_fieldid[2], seq_curve[2], seq_ecparams[6], seq_priv[4], pub_xy, ecparams;
31 int flag_oid = type & PK_CURVEOID ? 1 : 0;
32 int flag_com = type & PK_COMPRESSED ? 1 : 0;
33 int flag_pri = type & PK_PRIVATE ? 1 : 0;
34
35 LTC_ARGCHK(out != NULL);
36 LTC_ARGCHK(outlen != NULL);
37 LTC_ARGCHK(key != NULL);
38
39 if (key->type != PK_PRIVATE && flag_pri) return CRYPT_PK_TYPE_MISMATCH;
40
41 prime = key->dp.prime;
42 order = key->dp.order;
43 b = key->dp.B;
44 a = key->dp.A;
45 gx = key->dp.base.x;
46 gy = key->dp.base.y;
47
48 /* curve param a */
49 len_a = mp_unsigned_bin_size(a);
50 if (len_a > sizeof(bin_a)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
51 if ((err = mp_to_unsigned_bin(a, bin_a)) != CRYPT_OK) goto error;
52 if (len_a == 0) { len_a = 1; bin_a[0] = 0; } /* XXX-TODO hack to handle case a == 0 */
53
54 /* curve param b */
55 len_b = mp_unsigned_bin_size(b);
56 if (len_b > sizeof(bin_b)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
57 if ((err = mp_to_unsigned_bin(b, bin_b)) != CRYPT_OK) goto error;
58 if (len_b == 0) { len_b = 1; bin_b[0] = 0; } /* XXX-TODO hack to handle case b == 0 */
59
60 /* base point - (un)compressed based on flag_com */
61 len_g = sizeof(bin_g);
62 if ((err = ltc_ecc_export_point(bin_g, &len_g, gx, gy, key->dp.size, flag_com)) != CRYPT_OK) goto error;
63
64 /* public key - (un)compressed based on flag_com */
65 len_xy = sizeof(bin_xy);
66 if ((err = ltc_ecc_export_point(bin_xy, &len_xy, key->pubkey.x, key->pubkey.y, key->dp.size, flag_com)) != CRYPT_OK) goto error;
67
68 /* co-factor */
69 cofactor = key->dp.cofactor;
70
71 /* we support only prime-field EC */
72 if ((err = pk_get_oid(PKA_EC_PRIMEF, &oid)) != CRYPT_OK) goto error;
73
74 if (flag_oid) {
75 /* from http://tools.ietf.org/html/rfc5912
76
77 ECParameters ::= CHOICE {
78 namedCurve CURVE.&id({NamedCurve}) # OBJECT
79 }
80 */
81 if (key->dp.oidlen == 0) {
82 err = CRYPT_INVALID_ARG;
83 goto error;
84 }
85 LTC_SET_ASN1(&ecparams, 0, LTC_ASN1_OBJECT_IDENTIFIER, key->dp.oid, key->dp.oidlen);
86 }
87 else {
88 /* from http://tools.ietf.org/html/rfc3279
89
90 ECParameters ::= SEQUENCE { # SEQUENCE
91 version INTEGER { ecpVer1(1) } (ecpVer1), # INTEGER :01
92 FieldID ::= SEQUENCE { # SEQUENCE
93 fieldType FIELD-ID.&id({IOSet}), # OBJECT :prime-field
94 parameters FIELD-ID.&Type({IOSet}{@fieldType}) # INTEGER
95 }
96 Curve ::= SEQUENCE { # SEQUENCE
97 a FieldElement ::= OCTET STRING # OCTET STRING
98 b FieldElement ::= OCTET STRING # OCTET STRING
99 seed BIT STRING OPTIONAL
100 }
101 base ECPoint ::= OCTET STRING # OCTET STRING
102 order INTEGER, # INTEGER
103 cofactor INTEGER OPTIONAL # INTEGER
104 }
105 */
106
107 /* FieldID SEQUENCE */
108 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid.OID, oid.OIDlen);
109 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
110
111 /* Curve SEQUENCE */
112 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, len_a);
113 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, len_b);
114
115 /* ECParameters SEQUENCE */
116 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &one, 1UL);
117 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
118 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 2UL);
119 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, len_g);
120 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
121 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
122
123 /* ECParameters used by ECPrivateKey or SubjectPublicKeyInfo below */
124 LTC_SET_ASN1(&ecparams, 0, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL);
125 }
126
127 if (flag_pri) {
128 /* private key format: http://tools.ietf.org/html/rfc5915
129
130 ECPrivateKey ::= SEQUENCE { # SEQUENCE
131 version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1), # INTEGER :01
132 privateKey OCTET STRING, # OCTET STRING
133 [0] ECParameters # see above
134 [1] publicKey # BIT STRING
135 }
136 */
137
138 /* private key */
139 len_k = mp_unsigned_bin_size(key->k);
140 if (len_k > sizeof(bin_k)) { err = CRYPT_BUFFER_OVERFLOW; goto error; }
141 if ((err = mp_to_unsigned_bin(key->k, bin_k)) != CRYPT_OK) goto error;
142
143 LTC_SET_ASN1(&pub_xy, 0, LTC_ASN1_RAW_BIT_STRING, bin_xy, 8*len_xy);
144 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &one, 1);
145 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, len_k);
146 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 2, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0, &ecparams); /* context specific 0 */
147 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 3, LTC_ASN1_CL_CONTEXT_SPECIFIC, 1, &pub_xy); /* context specific 1 */
148
149 err = der_encode_sequence(seq_priv, 4, out, outlen);
150 }
151 else {
152 /* public key format: http://tools.ietf.org/html/rfc5480
153
154 SubjectPublicKeyInfo ::= SEQUENCE { # SEQUENCE
155 AlgorithmIdentifier ::= SEQUENCE { # SEQUENCE
156 algorithm OBJECT IDENTIFIER # OBJECT :id-ecPublicKey
157 ECParameters # see above
158 }
159 subjectPublicKey BIT STRING # BIT STRING
160 }
161 */
162 err = x509_encode_subject_public_key_info( out, outlen,
163 PKA_EC, bin_xy, len_xy,
164 ecparams.type, ecparams.data, ecparams.size );
165 }
166
167 error:
168 return err;
169 }
170
171 #endif
172
173 /* ref: $Format:%D$ */
174 /* git commit: $Format:%H$ */
175 /* commit time: $Format:%ai$ */
+0
-66
src/ltc/pk/ecc/ecc_export_raw.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 #ifdef LTC_MECC
17
18 /** Export raw public or private key (public keys = ANS X9.63 compressed or uncompressed; private keys = raw bytes)
19 @param out [out] destination of export
20 @param outlen [in/out] Length of destination and final output size
21 @param type PK_PRIVATE, PK_PUBLIC or PK_PUBLIC|PK_COMPRESSED
22 @param key Key to export
23 Return CRYPT_OK on success
24 */
25
26 int ecc_export_raw(unsigned char *out, unsigned long *outlen, int type, ecc_key *key)
27 {
28 unsigned long size, ksize;
29 int err, compressed;
30
31 LTC_ARGCHK(key != NULL);
32 LTC_ARGCHK(out != NULL);
33 LTC_ARGCHK(outlen != NULL);
34
35 if (ltc_ecc_is_valid_idx(key->idx) == 0) {
36 return CRYPT_INVALID_ARG;
37 }
38 size = key->dp->size;
39
40 compressed = type & PK_COMPRESSED;
41 type &= ~PK_COMPRESSED;
42
43 if (type == PK_PUBLIC && compressed) {
44 if ((err = ltc_ecc_export_point(out, outlen, key->pubkey.x, key->pubkey.y, size, 1)) != CRYPT_OK) return err;
45 }
46 else if (type == PK_PUBLIC) {
47 if ((err = ltc_ecc_export_point(out, outlen, key->pubkey.x, key->pubkey.y, size, 0)) != CRYPT_OK) return err;
48 }
49 else if (type == PK_PRIVATE) {
50 if (key->type != PK_PRIVATE) return CRYPT_PK_TYPE_MISMATCH;
51 *outlen = size;
52 if (size > *outlen) return CRYPT_BUFFER_OVERFLOW;
53 if ((ksize = mp_unsigned_bin_size(key->k)) > size) return CRYPT_BUFFER_OVERFLOW;
54 /* pad and store k */
55 if ((err = mp_to_unsigned_bin(key->k, out + (size - ksize))) != CRYPT_OK) return err;
56 zeromem(out, size - ksize);
57 }
58 else {
59 return CRYPT_INVALID_ARG;
60 }
61
62 return CRYPT_OK;
63 }
64
65 #endif
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2522 void ecc_free(ecc_key *key)
2623 {
2724 LTC_ARGCHKVD(key != NULL);
28 mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, NULL);
25 /* clean dp */
26 mp_cleanup_multi(&key->dp.prime, &key->dp.order,
27 &key->dp.A, &key->dp.B,
28 &key->dp.base.x, &key->dp.base.y, &key->dp.base.z,
29 NULL);
30
31 /* clean key */
32 mp_cleanup_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL);
2933 }
3034
3135 #endif
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 /** Export raw public or private key (public keys = ANS X9.63 compressed or uncompressed; private keys = raw bytes)
14 @param out [out] destination of export
15 @param outlen [in/out] Length of destination and final output size
16 @param type PK_PRIVATE, PK_PUBLIC or PK_PUBLIC|PK_COMPRESSED
17 @param key Key to export
18 Return CRYPT_OK on success
19 */
20
21 int ecc_get_key(unsigned char *out, unsigned long *outlen, int type, ecc_key *key)
22 {
23 unsigned long size, ksize;
24 int err, compressed;
25
26 LTC_ARGCHK(key != NULL);
27 LTC_ARGCHK(out != NULL);
28 LTC_ARGCHK(outlen != NULL);
29
30 size = key->dp.size;
31 compressed = type & PK_COMPRESSED ? 1 : 0;
32 type &= ~PK_COMPRESSED;
33
34 if (type == PK_PUBLIC) {
35 if ((err = ltc_ecc_export_point(out, outlen, key->pubkey.x, key->pubkey.y, size, compressed)) != CRYPT_OK) {
36 return err;
37 }
38 }
39 else if (type == PK_PRIVATE) {
40 if (key->type != PK_PRIVATE) return CRYPT_PK_TYPE_MISMATCH;
41 *outlen = size;
42 if (size > *outlen) return CRYPT_BUFFER_OVERFLOW;
43 if ((ksize = mp_unsigned_bin_size(key->k)) > size) return CRYPT_BUFFER_OVERFLOW;
44 /* pad and store k */
45 if ((err = mp_to_unsigned_bin(key->k, out + (size - ksize))) != CRYPT_OK) return err;
46 zeromem(out, size - ksize);
47 }
48 else {
49 return CRYPT_INVALID_ARG;
50 }
51
52 return CRYPT_OK;
53 }
54
55 #endif
56
57 /* ref: $Format:%D$ */
58 /* git commit: $Format:%H$ */
59 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 int ecc_get_set_by_name(const char* name, const ltc_ecc_set_type** dp)
14 {
15 int i;
16
17 LTC_ARGCHK(dp != NULL);
18 LTC_ARGCHK(name != NULL);
19
20 *dp = NULL;
21
22 for (i = 0; ltc_ecc_sets[i].name != NULL; i++) {
23 if (XSTRCMP(ltc_ecc_sets[i].name, name) == 0) break;
24 }
25
26 if (ltc_ecc_sets[i].name == NULL) {
27 /* not found */
28 return CRYPT_INVALID_ARG;
29 }
30
31 *dp = &ltc_ecc_sets[i];
32 return CRYPT_OK;
33 }
34
35 #endif
36
37 /* ref: $Format:%D$ */
38 /* git commit: $Format:%H$ */
39 /* commit time: $Format:%ai$ */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2522 */
2623 int ecc_get_size(ecc_key *key)
2724 {
28 LTC_ARGCHK(key != NULL);
29 if (ltc_ecc_is_valid_idx(key->idx))
30 return key->dp->size;
31 else
32 return INT_MAX; /* large value known to cause it to fail when passed to ecc_make_key() */
25 if (key == NULL) {
26 return INT_MAX;
27 }
28 return key->dp.size;
3329 }
3430
3531 #endif
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
4845 LTC_ARGCHK(key != NULL);
4946 LTC_ARGCHK(ltc_mp.name != NULL);
5047
51 /* init key */
52 if (mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, NULL) != CRYPT_OK) {
53 return CRYPT_MEM;
48 /* find out what type of key it is */
49 err = der_decode_sequence_multi(in, inlen, LTC_ASN1_BIT_STRING, 1UL, flags,
50 LTC_ASN1_SHORT_INTEGER, 1UL, &key_size,
51 LTC_ASN1_EOL, 0UL, NULL);
52 if (err != CRYPT_OK && err != CRYPT_INPUT_TOO_LONG) {
53 return err;
5454 }
5555
56 /* find out what type of key it is */
57 err = der_decode_sequence_multi(in, inlen, LTC_ASN1_BIT_STRING, 1UL, flags,
58 LTC_ASN1_EOL, 0UL, NULL);
59 if (err != CRYPT_OK && err != CRYPT_INPUT_TOO_LONG) {
60 goto done;
56 /* allocate & initialize the key */
57 if (dp == NULL) {
58 if ((err = ecc_set_dp_size(key_size, key)) != CRYPT_OK) { goto done; }
59 } else {
60 if ((err = ecc_set_dp(dp, key)) != CRYPT_OK) { goto done; }
6161 }
62
6362
6463 if (flags[0] == 1) {
6564 /* private key */
9089 goto done;
9190 }
9291
93 if (dp == NULL) {
94 /* find the idx */
95 for (key->idx = 0; ltc_ecc_sets[key->idx].size && (unsigned long)ltc_ecc_sets[key->idx].size != key_size; ++key->idx);
96 if (ltc_ecc_sets[key->idx].size == 0) {
97 err = CRYPT_INVALID_PACKET;
98 goto done;
99 }
100 key->dp = &ltc_ecc_sets[key->idx];
101 } else {
102 key->idx = -1;
103 key->dp = dp;
104 }
10592 /* set z */
10693 if ((err = mp_set(key->pubkey.z, 1)) != CRYPT_OK) { goto done; }
10794
108 /* is it a point on the curve? */
109 if ((err = ltc_ecc_is_point(key->dp, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) {
110 goto done;
111 }
95 /* point on the curve + other checks */
96 if ((err = ltc_ecc_verify_key(key)) != CRYPT_OK) { goto done; }
11297
11398 /* we're good */
11499 return CRYPT_OK;
100
115101 done:
116 mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, NULL);
102 ecc_free(key);
117103 return err;
118104 }
119105 #endif
+0
-152
src/ltc/pk/ecc/ecc_import_full.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12
13 #include "tomcrypt.h"
14
15 #ifdef LTC_MECC
16
17 int ecc_import_full(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp)
18 {
19 void *prime, *order, *a, *b, *gx, *gy;
20 ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4];
21 unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128];
22 unsigned long len_a, len_b, len_k, len_g, len_xy, len_oid;
23 unsigned long cofactor = 0, ecver = 0, pkver = 0, tmpoid[16], curveoid[16];
24 int err;
25
26 if ((err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, NULL)) != CRYPT_OK) return err;
27
28 /* ### 1. try to load public key - no curve parameters just curve OID */
29
30 len_xy = sizeof(bin_xy);
31 err = der_decode_subject_public_key_info_ex(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL, &len_oid);
32 if (err == CRYPT_OK) {
33 /* load curve parameters for given curve OID */
34 if ((err = ecc_dp_set_by_oid(dp, curveoid, len_oid)) != CRYPT_OK) { goto error; }
35 /* load public key */
36 if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; }
37 goto success;
38 }
39
40 /* ### 2. try to load public key - curve parameters included */
41
42 /* ECParameters SEQUENCE */
43 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL);
44 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
45 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL);
46 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1);
47 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
48 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
49 seq_ecparams[5].optional = 1;
50 /* FieldID SEQUENCE */
51 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL);
52 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
53 /* Curve SEQUENCE */
54 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE);
55 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE);
56 LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128);
57 seq_curve[2].optional = 1;
58 /* try to load public key */
59 len_xy = sizeof(bin_xy);
60 err = der_decode_subject_public_key_info(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_SEQUENCE, seq_ecparams, 6);
61
62 if (err == CRYPT_OK) {
63 len_a = seq_curve[0].size;
64 len_b = seq_curve[1].size;
65 len_g = seq_ecparams[3].size;
66 /* create bignums */
67 if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto error; }
68 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
69 if ((err = ltc_ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
70 /* load curve parameters */
71 if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto error; }
72 /* load public key */
73 if ((err = ecc_import_raw(bin_xy, len_xy, key, dp)) != CRYPT_OK) { goto error; }
74 goto success;
75 }
76
77 /* ### 3. try to load private key - no curve parameters just curve OID */
78
79 /* ECPrivateKey SEQUENCE */
80 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &pkver, 1UL);
81 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE);
82 LTC_SET_ASN1(seq_priv, 2, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL);
83 LTC_SET_ASN1(seq_priv, 3, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2));
84 seq_priv[2].tag = 0xA0; /* context specific 0 */
85 seq_priv[3].tag = 0xA1; /* context specific 1 */
86 /* try to load private key */
87 err = der_decode_sequence(in, inlen, seq_priv, 4);
88
89 if (err == CRYPT_OK) {
90 /* load curve parameters for given curve OID */
91 if ((err = ecc_dp_set_by_oid(dp, curveoid, seq_priv[2].size)) != CRYPT_OK) { goto error; }
92 /* load private+public key */
93 if ((err = ecc_import_raw(bin_k, seq_priv[1].size, key, dp)) != CRYPT_OK) { goto error; }
94 goto success;
95 }
96
97 /* ### 4. try to load private key - curve parameters included */
98
99 /* ECPrivateKey SEQUENCE */
100 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &pkver, 1UL);
101 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE);
102 LTC_SET_ASN1(seq_priv, 2, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL);
103 LTC_SET_ASN1(seq_priv, 3, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2));
104 seq_priv[2].tag = 0xA0; /* context specific 0 */
105 seq_priv[3].tag = 0xA1; /* context specific 1 */
106 /* ECParameters SEQUENCE */
107 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL);
108 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
109 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL);
110 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1);
111 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
112 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
113 seq_ecparams[5].optional = 1;
114 /* FieldID SEQUENCE */
115 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL);
116 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
117 /* Curve SEQUENCE */
118 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE);
119 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE);
120 LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128);
121 seq_curve[2].optional = 1;
122 /* try to load private key */
123 err = der_decode_sequence(in, inlen, seq_priv, 4);
124 if (err == CRYPT_OK) {
125 len_k = seq_priv[1].size;
126 len_xy = seq_priv[3].size;
127 len_a = seq_curve[0].size;
128 len_b = seq_curve[1].size;
129 len_g = seq_ecparams[3].size;
130 /* create bignums */
131 if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto error; }
132 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
133 if ((err = ltc_ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
134 /* load curve parameters */
135 if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto error; }
136 /* load private+public key */
137 if ((err = ecc_import_raw(bin_k, len_k, key, dp)) != CRYPT_OK) { goto error; }
138 goto success;
139 }
140
141 /* ### 5. backward compatibility - try to load old-DER format */
142 if ((err = ecc_import(in, inlen, key)) != CRYPT_OK) { goto error; }
143
144 success:
145 err = CRYPT_OK;
146 error:
147 mp_clear_multi(prime, order, a, b, gx, gy, NULL);
148 return err;
149 }
150
151 #endif
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 int ecc_import_openssl(const unsigned char *in, unsigned long inlen, ecc_key *key)
14 {
15 void *prime, *order, *a, *b, *gx, *gy;
16 ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4], custom[2];
17 unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128];
18 unsigned long len_a, len_b, len_k, len_g, len_xy, len_oid, len;
19 unsigned long cofactor = 0, ecver = 0, pkver = 0, tmpoid[16], curveoid[16];
20 int err;
21
22 if ((err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, NULL)) != CRYPT_OK) {
23 return err;
24 }
25
26 /* ### 1. try to load public key - no curve parameters just curve OID */
27
28 len_xy = sizeof(bin_xy);
29 len_oid = 16;
30 err = x509_decode_subject_public_key_info(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, &len_oid);
31 if (err == CRYPT_OK) {
32 /* load curve parameters for given curve OID */
33 if ((err = ecc_set_dp_oid(curveoid, len_oid, key)) != CRYPT_OK) { goto error; }
34 /* load public key */
35 if ((err = ecc_set_key(bin_xy, len_xy, PK_PUBLIC, key)) != CRYPT_OK) { goto error; }
36 goto success;
37 }
38
39 /* ### 2. try to load public key - curve parameters included */
40
41 /* ECParameters SEQUENCE */
42 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL);
43 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
44 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL);
45 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1);
46 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
47 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
48 seq_ecparams[5].optional = 1;
49 /* FieldID SEQUENCE */
50 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL);
51 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
52 /* Curve SEQUENCE */
53 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE);
54 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE);
55 LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128);
56 seq_curve[2].optional = 1;
57 /* try to load public key */
58 len_xy = sizeof(bin_xy);
59 len = 6;
60 err = x509_decode_subject_public_key_info(in, inlen, PKA_EC, bin_xy, &len_xy, LTC_ASN1_SEQUENCE, seq_ecparams, &len);
61
62 if (err == CRYPT_OK) {
63 len_a = seq_curve[0].size;
64 len_b = seq_curve[1].size;
65 len_g = seq_ecparams[3].size;
66 /* create bignums */
67 if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto error; }
68 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
69 if ((err = ltc_ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
70 /* load curve parameters */
71 if ((err = ecc_set_dp_bn(a, b, prime, order, gx, gy, cofactor, key)) != CRYPT_OK) { goto error; }
72 /* load public key */
73 if ((err = ecc_set_key(bin_xy, len_xy, PK_PUBLIC, key)) != CRYPT_OK) { goto error; }
74 goto success;
75 }
76
77 /* ### 3. try to load private key - no curve parameters just curve OID */
78
79 /* ECPrivateKey SEQUENCE */
80 LTC_SET_ASN1(custom, 0, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL);
81 LTC_SET_ASN1(custom, 1, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2));
82 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &pkver, 1UL);
83 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE);
84 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 2, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0, custom); /* context specific 0 */
85 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 3, LTC_ASN1_CL_CONTEXT_SPECIFIC, 1, custom + 1); /* context specific 1 */
86
87 /* try to load private key */
88 err = der_decode_sequence(in, inlen, seq_priv, 4);
89 if (err == CRYPT_OK) {
90 /* load curve parameters for given curve OID */
91 if ((err = ecc_set_dp_oid(curveoid, custom[0].size, key)) != CRYPT_OK) { goto error; }
92 /* load private+public key */
93 if ((err = ecc_set_key(bin_k, seq_priv[1].size, PK_PRIVATE, key)) != CRYPT_OK) { goto error; }
94 goto success;
95 }
96
97 /* ### 4. try to load private key - curve parameters included */
98
99 /* ECPrivateKey SEQUENCE */
100 LTC_SET_ASN1(custom, 0, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL);
101 LTC_SET_ASN1(custom, 1, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2));
102 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &pkver, 1UL);
103 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE);
104 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 2, LTC_ASN1_CL_CONTEXT_SPECIFIC, 0, custom); /* context specific 0 */
105 LTC_SET_ASN1_CUSTOM_CONSTRUCTED(seq_priv, 3, LTC_ASN1_CL_CONTEXT_SPECIFIC, 1, custom + 1); /* context specific 1 */
106 /* ECParameters SEQUENCE */
107 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL);
108 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
109 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL);
110 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1);
111 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
112 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
113 seq_ecparams[5].optional = 1;
114 /* FieldID SEQUENCE */
115 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL);
116 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
117 /* Curve SEQUENCE */
118 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE);
119 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE);
120 LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128);
121 seq_curve[2].optional = 1;
122 /* try to load private key */
123 err = der_decode_sequence(in, inlen, seq_priv, 4);
124 if (err == CRYPT_OK) {
125 len_xy = custom[1].size;
126 len_k = seq_priv[1].size;
127 len_a = seq_curve[0].size;
128 len_b = seq_curve[1].size;
129 len_g = seq_ecparams[3].size;
130 /* create bignums */
131 if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto error; }
132 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto error; }
133 if ((err = ltc_ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto error; }
134 /* load curve parameters */
135 if ((err = ecc_set_dp_bn(a, b, prime, order, gx, gy, cofactor, key)) != CRYPT_OK) { goto error; }
136 /* load private+public key */
137 if ((err = ecc_set_key(bin_k, len_k, PK_PRIVATE, key)) != CRYPT_OK) { goto error; }
138 goto success;
139 }
140
141 /* ### 5. backward compatibility - try to load old-DER format */
142
143 if ((err = ecc_import(in, inlen, key)) != CRYPT_OK) { goto error; }
144
145 success:
146 err = CRYPT_OK;
147 error:
148 mp_clear_multi(prime, order, a, b, gx, gy, NULL);
149 return err;
150 }
151
152 #endif
153
154 /* ref: $Format:%D$ */
155 /* git commit: $Format:%H$ */
156 /* commit time: $Format:%ai$ */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12
139 #include "tomcrypt.h"
1410
1511 #ifdef LTC_MECC
1612
17 int ecc_import_pkcs8(const unsigned char *in, unsigned long inlen,
13 enum algorithm_oid {
14 PBE_MD2_DES, /* 0 */
15 PBE_MD2_RC2,
16 PBE_MD5_DES,
17 PBE_MD5_RC2,
18 PBE_SHA1_DES,
19 PBE_SHA1_RC2, /* 5 */
20 PBES2,
21 PBKDF2,
22 DES_CBC,
23 RC2_CBC,
24 DES_EDE3_CBC, /* 10 */
25 HMAC_WITH_SHA1,
26 HMAC_WITH_SHA224,
27 HMAC_WITH_SHA256,
28 HMAC_WITH_SHA384,
29 HMAC_WITH_SHA512, /* 15 */
30 PBE_SHA1_3DES
31 };
32
33 static const oid_st oid_list[] = {
34 { { 1,2,840,113549,1,5,1 }, 7 }, /* [0] http://www.oid-info.com/get/1.2.840.113549.1.5.1 pbeWithMD2AndDES-CBC */
35 { { 1,2,840,113549,1,5,4 }, 7 }, /* [1] http://www.oid-info.com/get/1.2.840.113549.1.5.4 pbeWithMD2AndRC2-CBC */
36 { { 1,2,840,113549,1,5,3 }, 7 }, /* [2] http://www.oid-info.com/get/1.2.840.113549.1.5.3 pbeWithMD5AndDES-CBC */
37 { { 1,2,840,113549,1,5,6 }, 7 }, /* [3] http://www.oid-info.com/get/1.2.840.113549.1.5.6 pbeWithMD5AndRC2-CBC */
38 { { 1,2,840,113549,1,5,10 }, 7 }, /* [4] http://www.oid-info.com/get/1.2.840.113549.1.5.10 pbeWithSHA1AndDES-CBC */
39 { { 1,2,840,113549,1,5,11 }, 7 }, /* [5] http://www.oid-info.com/get/1.2.840.113549.1.5.11 pbeWithSHA1AndRC2-CBC */
40 { { 1,2,840,113549,1,5,13 }, 7 }, /* [6] http://www.oid-info.com/get/1.2.840.113549.1.5.13 pbes2 */
41 { { 1,2,840,113549,1,5,12 }, 7 }, /* [7] http://www.oid-info.com/get/1.2.840.113549.1.5.12 pBKDF2 */
42 { { 1,3,14,3,2,7 }, 6 }, /* [8] http://www.oid-info.com/get/1.3.14.3.2.7 desCBC */
43 { { 1,2,840,113549,3,2 }, 6 }, /* [9] http://www.oid-info.com/get/1.2.840.113549.3.2 rc2CBC */
44 { { 1,2,840,113549,3,7 }, 6 }, /* [10] http://www.oid-info.com/get/1.2.840.113549.3.7 des-EDE3-CBC */
45 { { 1,2,840,113549,2,7 }, 6 }, /* [11] http://www.oid-info.com/get/1.2.840.113549.2.7 hmacWithSHA1 */
46 { { 1,2,840,113549,2,8 }, 6 }, /* [12] http://www.oid-info.com/get/1.2.840.113549.2.8 hmacWithSHA224 */
47 { { 1,2,840,113549,2,9 }, 6 }, /* [13] http://www.oid-info.com/get/1.2.840.113549.2.9 hmacWithSHA256 */
48 { { 1,2,840,113549,2,10 }, 6 }, /* [14] http://www.oid-info.com/get/1.2.840.113549.2.10 hmacWithSHA384 */
49 { { 1,2,840,113549,2,11 }, 6 }, /* [15] http://www.oid-info.com/get/1.2.840.113549.2.11 hmacWithSHA512 */
50 { { 1,2,840,113549,1,12,1,3 }, 8 }, /* [16] http://www.oid-info.com/get/1.2.840.113549.1.12.1.3 pbeWithSHAAnd3-KeyTripleDES-CBC */
51 { { 0 }, 0 },
52 };
53
54 static int _simple_utf8_to_utf16(const unsigned char *in, unsigned long inlen,
55 unsigned char *out, unsigned long *outlen) {
56 unsigned long len = 0;
57 const unsigned char* in_end = in + inlen;
58 const ulong32 offset[6] = {
59 0x00000000UL, 0x00003080UL, 0x000E2080UL,
60 0x03C82080UL, 0xFA082080UL, 0x82082080UL
61 };
62 int err = CRYPT_ERROR;
63
64 while (in < in_end) {
65 ulong32 ch = 0;
66 unsigned short extra = 0; /* 0 */
67 if (*in >= 192) extra++; /* 1 */
68 if (*in >= 224) extra++; /* 2 */
69 if (*in >= 240) extra++; /* 3 */
70 if (*in >= 248) extra++; /* 4 */
71 if (*in >= 252) extra++; /* 5 */
72 if (in + extra >= in_end) goto ERROR;
73 switch (extra) {
74 case 5: ch += *in++; ch <<= 6;
75 case 4: ch += *in++; ch <<= 6;
76 case 3: ch += *in++; ch <<= 6;
77 case 2: ch += *in++; ch <<= 6;
78 case 1: ch += *in++; ch <<= 6;
79 case 0: ch += *in++;
80 }
81 ch -= offset[extra];
82 if (ch > 0xFFFF) goto ERROR;
83 if (*outlen >= len + 2) {
84 out[len] = (unsigned short)((ch >> 8) & 0xFF);
85 out[len + 1] = (unsigned char)(ch & 0xFF);
86 }
87 len += 2;
88 }
89
90 err = len > *outlen ? CRYPT_BUFFER_OVERFLOW : CRYPT_OK;
91 *outlen = len;
92 ERROR:
93 return err;
94 }
95
96 static int _kdf_pkcs12(int hash_id, const unsigned char *pw, unsigned long pwlen,
97 const unsigned char *salt, unsigned long saltlen,
98 unsigned int iterations, unsigned char purpose,
99 unsigned char *out, unsigned long outlen)
100 {
101 unsigned long u = hash_descriptor[hash_id].hashsize;
102 unsigned long v = hash_descriptor[hash_id].blocksize;
103 unsigned long c = (outlen + u - 1) / u;
104 unsigned long Slen = ((saltlen + v - 1) / v) * v;
105 unsigned long Plen = ((pwlen + v - 1) / v) * v;
106 unsigned long k = (Plen + Slen) / v;
107 unsigned long Alen, keylen = 0;
108 unsigned int tmp, i, j, n;
109 unsigned char ch;
110 unsigned char D[MAXBLOCKSIZE], A[MAXBLOCKSIZE], B[MAXBLOCKSIZE];
111 unsigned char *I = NULL, *key = NULL;
112 int err = CRYPT_ERROR;
113
114 key = XMALLOC(u * c);
115 I = XMALLOC(Plen + Slen);
116 if (key == NULL || I == NULL) goto DONE;
117
118 for (i = 0; i < v; i++) D[i] = purpose; /* D - diversifier */
119 for (i = 0; i < Slen; i++) I[i] = salt[i % saltlen];
120 for (i = 0; i < Plen; i++) I[Slen + i] = pw[i % pwlen]; /* I = Salt || Pass */
121
122 for (i = 0; i < c; i++) {
123 Alen = u; /* hash size */
124 err = hash_memory_multi(hash_id, A, &Alen, D, v, I, Slen + Plen, NULL); /* A = HASH(D || I) */
125 if (err != CRYPT_OK) goto DONE;
126 for (j = 1; j < iterations; j++) {
127 err = hash_memory(hash_id, A, Alen, A, &Alen); /* A = HASH(A) */
128 if (err != CRYPT_OK) goto DONE;
129 }
130 /* fill buffer B with A */
131 for (j = 0; j < v; j++) B[j] = A[j % Alen];
132 /* B += 1 */
133 for (j = v; j > 0; j--) {
134 if (++B[j - 1] != 0) break;
135 }
136 /* I_n += B */
137 for (n = 0; n < k; n++) {
138 ch = 0;
139 for (j = v; j > 0; j--) {
140 tmp = I[n * v + j - 1] + B[j - 1] + ch;
141 ch = (unsigned char)((tmp >> 8) & 0xFF);
142 I[n * v + j - 1] = (unsigned char)(tmp & 0xFF);
143 }
144 }
145 /* store derived key block */
146 for (j = 0; j < Alen; j++) key[keylen++] = A[j];
147 }
148
149 for (i = 0; i < outlen; i++) out[i] = key[i];
150 err = CRYPT_OK;
151 DONE:
152 if (I) XFREE(I);
153 if (key) XFREE(key);
154 return err;
155 }
156
157 static int _oid_to_id(const unsigned long *oid, unsigned long oid_size)
158 {
159 int i, j;
160 for (j = 0; oid_list[j].OIDlen > 0; j++) {
161 int match = 1;
162 if (oid_list[j].OIDlen != oid_size) continue;
163 for (i = 0; i < (int)oid_size && match; i++) if (oid_list[j].OID[i] != oid[i]) match = 0;
164 if (match) return j;
165 }
166 return -1;
167 }
168
169 static int _pbes1_decrypt(const unsigned char *enc_data, unsigned long enc_size,
170 const unsigned char *pass, unsigned long pass_size,
171 const unsigned char *salt, unsigned long salt_size,
172 unsigned long iterations,
173 const unsigned long *oid, unsigned long oid_size,
174 unsigned char *dec_data, unsigned long *dec_size)
175 {
176 int id = _oid_to_id(oid, oid_size);
177 int err, hid = -1, cid = -1;
178 unsigned int keylen, blklen;
179 unsigned char key_iv[32] = { 0 }, pad;
180 unsigned long len = sizeof(key_iv), pwlen = pass_size;
181 symmetric_CBC cbc;
182 unsigned char *pw = NULL;
183
184 /* https://tools.ietf.org/html/rfc8018#section-6.1.2 */
185 if (id == PBE_MD2_DES || id == PBE_MD2_RC2) hid = find_hash("md2");
186 if (id == PBE_MD5_DES || id == PBE_MD5_RC2) hid = find_hash("md5");
187 if (id == PBE_SHA1_DES || id == PBE_SHA1_RC2 || id == PBE_SHA1_3DES) hid = find_hash("sha1");
188
189 if (id == PBE_MD2_RC2 || id == PBE_MD5_RC2 || id == PBE_SHA1_RC2) {
190 cid = find_cipher("rc2");
191 keylen = 8;
192 blklen = 8;
193 }
194 if (id == PBE_MD2_DES || id == PBE_MD5_DES || id == PBE_SHA1_DES) {
195 cid = find_cipher("des");
196 keylen = 8;
197 blklen = 8;
198 }
199 if (id == PBE_SHA1_3DES) {
200 cid = find_cipher("3des");
201 keylen = 24;
202 blklen = 8;
203 }
204
205 if (id == PBE_SHA1_3DES) {
206 /* convert password to unicode/utf16-be */
207 pwlen = pass_size * 2;
208 pw = XMALLOC(pwlen + 2);
209 if (pw == NULL) goto LBL_ERROR;
210 if ((err = _simple_utf8_to_utf16(pass, pass_size, pw, &pwlen) != CRYPT_OK)) goto LBL_ERROR;
211 pw[pwlen++] = 0;
212 pw[pwlen++] = 0;
213 /* derive KEY */
214 if ((err = _kdf_pkcs12(hid, pw, pwlen, salt, salt_size, iterations, 1, key_iv, keylen)) != CRYPT_OK) goto LBL_ERROR;
215 /* derive IV */
216 if ((err = _kdf_pkcs12(hid, pw, pwlen, salt, salt_size, iterations, 2, key_iv+24, blklen)) != CRYPT_OK) goto LBL_ERROR;
217 }
218 else {
219 if ((err = pkcs_5_alg1(pass, pass_size, salt, iterations, hid, key_iv, &len)) != CRYPT_OK) goto LBL_ERROR;
220 /* the output has 16 bytes: [KEY-8-bytes][IV-8-bytes] */
221 }
222
223 if (hid != -1 && cid != -1) {
224 if (salt_size != 8 || enc_size < blklen) goto LBL_ERROR;
225 if ((err = cbc_start(cid, key_iv + keylen, key_iv, keylen, 0, &cbc)) != CRYPT_OK) goto LBL_ERROR;
226 if ((err = cbc_decrypt(enc_data, dec_data, enc_size, &cbc)) != CRYPT_OK) goto LBL_ERROR;
227 if ((err = cbc_done(&cbc)) != CRYPT_OK) goto LBL_ERROR;
228 pad = dec_data[enc_size-1];
229 if (pad < 1 || pad > blklen) goto LBL_ERROR;
230 *dec_size = enc_size - pad;
231 return CRYPT_OK;
232 }
233
234 LBL_ERROR:
235 zeromem(key_iv, sizeof(key_iv));
236 if (pw) { zeromem(pw, pwlen); XFREE(pw); }
237 return CRYPT_INVALID_ARG;
238 }
239
240 static int _pbes2_pbkdf2_decrypt(const unsigned char *enc_data, unsigned long enc_size,
241 const unsigned char *pass, unsigned long pass_size,
242 const unsigned char *salt, unsigned long salt_size,
243 const unsigned char *iv, unsigned long iv_size,
244 unsigned long iterations,
245 int hmacid,
246 int encid,
247 int extra_arg,
248 unsigned char *dec_data, unsigned long *dec_size)
249 {
250 int err, hid = -1, cid = -1;
251 unsigned char k[32], pad;
252 unsigned long klen = sizeof(k);
253 symmetric_CBC cbc;
254
255 /* https://tools.ietf.org/html/rfc8018#section-6.2.2 */
256
257 if (hmacid == HMAC_WITH_SHA1) hid = find_hash("sha1");
258 if (hmacid == HMAC_WITH_SHA224) hid = find_hash("sha224");
259 if (hmacid == HMAC_WITH_SHA256) hid = find_hash("sha256");
260 if (hmacid == HMAC_WITH_SHA384) hid = find_hash("sha384");
261 if (hmacid == HMAC_WITH_SHA512) hid = find_hash("sha512");
262 if (hid == -1) return CRYPT_INVALID_ARG;
263
264 if (encid == DES_EDE3_CBC) {
265 /* https://tools.ietf.org/html/rfc8018#appendix-B.2.2 */
266 cid = find_cipher("3des");
267 klen = 24;
268 if (klen > sizeof(k) || iv_size != 8 || iv == NULL || cid == -1) goto LBL_ERROR;
269 if ((err = pkcs_5_alg2(pass, pass_size, salt, salt_size, iterations, hid, k, &klen)) != CRYPT_OK) goto LBL_ERROR;
270 if ((err = cbc_start(cid, iv, k, klen, 0, &cbc)) != CRYPT_OK) goto LBL_ERROR;
271 if ((err = cbc_decrypt(enc_data, dec_data, enc_size, &cbc)) != CRYPT_OK) goto LBL_ERROR;
272 if ((err = cbc_done(&cbc)) != CRYPT_OK) goto LBL_ERROR;
273 pad = dec_data[enc_size-1];
274 if (pad < 1 || pad > 8) goto LBL_ERROR;
275 *dec_size = enc_size - pad;
276 return CRYPT_OK;
277 }
278
279 if (encid == DES_CBC) {
280 /* https://tools.ietf.org/html/rfc8018#appendix-B.2.1 */
281 cid = find_cipher("des");
282 klen = 8; /* 64 bits */
283 if (klen > sizeof(k) || iv_size != 8 || iv == NULL || cid == -1) goto LBL_ERROR;
284 if ((err = pkcs_5_alg2(pass, pass_size, salt, salt_size, iterations, hid, k, &klen)) != CRYPT_OK) goto LBL_ERROR;
285 if ((err = cbc_start(cid, iv, k, klen, 0, &cbc)) != CRYPT_OK) goto LBL_ERROR;
286 if ((err = cbc_decrypt(enc_data, dec_data, enc_size, &cbc)) != CRYPT_OK) goto LBL_ERROR;
287 if ((err = cbc_done(&cbc)) != CRYPT_OK) goto LBL_ERROR;
288 pad = dec_data[enc_size-1];
289 if (pad < 1 || pad > 8) goto LBL_ERROR;
290 *dec_size = enc_size - pad;
291 return CRYPT_OK;
292 }
293
294 if (encid == RC2_CBC) {
295 /* https://tools.ietf.org/html/rfc8018#appendix-B.2.3 */
296 cid = find_cipher("rc2");
297 klen = 4; /* default: 32 bits */
298 if (extra_arg == 160) klen = 5;
299 if (extra_arg == 120) klen = 8;
300 if (extra_arg == 58) klen = 16;
301 if (extra_arg >= 256) klen = extra_arg / 8;
302 if (klen > sizeof(k) || iv_size != 8 || iv == NULL || cid == -1) goto LBL_ERROR;
303 if ((err = pkcs_5_alg2(pass, pass_size, salt, salt_size, iterations, hid, k, &klen)) != CRYPT_OK) goto LBL_ERROR;
304 if ((err = cbc_start(cid, iv, k, klen, 0, &cbc)) != CRYPT_OK) goto LBL_ERROR;
305 if ((err = cbc_decrypt(enc_data, dec_data, enc_size, &cbc)) != CRYPT_OK) goto LBL_ERROR;
306 if ((err = cbc_done(&cbc)) != CRYPT_OK) goto LBL_ERROR;
307 pad = dec_data[enc_size-1];
308 if (pad < 1 || pad > 8) goto LBL_ERROR;
309 *dec_size = enc_size - pad;
310 return CRYPT_OK;
311 }
312
313 LBL_ERROR:
314 zeromem(k, sizeof(k));
315 return CRYPT_INVALID_ARG;
316 }
317
318 static int _der_decode_pkcs8_flexi(const unsigned char *in, unsigned long inlen,
319 const void *pwd, unsigned long pwdlen,
320 ltc_asn1_list **decoded_list)
321 {
322 unsigned long len = inlen;
323 unsigned long dec_size;
324 unsigned char *dec_data = NULL;
325 ltc_asn1_list *l = NULL;
326 int err;
327
328 *decoded_list = NULL;
329 if ((err = der_decode_sequence_flexi(in, &len, &l)) == CRYPT_OK) {
330 /* the following "if" detects whether it is encrypted or not */
331 if (l->type == LTC_ASN1_SEQUENCE &&
332 l->child && l->child->type == LTC_ASN1_SEQUENCE &&
333 l->child->child && l->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER &&
334 l->child->child->next && l->child->child->next->type == LTC_ASN1_SEQUENCE &&
335 l->child->next && l->child->next->type == LTC_ASN1_OCTET_STRING) {
336 ltc_asn1_list *lalgoid = l->child->child;
337 ltc_asn1_list *lalgparam = l->child->child->next;
338 unsigned char *enc_data = l->child->next->data;
339 unsigned long enc_size = l->child->next->size;
340 dec_size = enc_size;
341 if ((dec_data = XMALLOC(dec_size)) == NULL) {
342 err = CRYPT_MEM;
343 goto LBL_DONE;
344 }
345 if (lalgparam->child && lalgparam->child->type == LTC_ASN1_OCTET_STRING &&
346 lalgparam->child->next && lalgparam->child->next->type == LTC_ASN1_INTEGER) {
347 /* PBES1: encrypted pkcs8 - pbeWithMD5AndDES-CBC:
348 * 0:d=0 hl=4 l= 329 cons: SEQUENCE
349 * 4:d=1 hl=2 l= 27 cons: SEQUENCE (== *lalg)
350 * 6:d=2 hl=2 l= 9 prim: OBJECT :pbeWithMD5AndDES-CBC (== 1.2.840.113549.1.5.3)
351 * 17:d=2 hl=2 l= 14 cons: SEQUENCE (== *lalgparam)
352 * 19:d=3 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:8EDF749A06CCDE51 (== salt)
353 * 29:d=3 hl=2 l= 2 prim: INTEGER :0800 (== iterations)
354 * 33:d=1 hl=4 l= 296 prim: OCTET STRING :bytes (== encrypted data)
355 */
356 unsigned long iter = mp_get_int(lalgparam->child->next->data);
357 unsigned long salt_size = lalgparam->child->size;
358 unsigned char *salt = lalgparam->child->data;
359 err = _pbes1_decrypt(enc_data, enc_size, pwd, pwdlen, salt, salt_size, iter, lalgoid->data, lalgoid->size, dec_data, &dec_size);
360 if (err != CRYPT_OK) goto LBL_DONE;
361 }
362 else if (PBES2 == _oid_to_id(lalgoid->data, lalgoid->size) &&
363 lalgparam->child && lalgparam->child->type == LTC_ASN1_SEQUENCE &&
364 lalgparam->child->child && lalgparam->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER &&
365 lalgparam->child->child->next && lalgparam->child->child->next->type == LTC_ASN1_SEQUENCE &&
366 lalgparam->child->next && lalgparam->child->next->type == LTC_ASN1_SEQUENCE &&
367 lalgparam->child->next->child && lalgparam->child->next->child->type == LTC_ASN1_OBJECT_IDENTIFIER) {
368 /* PBES2: encrypted pkcs8 - PBES2+PBKDF2+des-ede3-cbc:
369 * 0:d=0 hl=4 l= 380 cons: SEQUENCE
370 * 4:d=1 hl=2 l= 78 cons: SEQUENCE (== *lalg)
371 * 6:d=2 hl=2 l= 9 prim: OBJECT :PBES2 (== 1.2.840.113549.1.5.13)
372 * 17:d=2 hl=2 l= 65 cons: SEQUENCE (== *lalgparam)
373 * 19:d=3 hl=2 l= 41 cons: SEQUENCE
374 * 21:d=4 hl=2 l= 9 prim: OBJECT :PBKDF2
375 * 32:d=4 hl=2 l= 28 cons: SEQUENCE
376 * 34:d=5 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:28BA4ABF6AA76A3D (== salt)
377 * 44:d=5 hl=2 l= 2 prim: INTEGER :0800 (== iterations)
378 * 48:d=5 hl=2 l= 12 cons: SEQUENCE (this sequence is optional, may be missing)
379 * 50:d=6 hl=2 l= 8 prim: OBJECT :hmacWithSHA256
380 * 60:d=6 hl=2 l= 0 prim: NULL
381 * 62:d=3 hl=2 l= 20 cons: SEQUENCE
382 * 64:d=4 hl=2 l= 8 prim: OBJECT :des-ede3-cbc
383 * 74:d=4 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:B1404C4688DC9A5A
384 * 84:d=1 hl=4 l= 296 prim: OCTET STRING :bytes (== encrypted data)
385 */
386 ltc_asn1_list *lkdf = lalgparam->child->child;
387 ltc_asn1_list *lenc = lalgparam->child->next->child;
388 int kdfid = _oid_to_id(lkdf->data, lkdf->size);
389 int encid = _oid_to_id(lenc->data, lenc->size);
390 if (PBKDF2 == kdfid &&
391 lkdf->next && lkdf->next->type == LTC_ASN1_SEQUENCE &&
392 lkdf->next->child && lkdf->next->child->type == LTC_ASN1_OCTET_STRING &&
393 lkdf->next->child->next && lkdf->next->child->next->type == LTC_ASN1_INTEGER) {
394 unsigned long iter = mp_get_int(lkdf->next->child->next->data);
395 unsigned long salt_size = lkdf->next->child->size;
396 unsigned char *salt = lkdf->next->child->data;
397 unsigned char *iv = NULL;
398 unsigned long iv_size = 0;
399 unsigned long arg = 0;
400 ltc_asn1_list *loptseq = lkdf->next->child->next->next;
401 int hmacid = HMAC_WITH_SHA1; /* this is default */
402 if (loptseq && loptseq->type == LTC_ASN1_SEQUENCE &&
403 loptseq->child && loptseq->child->type == LTC_ASN1_OBJECT_IDENTIFIER) {
404 /* this sequence is optional */
405 hmacid = _oid_to_id(loptseq->child->data, loptseq->child->size);
406 }
407 if (lenc->next && lenc->next->type == LTC_ASN1_OCTET_STRING) {
408 /* DES-CBC + DES_EDE3_CBC */
409 iv = lenc->next->data;
410 iv_size = lenc->next->size;
411 }
412 else if (lenc->next && lenc->next->type == LTC_ASN1_SEQUENCE &&
413 lenc->next->child && lenc->next->child->type == LTC_ASN1_INTEGER &&
414 lenc->next->child->next && lenc->next->child->next->type == LTC_ASN1_OCTET_STRING) {
415 /* RC2-CBC is a bit special */
416 iv = lenc->next->child->next->data;
417 iv_size = lenc->next->child->next->size;
418 arg = mp_get_int(lenc->next->child->data);
419 }
420 err = _pbes2_pbkdf2_decrypt(enc_data, enc_size, pwd, pwdlen, salt, salt_size, iv, iv_size, iter, hmacid, encid, arg, dec_data, &dec_size);
421 if (err != CRYPT_OK) goto LBL_DONE;
422 }
423 else {
424 /* non-PBKDF2 algorithms are not supported */
425 err = CRYPT_INVALID_PACKET;
426 goto LBL_DONE;
427 }
428 }
429 else {
430 /* unsupported encryption */
431 err = CRYPT_INVALID_PACKET;
432 goto LBL_DONE;
433 }
434 der_free_sequence_flexi(l);
435 l = NULL;
436 err = der_decode_sequence_flexi(dec_data, &dec_size, &l);
437 if (err != CRYPT_OK) goto LBL_DONE;
438 *decoded_list = l;
439 }
440 else {
441 /* not encrypted */
442 err = CRYPT_OK;
443 *decoded_list = l;
444 }
445 }
446
447 LBL_DONE:
448 if (dec_data) XFREE(dec_data);
449 return err;
450 }
451
452 /* NOTE: _der_decode_pkcs8_flexi & related stuff can be shared with rsa_import_pkcs8() */
453
454 int ecc_import_pkcs8(const unsigned char *in, unsigned long inlen,
18455 const void *pwd, unsigned long pwdlen,
19 ecc_key *key, ltc_ecc_set_type *dp)
456 ecc_key *key)
20457 {
21 int err;
22 void *zero, *one, *iter;
23 unsigned char *buf1=NULL, *buf2=NULL;
24 unsigned long buf1len, buf2len;
25 unsigned long oid[16];
26 oid_st ecoid;
27 ltc_asn1_list alg_seq[2], top_seq[3];
28 ltc_asn1_list alg_seq_e[2], key_seq_e[2], top_seq_e[2];
29 unsigned char *decrypted=NULL;
30 unsigned long decryptedlen;
31 void *prime, *order, *a, *b, *gx, *gy;
32 ltc_asn1_list seq_fieldid[2], seq_curve[3], seq_ecparams[6], seq_priv[4];
33 unsigned char bin_a[ECC_MAXSIZE], bin_b[ECC_MAXSIZE], bin_k[ECC_MAXSIZE], bin_g[2*ECC_MAXSIZE+1], bin_xy[2*ECC_MAXSIZE+2], bin_seed[128];
34 unsigned long len_a, len_b, len_g;
35 unsigned long cofactor = 0, ecver = 0, tmpoid[16], curveoid[16];
458 void *a, *b, *gx, *gy;
459 unsigned long len, cofactor;
460 oid_st ecoid;
461 int err;
462 ltc_asn1_list *p = NULL, *l = NULL;
36463
37464 LTC_ARGCHK(in != NULL);
38465 LTC_ARGCHK(key != NULL);
40467
41468 /* get EC alg oid */
42469 err = pk_get_oid(PKA_EC, &ecoid);
43 if (err != CRYPT_OK) { goto LBL_NOFREE; }
44
45 /* alloc buffers */
46 buf1len = inlen; /* approx. guess */
47 buf1 = XMALLOC(buf1len);
48 if (buf1 == NULL) { err = CRYPT_MEM; goto LBL_NOFREE; }
49 buf2len = inlen; /* approx. guess */
50 buf2 = XMALLOC(buf2len);
51 if (buf2 == NULL) { err = CRYPT_MEM; goto LBL_FREE; }
470 if (err != CRYPT_OK) return err;
52471
53472 /* init key */
54 err = mp_init_multi(&prime, &order, &a, &b, &gx, &gy, &zero, &one, &iter, NULL);
55 if (err != CRYPT_OK) { goto LBL_NOCLEAR; }
56
57 /* try to decode encrypted priv key */
58 LTC_SET_ASN1(key_seq_e, 0, LTC_ASN1_OCTET_STRING, buf1, buf1len);
59 LTC_SET_ASN1(key_seq_e, 1, LTC_ASN1_INTEGER, iter, 1UL);
60 LTC_SET_ASN1(alg_seq_e, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL);
61 LTC_SET_ASN1(alg_seq_e, 1, LTC_ASN1_SEQUENCE, key_seq_e, 2UL);
62 LTC_SET_ASN1(top_seq_e, 0, LTC_ASN1_SEQUENCE, alg_seq_e, 2UL);
63 LTC_SET_ASN1(top_seq_e, 1, LTC_ASN1_OCTET_STRING, buf2, buf2len);
64 err=der_decode_sequence(in, inlen, top_seq_e, 2UL);
65 if (err == CRYPT_OK) {
66 LTC_UNUSED_PARAM(pwd);
67 LTC_UNUSED_PARAM(pwdlen);
68 /* unsigned long icount = mp_get_int(iter); */
69 /* XXX: TODO decrypt buf1 with a key derived form password + salt + iter */
70 /* fprintf(stderr, "XXX-DEBUG: gonna decrypt: iter=%ld salt.len=%ld encdata.len=%ld\n", icount, key_seq_e[0].size, top_seq_e[1].size); */
71 err = CRYPT_PK_INVALID_TYPE;
72 goto LBL_ERR;
73 }
74 else {
75 decrypted = (unsigned char*)in;
76 decryptedlen = inlen;
77 }
78
79 /* try to decode unencrypted priv key - curve defined by OID */
80 LTC_SET_ASN1(alg_seq, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL);
81 LTC_SET_ASN1(alg_seq, 1, LTC_ASN1_OBJECT_IDENTIFIER, curveoid, 16UL);
82 LTC_SET_ASN1(top_seq, 0, LTC_ASN1_INTEGER, zero, 1UL);
83 LTC_SET_ASN1(top_seq, 1, LTC_ASN1_SEQUENCE, alg_seq, 2UL);
84 LTC_SET_ASN1(top_seq, 2, LTC_ASN1_OCTET_STRING, buf1, buf1len);
85 err=der_decode_sequence(decrypted, decryptedlen, top_seq, 3UL);
86 if (err == CRYPT_OK) {
87 /* load curve parameters for given curve OID */
88 err = ecc_dp_set_by_oid(dp, curveoid, alg_seq[1].size);
89 if (err != CRYPT_OK) { goto LBL_ERR; }
90 }
91 else {
92 /* try to decode unencrypted priv key - curve defined by params */
93 /* ECParameters SEQUENCE */
94 LTC_SET_ASN1(seq_ecparams, 0, LTC_ASN1_SHORT_INTEGER, &ecver, 1UL);
95 LTC_SET_ASN1(seq_ecparams, 1, LTC_ASN1_SEQUENCE, seq_fieldid, 2UL);
96 LTC_SET_ASN1(seq_ecparams, 2, LTC_ASN1_SEQUENCE, seq_curve, 3UL);
97 LTC_SET_ASN1(seq_ecparams, 3, LTC_ASN1_OCTET_STRING, bin_g, (unsigned long)2*ECC_MAXSIZE+1);
98 LTC_SET_ASN1(seq_ecparams, 4, LTC_ASN1_INTEGER, order, 1UL);
99 LTC_SET_ASN1(seq_ecparams, 5, LTC_ASN1_SHORT_INTEGER, &cofactor, 1UL);
100 seq_ecparams[5].optional = 1;
101 /* FieldID SEQUENCE */
102 LTC_SET_ASN1(seq_fieldid, 0, LTC_ASN1_OBJECT_IDENTIFIER, tmpoid, 16UL);
103 LTC_SET_ASN1(seq_fieldid, 1, LTC_ASN1_INTEGER, prime, 1UL);
104 /* Curve SEQUENCE */
105 LTC_SET_ASN1(seq_curve, 0, LTC_ASN1_OCTET_STRING, bin_a, (unsigned long)ECC_MAXSIZE);
106 LTC_SET_ASN1(seq_curve, 1, LTC_ASN1_OCTET_STRING, bin_b, (unsigned long)ECC_MAXSIZE);
107 LTC_SET_ASN1(seq_curve, 2, LTC_ASN1_RAW_BIT_STRING, bin_seed, (unsigned long)8*128);
108 /* */
109 LTC_SET_ASN1(alg_seq, 0, LTC_ASN1_OBJECT_IDENTIFIER, oid, 16UL);
110 LTC_SET_ASN1(alg_seq, 1, LTC_ASN1_SEQUENCE, seq_ecparams, 6UL);
111 LTC_SET_ASN1(top_seq, 0, LTC_ASN1_INTEGER, zero, 1UL);
112 LTC_SET_ASN1(top_seq, 1, LTC_ASN1_SEQUENCE, alg_seq, 2UL);
113 LTC_SET_ASN1(top_seq, 2, LTC_ASN1_OCTET_STRING, buf1, buf1len);
114 seq_curve[2].optional = 1;
115 err=der_decode_sequence(decrypted, decryptedlen, top_seq, 3UL);
116 if (err != CRYPT_OK) { goto LBL_ERR; }
117 len_a = seq_curve[0].size;
118 len_b = seq_curve[1].size;
119 len_g = seq_ecparams[3].size;
120 /* create bignums */
121 if ((err = mp_read_unsigned_bin(a, bin_a, len_a)) != CRYPT_OK) { goto LBL_ERR; }
122 if ((err = mp_read_unsigned_bin(b, bin_b, len_b)) != CRYPT_OK) { goto LBL_ERR; }
123 if ((err = ltc_ecc_import_point(bin_g, len_g, prime, a, b, gx, gy)) != CRYPT_OK) { goto LBL_ERR; }
124 /* load curve parameters */
125 if ((err = ecc_dp_set_bn(dp, a, b, prime, order, gx, gy, cofactor)) != CRYPT_OK) { goto LBL_ERR; }
126 }
127
128 /* check alg oid */
129 if ((alg_seq[0].size != ecoid.OIDlen) ||
130 XMEMCMP(ecoid.OID, alg_seq[0].data, ecoid.OIDlen * sizeof(ecoid.OID[0]))) {
131 err = CRYPT_PK_INVALID_TYPE;
132 goto LBL_ERR;
133 }
134
135 /* ECPrivateKey SEQUENCE */
136 LTC_SET_ASN1(seq_priv, 0, LTC_ASN1_SHORT_INTEGER, &one, 1UL);
137 LTC_SET_ASN1(seq_priv, 1, LTC_ASN1_OCTET_STRING, bin_k, (unsigned long)ECC_MAXSIZE);
138 LTC_SET_ASN1(seq_priv, 2, LTC_ASN1_RAW_BIT_STRING, bin_xy, (unsigned long)8*(2*ECC_MAXSIZE+2));
139 seq_priv[2].tag = 0xA1; /* context specific 1 */
140 /* try to load private key */
141 err = der_decode_sequence(buf1, top_seq[2].size, seq_priv, 3);
142 if (err != CRYPT_OK) { goto LBL_ERR; }
143 /* load private+public key */
144 if ((err = ecc_import_raw(bin_k, seq_priv[1].size, key, dp)) != CRYPT_OK) { goto LBL_ERR; }
145 /* success */
146 return err;
147
148 LBL_ERR:
149 mp_clear_multi(prime, order, a, b, gx, gy, NULL);
150 LBL_NOCLEAR:
151 XFREE(buf2);
152 LBL_FREE:
153 XFREE(buf1);
154 LBL_NOFREE:
473 err = mp_init_multi(&a, &b, &gx, &gy, NULL);
474 if (err != CRYPT_OK) return err;
475
476 if ((err = _der_decode_pkcs8_flexi(in, inlen, pwd, pwdlen, &l)) == CRYPT_OK) {
477 if (l->type == LTC_ASN1_SEQUENCE &&
478 l->child && l->child->type == LTC_ASN1_INTEGER &&
479 l->child->next && l->child->next->type == LTC_ASN1_SEQUENCE &&
480 l->child->next->child && l->child->next->child->type == LTC_ASN1_OBJECT_IDENTIFIER &&
481 l->child->next->next && l->child->next->next->type == LTC_ASN1_OCTET_STRING) {
482 ltc_asn1_list *lseq = l->child->next;
483 ltc_asn1_list *lpri = l->child->next->next;
484 ltc_asn1_list *lecoid = l->child->next->child;
485
486 if ((lecoid->size != ecoid.OIDlen) ||
487 XMEMCMP(ecoid.OID, lecoid->data, ecoid.OIDlen * sizeof(ecoid.OID[0]))) {
488 err = CRYPT_PK_INVALID_TYPE;
489 goto LBL_DONE;
490 }
491
492 if (lseq->child->next && lseq->child->next->type == LTC_ASN1_OBJECT_IDENTIFIER) {
493 /* CASE 1: curve by OID (AKA short variant):
494 * 0:d=0 hl=2 l= 100 cons: SEQUENCE
495 * 2:d=1 hl=2 l= 1 prim: INTEGER :00
496 * 5:d=1 hl=2 l= 16 cons: SEQUENCE (== *lseq)
497 * 7:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
498 * 16:d=2 hl=2 l= 5 prim: OBJECT :secp256k1 (== 1.3.132.0.10)
499 * 23:d=1 hl=2 l= 77 prim: OCTET STRING :bytes (== privatekey)
500 */
501 ltc_asn1_list *loid = lseq->child->next;
502 if ((err = ecc_set_dp_oid(loid->data, loid->size, key)) != CRYPT_OK) {
503 goto LBL_DONE;
504 }
505 }
506 else if (lseq->child->next && lseq->child->next->type == LTC_ASN1_SEQUENCE) {
507 /* CASE 2: explicit curve parameters (AKA long variant):
508 * 0:d=0 hl=3 l= 227 cons: SEQUENCE
509 * 3:d=1 hl=2 l= 1 prim: INTEGER :00
510 * 6:d=1 hl=3 l= 142 cons: SEQUENCE (== *lseq)
511 * 9:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
512 * 18:d=2 hl=3 l= 130 cons: SEQUENCE (== *lcurve)
513 * 21:d=3 hl=2 l= 1 prim: INTEGER :01
514 * 24:d=3 hl=2 l= 44 cons: SEQUENCE (== *lfield)
515 * 26:d=4 hl=2 l= 7 prim: OBJECT :prime-field
516 * 35:d=4 hl=2 l= 33 prim: INTEGER :(== curve.prime)
517 * 70:d=3 hl=2 l= 6 cons: SEQUENCE (== *lpoint)
518 * 72:d=4 hl=2 l= 1 prim: OCTET STRING :bytes (== curve.A)
519 * 75:d=4 hl=2 l= 1 prim: OCTET STRING :bytes (== curve.B)
520 * 78:d=3 hl=2 l= 33 prim: OCTET STRING :bytes (== curve.G-point)
521 * 113:d=3 hl=2 l= 33 prim: INTEGER :(== curve.order)
522 * 148:d=3 hl=2 l= 1 prim: INTEGER :(== curve.cofactor)
523 * 151:d=1 hl=2 l= 77 prim: OCTET STRING :bytes (== privatekey)
524 */
525 ltc_asn1_list *lcurve = lseq->child->next;
526
527 if (lcurve->child && lcurve->child->type == LTC_ASN1_INTEGER &&
528 lcurve->child->next && lcurve->child->next->type == LTC_ASN1_SEQUENCE &&
529 lcurve->child->next->next && lcurve->child->next->next->type == LTC_ASN1_SEQUENCE &&
530 lcurve->child->next->next->next && lcurve->child->next->next->next->type == LTC_ASN1_OCTET_STRING &&
531 lcurve->child->next->next->next->next && lcurve->child->next->next->next->next->type == LTC_ASN1_INTEGER &&
532 lcurve->child->next->next->next->next->next && lcurve->child->next->next->next->next->next->type == LTC_ASN1_INTEGER) {
533
534 ltc_asn1_list *lfield = lcurve->child->next;
535 ltc_asn1_list *lpoint = lcurve->child->next->next;
536 ltc_asn1_list *lg = lcurve->child->next->next->next;
537 ltc_asn1_list *lorder = lcurve->child->next->next->next->next;
538 cofactor = mp_get_int(lcurve->child->next->next->next->next->next->data);
539
540 if (lfield->child && lfield->child->type == LTC_ASN1_OBJECT_IDENTIFIER &&
541 lfield->child->next && lfield->child->next->type == LTC_ASN1_INTEGER &&
542 lpoint->child && lpoint->child->type == LTC_ASN1_OCTET_STRING &&
543 lpoint->child->next && lpoint->child->next->type == LTC_ASN1_OCTET_STRING) {
544
545 ltc_asn1_list *lprime = lfield->child->next;
546 if ((err = mp_read_unsigned_bin(a, lpoint->child->data, lpoint->child->size)) != CRYPT_OK) {
547 goto LBL_DONE;
548 }
549 if ((err = mp_read_unsigned_bin(b, lpoint->child->next->data, lpoint->child->next->size)) != CRYPT_OK) {
550 goto LBL_DONE;
551 }
552 if ((err = ltc_ecc_import_point(lg->data, lg->size, lprime->data, a, b, gx, gy)) != CRYPT_OK) {
553 goto LBL_DONE;
554 }
555 if ((err = ecc_set_dp_bn(a, b, lprime->data, lorder->data, gx, gy, cofactor, key)) != CRYPT_OK) {
556 goto LBL_DONE;
557 }
558 }
559 }
560 }
561 else {
562 err = CRYPT_INVALID_PACKET;
563 goto LBL_DONE;
564 }
565
566 /* load private key value 'k' */
567 len = lpri->size;
568 if ((err = der_decode_sequence_flexi(lpri->data, &len, &p)) == CRYPT_OK) {
569 err = CRYPT_INVALID_PACKET;
570 if (p->type == LTC_ASN1_SEQUENCE &&
571 p->child && p->child->type == LTC_ASN1_INTEGER &&
572 p->child->next && p->child->next->type == LTC_ASN1_OCTET_STRING) {
573 ltc_asn1_list *lk = p->child->next;
574 if (mp_cmp_d(p->child->data, 1) != LTC_MP_EQ) {
575 err = CRYPT_INVALID_PACKET;
576 goto LBL_ECCFREE;
577 }
578 if ((err = ecc_set_key(lk->data, lk->size, PK_PRIVATE, key)) != CRYPT_OK) {
579 goto LBL_ECCFREE;
580 }
581 goto LBL_DONE; /* success */
582 }
583 }
584 }
585 }
586 err = CRYPT_INVALID_PACKET;
587 goto LBL_DONE;
588
589 LBL_ECCFREE:
590 ecc_free(key);
591 LBL_DONE:
592 mp_clear_multi(a, b, gx, gy, NULL);
593 if (l) der_free_sequence_flexi(l);
594 if (p) der_free_sequence_flexi(p);
155595 return err;
156596 }
157597
158598 #endif
599
600 /* ref: $Format:%D$ */
601 /* git commit: $Format:%H$ */
602 /* commit time: $Format:%ai$ */
+0
-100
src/ltc/pk/ecc/ecc_import_raw.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 #ifdef LTC_MECC
17
18 /** Import raw public or private key (public keys = ANSI X9.63 compressed or uncompressed; private keys = raw bytes)
19 @param in The input data to read
20 @param inlen The length of the input data
21 @param key [out] destination to store imported key
22 @param dp Curve parameters
23 Return CRYPT_OK on success
24 */
25
26 int ecc_import_raw(const unsigned char *in, unsigned long inlen, ecc_key *key, ltc_ecc_set_type *dp)
27 {
28 int err, type = -1;
29 unsigned long size = 0;
30 void *prime, *a, *b;
31 ecc_point *base;
32
33 LTC_ARGCHK(in != NULL);
34 LTC_ARGCHK(key != NULL);
35 LTC_ARGCHK(dp != NULL);
36
37 /* init key + temporary numbers */
38 if (mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, &prime, &a, &b, NULL) != CRYPT_OK) {
39 return CRYPT_MEM;
40 }
41
42 if (inlen <= (unsigned long)dp->size) {
43 /* read PRIVATE key */
44 type = PK_PRIVATE;
45 size = inlen;
46 /* load private k */
47 if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)in, size)) != CRYPT_OK) {
48 goto cleanup;
49 }
50 if (mp_iszero(key->k)) {
51 err = CRYPT_INVALID_PACKET;
52 goto cleanup;
53 }
54 /* init base point */
55 if ((base = ltc_ecc_new_point()) == NULL) {
56 err = CRYPT_MEM;
57 goto cleanup;
58 }
59 /* load prime + base point */
60 if ((err = mp_read_radix(prime, dp->prime, 16)) != CRYPT_OK) { goto cleanup; }
61 if ((err = mp_read_radix(base->x, dp->Gx, 16)) != CRYPT_OK) { goto cleanup; }
62 if ((err = mp_read_radix(base->y, dp->Gy, 16)) != CRYPT_OK) { goto cleanup; }
63 if ((err = mp_set(base->z, 1)) != CRYPT_OK) { goto cleanup; }
64 /* make the public key */
65 if ((err = mp_read_radix(a, dp->A, 16)) != CRYPT_OK) { goto cleanup; }
66 if ((err = ltc_mp.ecc_ptmul(key->k, base, &key->pubkey, a, prime, 1)) != CRYPT_OK) { goto cleanup; }
67 /* cleanup */
68 ltc_ecc_del_point(base);
69 }
70 else {
71 /* read PUBLIC key */
72 type = PK_PUBLIC;
73 /* load prime + A + B */
74 if ((err = mp_read_radix(prime, dp->prime, 16)) != CRYPT_OK) { goto cleanup; }
75 if ((err = mp_read_radix(b, dp->B, 16)) != CRYPT_OK) { goto cleanup; }
76 if ((err = mp_read_radix(a, dp->A, 16)) != CRYPT_OK) { goto cleanup; }
77 err = ltc_ecc_import_point(in, inlen, prime, a, b, key->pubkey.x, key->pubkey.y);
78 if (err != CRYPT_OK) { goto cleanup; }
79 if ((err = mp_set(key->pubkey.z, 1)) != CRYPT_OK) { goto cleanup; }
80 }
81
82 if ((err = ltc_ecc_is_point(dp, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) {
83 err = CRYPT_INVALID_PACKET;
84 goto cleanup;
85 }
86
87 key->type = type;
88 key->idx = -1;
89 key->dp = dp;
90
91 /* we're done */
92 mp_clear_multi(prime, a, b, NULL);
93 return CRYPT_OK;
94 cleanup:
95 mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, prime, a, b, NULL);
96 return err;
97 }
98
99 #endif
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8 #include "tomcrypt.h"
9
10 #ifdef LTC_MECC
11
12 /**
13 Import an ECC key from a X.509 certificate
14 @param in The packet to import from
15 @param inlen It's length (octets)
16 @param key [out] Destination for newly imported key
17 @return CRYPT_OK if successful, upon error allocated memory is freed
18 */
19 int ecc_import_x509(const unsigned char *in, unsigned long inlen, ecc_key *key)
20 {
21 int err;
22 unsigned long len;
23 ltc_asn1_list *decoded_list = NULL, *l;
24
25 LTC_ARGCHK(in != NULL);
26 LTC_ARGCHK(key != NULL);
27
28 len = inlen;
29 if ((err = der_decode_sequence_flexi(in, &len, &decoded_list)) == CRYPT_OK) {
30 l = decoded_list;
31 if (l->type == LTC_ASN1_SEQUENCE &&
32 l->child && l->child->type == LTC_ASN1_SEQUENCE) {
33 err = CRYPT_ERROR;
34 l = l->child->child;
35 while (l) {
36 if (l->type == LTC_ASN1_SEQUENCE && l->data &&
37 l->child && l->child->type == LTC_ASN1_SEQUENCE &&
38 l->child->child && l->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER &&
39 l->child->next && l->child->next->type == LTC_ASN1_BIT_STRING) {
40 err = ecc_import_openssl(l->data, l->size, key);
41 goto LBL_DONE;
42 }
43 l = l->next;
44 }
45 }
46 }
47
48 LBL_DONE:
49 if (decoded_list) der_free_sequence_flexi(decoded_list);
50 return err;
51 }
52
53 #endif /* LTC_MECC */
54
55
56 /* ref: $Format:%D$ */
57 /* git commit: $Format:%H$ */
58 /* commit time: $Format:%ai$ */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2825 */
2926 int ecc_make_key(prng_state *prng, int wprng, int keysize, ecc_key *key)
3027 {
31 /* BEWARE: Here we are looking up the curve params by keysize (neither curve name nor curve oid),
32 * which might be ambiguous (there can more than one curve for given keysize).
33 * Thus the chosen curve depends on order of items in ltc_ecc_sets[] - see ecc.c file.
34 */
35 int x, err;
28 int err;
3629
37 /* find key size */
38 for (x = 0; (keysize > ltc_ecc_sets[x].size) && (ltc_ecc_sets[x].size != 0); x++);
39 keysize = ltc_ecc_sets[x].size;
40
41 if (keysize > ECC_MAXSIZE || ltc_ecc_sets[x].size == 0) {
42 return CRYPT_INVALID_KEYSIZE;
43 }
44 err = ecc_make_key_ex(prng, wprng, key, &ltc_ecc_sets[x]);
45 key->idx = x;
46 return err;
30 if ((err = ecc_set_dp_size(keysize, key)) != CRYPT_OK) { return err; }
31 if ((err = ecc_generate_key(prng, wprng, key)) != CRYPT_OK) { return err; }
32 return CRYPT_OK;
4733 }
4834
4935 int ecc_make_key_ex(prng_state *prng, int wprng, ecc_key *key, const ltc_ecc_set_type *dp)
5036 {
37 int err;
38 if ((err = ecc_set_dp(dp, key)) != CRYPT_OK) { return err; }
39 if ((err = ecc_generate_key(prng, wprng, key)) != CRYPT_OK) { return err; }
40 return CRYPT_OK;
41 }
42
43 int ecc_generate_key(prng_state *prng, int wprng, ecc_key *key)
44 {
5145 int err;
52 ecc_point *base;
53 void *prime, *order, *a;
54 unsigned char *buf;
55 int keysize, orderbits;
5646
47 LTC_ARGCHK(ltc_mp.name != NULL);
5748 LTC_ARGCHK(key != NULL);
58 LTC_ARGCHK(ltc_mp.name != NULL);
59 LTC_ARGCHK(dp != NULL);
49 LTC_ARGCHK(key->dp.size > 0);
6050
6151 /* good prng? */
6252 if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
6353 return err;
6454 }
65
66 key->idx = -1;
67 key->dp = dp;
68 keysize = dp->size;
69
70 /* allocate ram */
71 base = NULL;
72 buf = XMALLOC(ECC_MAXSIZE);
73 if (buf == NULL) {
74 return CRYPT_MEM;
75 }
76
77 /* make up random string */
78 if (prng_descriptor[wprng].read(buf, (unsigned long)keysize, prng) != (unsigned long)keysize) {
79 err = CRYPT_ERROR_READPRNG;
80 goto ERR_BUF;
81 }
82
83 /* setup the key variables */
84 if ((err = mp_init_multi(&key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k, &prime, &order, &a, NULL)) != CRYPT_OK) {
85 goto ERR_BUF;
86 }
87 base = ltc_ecc_new_point();
88 if (base == NULL) {
89 err = CRYPT_MEM;
90 goto errkey;
91 }
92
93 /* read in the specs for this key */
94 if ((err = mp_read_radix(prime, (char *)key->dp->prime, 16)) != CRYPT_OK) { goto errkey; }
95 if ((err = mp_read_radix(order, (char *)key->dp->order, 16)) != CRYPT_OK) { goto errkey; }
96 if ((err = mp_read_radix(base->x, (char *)key->dp->Gx, 16)) != CRYPT_OK) { goto errkey; }
97 if ((err = mp_read_radix(base->y, (char *)key->dp->Gy, 16)) != CRYPT_OK) { goto errkey; }
98 if ((err = mp_set(base->z, 1)) != CRYPT_OK) { goto errkey; }
99 if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)buf, keysize)) != CRYPT_OK) { goto errkey; }
10055
10156 /* ECC key pair generation according to FIPS-186-4 (B.4.2 Key Pair Generation by Testing Candidates):
10257 * the generated private key k should be the range [1, order-1]
10560 * c/ if k not in [1, order-1] go to b/
10661 * e/ Q = k*G
10762 */
108 orderbits = mp_count_bits(order);
109 do {
110 if ((err = rand_bn_bits(key->k, orderbits, prng, wprng)) != CRYPT_OK) { goto errkey; }
111 } while (mp_iszero(key->k) || mp_cmp(key->k, order) != LTC_MP_LT);
63 if ((err = rand_bn_upto(key->k, key->dp.order, prng, wprng)) != CRYPT_OK) {
64 goto error;
65 }
11266
11367 /* make the public key */
114 if ((err = mp_read_radix(a, (char *)key->dp->A, 16)) != CRYPT_OK) { goto errkey; }
115 if ((err = ltc_mp.ecc_ptmul(key->k, base, &key->pubkey, a, prime, 1)) != CRYPT_OK) { goto errkey; }
68 if ((err = ltc_mp.ecc_ptmul(key->k, &key->dp.base, &key->pubkey, key->dp.A, key->dp.prime, 1)) != CRYPT_OK) {
69 goto error;
70 }
11671 key->type = PK_PRIVATE;
11772
118 /* free up ram */
73 /* success */
11974 err = CRYPT_OK;
12075 goto cleanup;
121 errkey:
122 mp_clear_multi(key->pubkey.x, key->pubkey.y, key->pubkey.z, key->k, NULL);
76
77 error:
78 ecc_free(key);
12379 cleanup:
124 ltc_ecc_del_point(base);
125 mp_clear_multi(prime, order, a, NULL);
126 ERR_BUF:
127 #ifdef LTC_CLEAN_STACK
128 zeromem(buf, ECC_MAXSIZE);
129 #endif
130 XFREE(buf);
13180 return err;
13281 }
13382
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 int ecc_set_dp(const ltc_ecc_set_type *set, ecc_key *key)
14 {
15 unsigned long i;
16 int err;
17
18 LTC_ARGCHK(key != NULL);
19 LTC_ARGCHK(set != NULL);
20
21 if ((err = mp_init_multi(&key->dp.prime, &key->dp.order, &key->dp.A, &key->dp.B,
22 &key->dp.base.x, &key->dp.base.y, &key->dp.base.z,
23 &key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k,
24 NULL)) != CRYPT_OK) {
25 return err;
26 }
27
28 /* A, B, order, prime, Gx, Gy */
29 if ((err = mp_read_radix(key->dp.prime, set->prime, 16)) != CRYPT_OK) { goto error; }
30 if ((err = mp_read_radix(key->dp.order, set->order, 16)) != CRYPT_OK) { goto error; }
31 if ((err = mp_read_radix(key->dp.A, set->A, 16)) != CRYPT_OK) { goto error; }
32 if ((err = mp_read_radix(key->dp.B, set->B, 16)) != CRYPT_OK) { goto error; }
33 if ((err = mp_read_radix(key->dp.base.x, set->Gx, 16)) != CRYPT_OK) { goto error; }
34 if ((err = mp_read_radix(key->dp.base.y, set->Gy, 16)) != CRYPT_OK) { goto error; }
35 if ((err = mp_set(key->dp.base.z, 1)) != CRYPT_OK) { goto error; }
36 /* cofactor & size */
37 key->dp.cofactor = set->cofactor;
38 key->dp.size = mp_unsigned_bin_size(key->dp.prime);
39 /* OID */
40 key->dp.oidlen = set->oidlen;
41 for (i = 0; i < key->dp.oidlen; i++) key->dp.oid[i] = set->oid[i];
42 /* success */
43 return CRYPT_OK;
44
45 error:
46 ecc_free(key);
47 return err;
48 }
49
50 int ecc_set_dp_size(int size, ecc_key *key)
51 {
52 const ltc_ecc_set_type *dp = NULL;
53 int err;
54
55 /* for compatibility with libtomcrypt-1.17 the sizes below must match the specific curves */
56 if (size <= 14) {
57 if ((err = ecc_get_set_by_name("SECP112R1", &dp)) != CRYPT_OK) return err;
58 return ecc_set_dp(dp, key);
59 }
60 else if (size <= 16) {
61 if ((err = ecc_get_set_by_name("SECP128R1", &dp)) != CRYPT_OK) return err;
62 return ecc_set_dp(dp, key);
63 }
64 else if (size <= 20) {
65 if ((err = ecc_get_set_by_name("SECP160R1", &dp)) != CRYPT_OK) return err;
66 return ecc_set_dp(dp, key);
67 }
68 else if (size <= 24) {
69 if ((err = ecc_get_set_by_name("SECP192R1", &dp)) != CRYPT_OK) return err;
70 return ecc_set_dp(dp, key);
71 }
72 else if (size <= 28) {
73 if ((err = ecc_get_set_by_name("SECP224R1", &dp)) != CRYPT_OK) return err;
74 return ecc_set_dp(dp, key);
75 }
76 else if (size <= 32) {
77 if ((err = ecc_get_set_by_name("SECP256R1", &dp)) != CRYPT_OK) return err;
78 return ecc_set_dp(dp, key);
79 }
80 else if (size <= 48) {
81 if ((err = ecc_get_set_by_name("SECP384R1", &dp)) != CRYPT_OK) return err;
82 return ecc_set_dp(dp, key);
83 }
84 else if (size <= 66) {
85 if ((err = ecc_get_set_by_name("SECP521R1", &dp)) != CRYPT_OK) return err;
86 return ecc_set_dp(dp, key);
87 }
88
89 return CRYPT_INVALID_ARG;
90 }
91
92 #endif
93
94 /* ref: $Format:%D$ */
95 /* git commit: $Format:%H$ */
96 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 static void _ecc_oid_lookup(ecc_key *key)
14 {
15 int err;
16 unsigned i;
17 void *tmp;
18 const ltc_ecc_set_type *set;
19
20 key->dp.oidlen = 0;
21 if ((err = mp_init(&tmp)) != CRYPT_OK) return;
22 for (set = ltc_ecc_sets; set->name != NULL; set++) {
23 if ((err = mp_read_radix(tmp, set->prime, 16)) != CRYPT_OK) continue;
24 if ((mp_cmp(tmp, key->dp.prime) != LTC_MP_EQ)) continue;
25 if ((err = mp_read_radix(tmp, set->order, 16)) != CRYPT_OK) continue;
26 if ((mp_cmp(tmp, key->dp.order) != LTC_MP_EQ)) continue;
27 if ((err = mp_read_radix(tmp, set->A, 16)) != CRYPT_OK) continue;
28 if ((mp_cmp(tmp, key->dp.A) != LTC_MP_EQ)) continue;
29 if ((err = mp_read_radix(tmp, set->B, 16)) != CRYPT_OK) continue;
30 if ((mp_cmp(tmp, key->dp.B) != LTC_MP_EQ)) continue;
31 if ((err = mp_read_radix(tmp, set->Gx, 16)) != CRYPT_OK) continue;
32 if ((mp_cmp(tmp, key->dp.base.x) != LTC_MP_EQ)) continue;
33 if ((err = mp_read_radix(tmp, set->Gy, 16)) != CRYPT_OK) continue;
34 if ((mp_cmp(tmp, key->dp.base.y) != LTC_MP_EQ)) continue;
35 if (key->dp.cofactor != set->cofactor) continue;
36 break; /* found */
37 }
38 mp_clear(tmp);
39 if (set->name != NULL) {
40 /* OID found */
41 key->dp.oidlen = set->oidlen;
42 for(i = 0; i < set->oidlen; i++) key->dp.oid[i] = set->oid[i];
43 }
44 }
45
46 int ecc_set_dp_oid(unsigned long *oid, unsigned long oidsize, ecc_key *key)
47 {
48 int i;
49
50 LTC_ARGCHK(oid != NULL);
51 LTC_ARGCHK(oidsize > 0);
52
53 for(i = 0; ltc_ecc_sets[i].name != NULL; i++) {
54 if ((oidsize == ltc_ecc_sets[i].oidlen) &&
55 (XMEM_NEQ(oid, ltc_ecc_sets[i].oid, sizeof(unsigned long) * ltc_ecc_sets[i].oidlen) == 0)) {
56 break;
57 }
58 }
59 if (ltc_ecc_sets[i].name == NULL) return CRYPT_ERROR; /* not found */
60 return ecc_set_dp(&ltc_ecc_sets[i], key);
61 }
62
63 int ecc_set_dp_copy(ecc_key *srckey, ecc_key *key)
64 {
65 unsigned long i;
66 int err;
67
68 LTC_ARGCHK(key != NULL);
69 LTC_ARGCHK(srckey != NULL);
70
71 if ((err = mp_init_multi(&key->dp.prime, &key->dp.order, &key->dp.A, &key->dp.B,
72 &key->dp.base.x, &key->dp.base.y, &key->dp.base.z,
73 &key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k,
74 NULL)) != CRYPT_OK) {
75 return err;
76 }
77
78 /* A, B, order, prime, Gx, Gy */
79 if ((err = mp_copy(srckey->dp.prime, key->dp.prime )) != CRYPT_OK) { goto error; }
80 if ((err = mp_copy(srckey->dp.order, key->dp.order )) != CRYPT_OK) { goto error; }
81 if ((err = mp_copy(srckey->dp.A, key->dp.A )) != CRYPT_OK) { goto error; }
82 if ((err = mp_copy(srckey->dp.B, key->dp.B )) != CRYPT_OK) { goto error; }
83 if ((err = mp_copy(srckey->dp.base.x, key->dp.base.x)) != CRYPT_OK) { goto error; }
84 if ((err = mp_copy(srckey->dp.base.y, key->dp.base.y)) != CRYPT_OK) { goto error; }
85 if ((err = mp_copy(srckey->dp.base.z, key->dp.base.z)) != CRYPT_OK) { goto error; }
86 /* cofactor & size */
87 key->dp.cofactor = srckey->dp.cofactor;
88 key->dp.size = srckey->dp.size;
89 /* OID */
90 if (srckey->dp.oidlen > 0) {
91 key->dp.oidlen = srckey->dp.oidlen;
92 for (i = 0; i < key->dp.oidlen; i++) key->dp.oid[i] = srckey->dp.oid[i];
93 }
94 else {
95 _ecc_oid_lookup(key); /* try to find OID in ltc_ecc_sets */
96 }
97 /* success */
98 return CRYPT_OK;
99
100 error:
101 ecc_free(key);
102 return err;
103 }
104
105 int ecc_set_dp_bn(void *a, void *b, void *prime, void *order, void *gx, void *gy, unsigned long cofactor, ecc_key *key)
106 {
107 int err;
108
109 LTC_ARGCHK(key != NULL);
110 LTC_ARGCHK(a != NULL);
111 LTC_ARGCHK(b != NULL);
112 LTC_ARGCHK(prime != NULL);
113 LTC_ARGCHK(order != NULL);
114 LTC_ARGCHK(gx != NULL);
115 LTC_ARGCHK(gy != NULL);
116
117 if ((err = mp_init_multi(&key->dp.prime, &key->dp.order, &key->dp.A, &key->dp.B,
118 &key->dp.base.x, &key->dp.base.y, &key->dp.base.z,
119 &key->pubkey.x, &key->pubkey.y, &key->pubkey.z, &key->k,
120 NULL)) != CRYPT_OK) {
121 return err;
122 }
123
124 /* A, B, order, prime, Gx, Gy */
125 if ((err = mp_copy(prime, key->dp.prime )) != CRYPT_OK) { goto error; }
126 if ((err = mp_copy(order, key->dp.order )) != CRYPT_OK) { goto error; }
127 if ((err = mp_copy(a, key->dp.A )) != CRYPT_OK) { goto error; }
128 if ((err = mp_copy(b, key->dp.B )) != CRYPT_OK) { goto error; }
129 if ((err = mp_copy(gx, key->dp.base.x)) != CRYPT_OK) { goto error; }
130 if ((err = mp_copy(gy, key->dp.base.y)) != CRYPT_OK) { goto error; }
131 if ((err = mp_set(key->dp.base.z, 1)) != CRYPT_OK) { goto error; }
132 /* cofactor & size */
133 key->dp.cofactor = cofactor;
134 key->dp.size = mp_unsigned_bin_size(prime);
135 /* try to find OID in ltc_ecc_sets */
136 _ecc_oid_lookup(key);
137 /* success */
138 return CRYPT_OK;
139
140 error:
141 ecc_free(key);
142 return err;
143 }
144
145 #endif
146
147 /* ref: $Format:%D$ */
148 /* git commit: $Format:%H$ */
149 /* commit time: $Format:%ai$ */
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 #ifdef LTC_MECC
12
13 int ecc_set_key(const unsigned char *in, unsigned long inlen, int type, ecc_key *key)
14 {
15 int err;
16 void *prime, *a, *b;
17
18 LTC_ARGCHK(key != NULL);
19 LTC_ARGCHK(in != NULL);
20 LTC_ARGCHK(inlen > 0);
21
22 prime = key->dp.prime;
23 a = key->dp.A;
24 b = key->dp.B;
25
26 if (type == PK_PRIVATE && inlen <= (unsigned long)key->dp.size) {
27 /* load private key */
28 if ((err = mp_read_unsigned_bin(key->k, (unsigned char *)in, inlen)) != CRYPT_OK) {
29 goto error;
30 }
31 if (mp_iszero(key->k)) {
32 err = CRYPT_INVALID_PACKET;
33 goto error;
34 }
35 /* compute public key */
36 if ((err = ltc_mp.ecc_ptmul(key->k, &key->dp.base, &key->pubkey, a, prime, 1)) != CRYPT_OK) { goto error; }
37 key->type = type;
38 }
39 else if (type == PK_PUBLIC) {
40 /* load public key */
41 if ((err = ltc_ecc_import_point(in, inlen, prime, a, b, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) { goto error; }
42 if ((err = mp_set(key->pubkey.z, 1)) != CRYPT_OK) { goto error; }
43 key->type = type;
44 }
45 else {
46 err = CRYPT_INVALID_PACKET;
47 goto error;
48 }
49
50 /* point on the curve + other checks */
51 if ((err = ltc_ecc_verify_key(key)) != CRYPT_OK) {
52 goto error;
53 }
54
55 return CRYPT_OK;
56
57 error:
58 ecc_free(key);
59 return err;
60 }
61
62 #endif
63
64 /* ref: $Format:%D$ */
65 /* git commit: $Format:%H$ */
66 /* commit time: $Format:%ai$ */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
4441 return CRYPT_PK_NOT_PRIVATE;
4542 }
4643
47 if (ltc_ecc_is_valid_idx(private_key->idx) == 0 || ltc_ecc_is_valid_idx(public_key->idx) == 0) {
48 return CRYPT_INVALID_ARG;
49 }
50
51 /* XXX FIXME names can be different in some situations
52 if (XSTRCMP(private_key->dp->name, public_key->dp->name) != 0) {
53 return CRYPT_PK_TYPE_MISMATCH;
54 }
55 */
5644 /* make new point */
5745 result = ltc_ecc_new_point();
5846 if (result == NULL) {
5947 return CRYPT_MEM;
6048 }
6149
62 if ((err = mp_init_multi(&prime, &a, NULL)) != CRYPT_OK) {
63 ltc_ecc_del_point(result);
64 return err;
65 }
50 prime = private_key->dp.prime;
51 a = private_key->dp.A;
6652
67 if ((err = mp_read_radix(prime, (char *)private_key->dp->prime, 16)) != CRYPT_OK) { goto done; }
68 if ((err = mp_read_radix(a, (char *)private_key->dp->A, 16)) != CRYPT_OK) { goto done; }
69 if ((err = ltc_mp.ecc_ptmul(private_key->k, &public_key->pubkey, result, a, prime, 1)) != CRYPT_OK) { goto done; }
53 if ((err = ltc_mp.ecc_ptmul(private_key->k, &public_key->pubkey, result, a, prime, 1)) != CRYPT_OK) { goto done; }
7054
7155 x = (unsigned long)mp_unsigned_bin_size(prime);
7256 if (*outlen < x) {
7559 goto done;
7660 }
7761 zeromem(out, x);
78 if ((err = mp_to_unsigned_bin(result->x, out + (x - mp_unsigned_bin_size(result->x)))) != CRYPT_OK) { goto done; }
62 if ((err = mp_to_unsigned_bin(result->x, out + (x - mp_unsigned_bin_size(result->x)))) != CRYPT_OK) { goto done; }
7963
8064 err = CRYPT_OK;
8165 *outlen = x;
8266 done:
83 mp_clear_multi(prime, a, NULL);
8467 ltc_ecc_del_point(result);
8568 return err;
8669 }
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 */
8
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
117 */
128
139 #include "tomcrypt.h"
1915 ECC Crypto, Tom St Denis
2016 */
2117
22 static int ecc_sign_hash_ex(const unsigned char *in, unsigned long inlen,
23 unsigned char *out, unsigned long *outlen,
24 prng_state *prng, int wprng, ecc_key *key, int sigformat)
18 static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
19 unsigned char *out, unsigned long *outlen,
20 prng_state *prng, int wprng, ecc_key *key, int sigformat)
2521 {
2622 ecc_key pubkey;
2723 void *r, *s, *e, *p;
28 int err;
24 int err, max_iterations = LTC_PK_MAX_RETRIES;
2925 unsigned long pbits, pbytes, i, shift_right;
3026 unsigned char ch, buf[MAXBLOCKSIZE];
3127
3935 return CRYPT_PK_NOT_PRIVATE;
4036 }
4137
42 /* is the IDX valid ? */
43 if (ltc_ecc_is_valid_idx(key->idx) != 1) {
44 return CRYPT_PK_INVALID_TYPE;
45 }
46
4738 if ((err = prng_is_valid(wprng)) != CRYPT_OK) {
4839 return err;
4940 }
5041
5142 /* init the bignums */
52 if ((err = mp_init_multi(&r, &s, &p, &e, NULL)) != CRYPT_OK) {
43 if ((err = mp_init_multi(&r, &s, &e, NULL)) != CRYPT_OK) {
5344 return err;
5445 }
55 if ((err = mp_read_radix(p, (char *)key->dp->order, 16)) != CRYPT_OK) { goto errnokey; }
5646
5747 /* get the hash and load it as a bignum into 'e' */
48 p = key->dp.order;
5849 pbits = mp_count_bits(p);
5950 pbytes = (pbits+7) >> 3;
6051 if (pbits > inlen*8) {
7465 }
7566
7667 /* make up a key and export the public copy */
77 for (;;) {
78 if ((err = ecc_make_key_ex(prng, wprng, &pubkey, key->dp)) != CRYPT_OK) { goto errnokey; }
68 do {
69 if ((err = ecc_set_dp_copy(key, &pubkey)) != CRYPT_OK) { goto errnokey; }
70 if ((err = ecc_generate_key(prng, wprng, &pubkey)) != CRYPT_OK) { goto errnokey; }
7971
8072 /* find r = x1 mod n */
81 if ((err = mp_mod(pubkey.pubkey.x, p, r)) != CRYPT_OK) { goto error; }
73 if ((err = mp_mod(pubkey.pubkey.x, p, r)) != CRYPT_OK) { goto error; }
8274
8375 if (mp_iszero(r) == LTC_MP_YES) {
8476 ecc_free(&pubkey);
85 }
86 else {
77 } else {
8778 /* find s = (e + xr)/k */
8879 if ((err = mp_invmod(pubkey.k, p, pubkey.k)) != CRYPT_OK) { goto error; } /* k = 1/k */
8980 if ((err = mp_mulmod(key->k, r, p, s)) != CRYPT_OK) { goto error; } /* s = xr */
9586 break;
9687 }
9788 }
89 } while (--max_iterations > 0);
90
91 if (max_iterations == 0) {
92 goto errnokey;
9893 }
9994
10095 if (sigformat == 1) {
119114 error:
120115 ecc_free(&pubkey);
121116 errnokey:
122 mp_clear_multi(r, s, p, e, NULL);
117 mp_clear_multi(r, s, e, NULL);
123118 return err;
124119 }
125120
138133 unsigned char *out, unsigned long *outlen,
139134 prng_state *prng, int wprng, ecc_key *key)
140135 {
141 return ecc_sign_hash_ex(in, inlen, out, outlen, prng, wprng, key, 0);
136 return _ecc_sign_hash(in, inlen, out, outlen, prng, wprng, key, 0);
142137 }
143138
144139 /**
156151 unsigned char *out, unsigned long *outlen,
157152 prng_state *prng, int wprng, ecc_key *key)
158153 {
159 return ecc_sign_hash_ex(in, inlen, out, outlen, prng, wprng, key, 1);
154 return _ecc_sign_hash(in, inlen, out, outlen, prng, wprng, key, 1);
160155 }
161156
162157 #endif
158
159 /* ref: $Format:%D$ */
160 /* git commit: $Format:%H$ */
161 /* commit time: $Format:%ai$ */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2017
2118 void ecc_sizes(int *low, int *high)
2219 {
23 int i;
24 LTC_ARGCHKVD(low != NULL);
25 LTC_ARGCHKVD(high != NULL);
20 int i, size;
21 void *prime;
2622
27 *low = INT_MAX;
28 *high = 0;
29 for (i = 0; ltc_ecc_sets[i].size != 0; i++) {
30 if (ltc_ecc_sets[i].size < *low) {
31 *low = ltc_ecc_sets[i].size;
32 }
33 if (ltc_ecc_sets[i].size > *high) {
34 *high = ltc_ecc_sets[i].size;
35 }
36 }
23 LTC_ARGCHKVD(low != NULL);
24 LTC_ARGCHKVD(high != NULL);
25
26 *low = INT_MAX;
27 *high = 0;
28
29 if (mp_init(&prime) == CRYPT_OK) {
30 for (i = 0; ltc_ecc_sets[i].name != NULL; i++) {
31 if (mp_read_radix(prime, ltc_ecc_sets[i].prime, 16) == CRYPT_OK) {
32 size = mp_unsigned_bin_size(prime);
33 if (size < *low) *low = size;
34 if (size > *high) *high = size;
35 }
36 }
37 mp_clear(prime);
38 }
3739 }
3840
3941 #endif
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12
139 #include "tomcrypt.h"
1410
1511 #ifdef LTC_MECC
1915 ECC Crypto, Tom St Denis
2016 */
2117
22 static int ecc_verify_hash_ex(const unsigned char *sig, unsigned long siglen,
23 const unsigned char *hash, unsigned long hashlen,
24 int *stat, ecc_key *key, int sigformat)
18 static int _ecc_verify_hash(const unsigned char *sig, unsigned long siglen,
19 const unsigned char *hash, unsigned long hashlen,
20 int *stat, ecc_key *key, int sigformat)
2521 {
26 ecc_point *mG, *mQ;
27 void *r, *s, *v, *w, *u1, *u2, *e, *p, *m, *a, *mu, *ma;
28 void *mp;
22 ecc_point *mG = NULL, *mQ = NULL;
23 void *r, *s, *v, *w, *u1, *u2, *e, *p, *m, *a, *a_plus3 = NULL, *mu = NULL, *ma = NULL;
24 void *mp = NULL;
2925 int err;
3026 unsigned long pbits, pbytes, i, shift_right;
3127 unsigned char ch, buf[MAXBLOCKSIZE];
3733
3834 /* default to invalid signature */
3935 *stat = 0;
40 mp = NULL;
41
42 /* is the IDX valid ? */
43 if (ltc_ecc_is_valid_idx(key->idx) != 1) {
44 return CRYPT_PK_INVALID_TYPE;
45 }
4636
4737 /* allocate ints */
48 if ((err = mp_init_multi(&r, &s, &v, &w, &u1, &u2, &p, &e, &m, &a, &mu, &ma, NULL)) != CRYPT_OK) {
38 if ((err = mp_init_multi(&r, &s, &v, &w, &u1, &u2, &e, &a_plus3, NULL)) != CRYPT_OK) {
4939 return CRYPT_MEM;
40 }
41
42 p = key->dp.order;
43 m = key->dp.prime;
44 a = key->dp.A;
45 if ((err = mp_add_d(a, 3, a_plus3)) != CRYPT_OK) {
46 goto error;
5047 }
5148
5249 /* allocate points */
6966 }
7067 else {
7168 /* ASN.1 format */
72 if ((err = der_decode_sequence_multi(sig, siglen,
69 if ((err = der_decode_sequence_multi_ex(sig, siglen, LTC_DER_SEQ_SEQUENCE | LTC_DER_SEQ_STRICT,
7370 LTC_ASN1_INTEGER, 1UL, r,
7471 LTC_ASN1_INTEGER, 1UL, s,
7572 LTC_ASN1_EOL, 0UL, NULL)) != CRYPT_OK) { goto error; }
7673 }
7774
78 /* get the order */
79 if ((err = mp_read_radix(p, (char *)key->dp->order, 16)) != CRYPT_OK) { goto error; }
80
81 /* get the modulus */
82 if ((err = mp_read_radix(m, (char *)key->dp->prime, 16)) != CRYPT_OK) { goto error; }
83
84 /* get the a */
85 if ((err = mp_read_radix(a, (char *)key->dp->A, 16)) != CRYPT_OK) { goto error; }
86
8775 /* check for zero */
88 if (mp_iszero(r) || mp_iszero(s) || mp_cmp(r, p) != LTC_MP_LT || mp_cmp(s, p) != LTC_MP_LT) {
76 if (mp_cmp_d(r, 0) != LTC_MP_GT || mp_cmp_d(s, 0) != LTC_MP_GT ||
77 mp_cmp(r, p) != LTC_MP_LT || mp_cmp(s, p) != LTC_MP_LT) {
8978 err = CRYPT_INVALID_PACKET;
9079 goto error;
9180 }
119108 if ((err = mp_mulmod(r, w, p, u2)) != CRYPT_OK) { goto error; }
120109
121110 /* find mG and mQ */
122 if ((err = mp_read_radix(mG->x, (char *)key->dp->Gx, 16)) != CRYPT_OK) { goto error; }
123 if ((err = mp_read_radix(mG->y, (char *)key->dp->Gy, 16)) != CRYPT_OK) { goto error; }
124 if ((err = mp_set(mG->z, 1)) != CRYPT_OK) { goto error; }
125
111 if ((err = mp_copy(key->dp.base.x, mG->x)) != CRYPT_OK) { goto error; }
112 if ((err = mp_copy(key->dp.base.y, mG->y)) != CRYPT_OK) { goto error; }
113 if ((err = mp_copy(key->dp.base.z, mG->z)) != CRYPT_OK) { goto error; }
126114 if ((err = mp_copy(key->pubkey.x, mQ->x)) != CRYPT_OK) { goto error; }
127115 if ((err = mp_copy(key->pubkey.y, mQ->y)) != CRYPT_OK) { goto error; }
128116 if ((err = mp_copy(key->pubkey.z, mQ->z)) != CRYPT_OK) { goto error; }
117
118 /* find the montgomery mp */
119 if ((err = mp_montgomery_setup(m, &mp)) != CRYPT_OK) { goto error; }
120
121 /* for curves with a == -3 keep ma == NULL */
122 if (mp_cmp(a_plus3, m) != LTC_MP_EQ) {
123 if ((err = mp_init_multi(&mu, &ma, NULL)) != CRYPT_OK) { goto error; }
124 if ((err = mp_montgomery_normalization(mu, m)) != CRYPT_OK) { goto error; }
125 if ((err = mp_mulmod(a, mu, m, ma)) != CRYPT_OK) { goto error; }
126 }
129127
130128 /* compute u1*mG + u2*mQ = mG */
131129 if (ltc_mp.ecc_mul2add == NULL) {
132130 if ((err = ltc_mp.ecc_ptmul(u1, mG, mG, a, m, 0)) != CRYPT_OK) { goto error; }
133131 if ((err = ltc_mp.ecc_ptmul(u2, mQ, mQ, a, m, 0)) != CRYPT_OK) { goto error; }
134132
135 /* find the montgomery mp */
136 if ((err = mp_montgomery_setup(m, &mp)) != CRYPT_OK) { goto error; }
137 if ((err = mp_montgomery_normalization(mu, m)) != CRYPT_OK) { goto error; }
138 if ((err = mp_mulmod(a, mu, m, ma)) != CRYPT_OK) { goto error; }
139
140133 /* add them */
141134 if ((err = ltc_mp.ecc_ptadd(mQ, mG, mG, ma, m, mp)) != CRYPT_OK) { goto error; }
142135
144137 if ((err = ltc_mp.ecc_map(mG, m, mp)) != CRYPT_OK) { goto error; }
145138 } else {
146139 /* use Shamir's trick to compute u1*mG + u2*mQ using half of the doubles */
147 if ((err = ltc_mp.ecc_mul2add(mG, u1, mQ, u2, mG, a, m)) != CRYPT_OK) { goto error; }
140 if ((err = ltc_mp.ecc_mul2add(mG, u1, mQ, u2, mG, ma, m)) != CRYPT_OK) { goto error; }
148141 }
149142
150143 /* v = X_x1 mod n */
158151 /* clear up and return */
159152 err = CRYPT_OK;
160153 error:
161 ltc_ecc_del_point(mG);
162 ltc_ecc_del_point(mQ);
163 mp_clear_multi(r, s, v, w, u1, u2, p, e, m, a, mu, ma, NULL);
154 if (mG != NULL) ltc_ecc_del_point(mG);
155 if (mQ != NULL) ltc_ecc_del_point(mQ);
156 if (mu != NULL) mp_clear(mu);
157 if (ma != NULL) mp_clear(ma);
158 mp_clear_multi(r, s, v, w, u1, u2, e, a_plus3, NULL);
164159 if (mp != NULL) {
165160 mp_montgomery_free(mp);
166161 }
181176 const unsigned char *hash, unsigned long hashlen,
182177 int *stat, ecc_key *key)
183178 {
184 return ecc_verify_hash_ex(sig, siglen, hash, hashlen, stat, key, 0);
179 return _ecc_verify_hash(sig, siglen, hash, hashlen, stat, key, 0);
185180 }
186181
187182 /**
198193 const unsigned char *hash, unsigned long hashlen,
199194 int *stat, ecc_key *key)
200195 {
201 return ecc_verify_hash_ex(sig, siglen, hash, hashlen, stat, key, 1);
196 return _ecc_verify_hash(sig, siglen, hash, hashlen, stat, key, 1);
202197 }
203198
204199 #endif
200
201 /* ref: $Format:%D$ */
202 /* git commit: $Format:%H$ */
203 /* commit time: $Format:%ai$ */
+0
-77
src/ltc/pk/ecc/ecc_verify_key.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
12 */
13
14 #include "tomcrypt.h"
15
16 /* origin of this code - OLPC */
17
18 #ifdef LTC_MECC
19
20 /**
21 Verify a key according to ANSI spec
22 @param key The key to validate
23 @return CRYPT_OK if successful
24 */
25
26 int ecc_verify_key(ecc_key *key)
27 {
28 int err;
29 void *prime = NULL;
30 void *order = NULL;
31 void *a = NULL;
32 ecc_point *point;
33
34 if (mp_init_multi(&order, &prime, NULL) != CRYPT_OK) {
35 return CRYPT_MEM;
36 }
37
38 /* Test 1: Are the x amd y points of the public key in the field? */
39 if ((err = ltc_mp.read_radix(prime, key->dp->prime, 16)) != CRYPT_OK) { goto done2; }
40
41 if (ltc_mp.compare_d(key->pubkey.z, 1) == LTC_MP_EQ) {
42 if ((ltc_mp.compare(key->pubkey.x, prime) != LTC_MP_LT) ||
43 (ltc_mp.compare(key->pubkey.y, prime) != LTC_MP_LT) ||
44 (ltc_mp.compare_d(key->pubkey.x, 0) != LTC_MP_GT) ||
45 (ltc_mp.compare_d(key->pubkey.y, 0) != LTC_MP_GT)
46 )
47 {
48 err = CRYPT_INVALID_PACKET;
49 goto done2;
50 }
51 }
52
53 /* Test 2: is the public key on the curve? */
54 if ((err = ltc_ecc_is_point(key->dp, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) { goto done2; }
55
56 /* Test 3: does nG = O? (n = order, O = point at infinity, G = public key) */
57 point = ltc_ecc_new_point();
58 if ((err = ltc_mp.read_radix(order, key->dp->order, 16)) != CRYPT_OK) { goto done1; }
59 if ((err = ltc_mp.read_radix(a, key->dp->A, 16)) != CRYPT_OK) { goto done1; }
60 if ((err = ltc_ecc_mulmod(order, &(key->pubkey), point, a, prime, 1)) != CRYPT_OK) { goto done1; }
61
62 if (ltc_ecc_is_point_at_infinity(point, prime)) {
63 err = CRYPT_ERROR;
64 }
65 else {
66 err = CRYPT_OK;
67 }
68
69 done1:
70 ltc_ecc_del_point(point);
71 done2:
72 mp_clear_multi(prime, order, NULL);
73 return err;
74 }
75
76 #endif
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
127 */
138
149 #include "tomcrypt.h"
6156 }
6257
6358 #endif
59
60 /* ref: $Format:%D$ */
61 /* git commit: $Format:%H$ */
62 /* commit time: $Format:%ai$ */
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
11 *
127 */
138
149 #include "tomcrypt.h"
6964 }
7065
7166 #endif
67
68 /* ref: $Format:%D$ */
69 /* git commit: $Format:%H$ */
70 /* commit time: $Format:%ai$ */
44 *
55 * The library is free for all purposes without any express
66 * guarantee it works.
7 *
8 */
9
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
117 */
128
139 #include "tomcrypt.h"
2117 @return CRYPT_OK if valid
2218 */
2319
24 int ltc_ecc_is_point(const ltc_ecc_set_type *dp, void *x, void *y)
20 int ltc_ecc_is_point(const ltc_ecc_dp *dp, void *x, void *y)
2521 {
2622 void *prime, *a, *b, *t1, *t2;
2723 int err;
2824
29 if ((err = mp_init_multi(&prime, &a, &b, &t1, &t2, NULL)) != CRYPT_OK) {
30 return err;
31 }
25 prime = dp->prime;
26 b = dp->B;
27 a = dp->A;
3228
33 /* load prime, a and b */
34 if ((err = mp_read_radix(prime, dp->prime, 16)) != CRYPT_OK) goto cleanup;
35 if ((err = mp_read_radix(b, dp->B, 16)) != CRYPT_OK) goto cleanup;
36 if ((err = mp_read_radix(a, dp->A, 16)) != CRYPT_OK) goto cleanup;
29 if ((err = mp_init_multi(&t1, &t2, NULL)) != CRYPT_OK) return err;
3730
3831 /* compute y^2 */
39 if ((err = mp_sqr(y, t1)) != CRYPT_OK) goto cleanup;
32 if ((err = mp_sqr(y, t1)) != CRYPT_OK) goto cleanup;
4033
4134 /* compute x^3 */
42 if ((err = mp_sqr(x, t2)) != CRYPT_OK) goto cleanup;
43 if ((err = mp_mod(t2, prime, t2)) != CRYPT_OK) goto cleanup;
44 if ((err = mp_mul(x, t2, t2)) != CRYPT_OK) goto cleanup;
35 if ((err = mp_sqr(x, t2)) != CRYPT_OK) goto cleanup;
36 if ((err = mp_mod(t2, prime, t2)) != CRYPT_OK) goto cleanup;
37 if ((err = mp_mul(x, t2, t2)) != CRYPT_OK) goto cleanup;
4538
4639 /* compute y^2 - x^3 */
47 if ((err = mp_sub(t1, t2, t1)) != CRYPT_OK) goto cleanup;
40 if ((err = mp_sub(t1, t2, t1)) != CRYPT_OK) goto cleanup;
4841
4942 /* compute y^2 - x^3 - a*x */
50 if ((err = mp_submod(prime, a, prime, t2)) != CRYPT_OK) goto cleanup;
51 if ((err = mp_mulmod(t2, x, prime, t2)) != CRYPT_OK) goto cleanup;
52 if ((err = mp_addmod(t1, t2, prime, t1)) != CRYPT_OK) goto cleanup;
43 if ((err = mp_submod(prime, a, prime, t2)) != CRYPT_OK) goto cleanup;
44 if ((err = mp_mulmod(t2, x, prime, t2)) != CRYPT_OK) goto cleanup;
45 if ((err = mp_addmod(t1, t2, prime, t1)) != CRYPT_OK) goto cleanup;
5346
5447 /* adjust range (0, prime) */
5548 while (mp_cmp_d(t1, 0) == LTC_MP_LT) {
56 if ((err = mp_add(t1, prime, t1)) != CRYPT_OK) goto cleanup;
49 if ((err = mp_add(t1, prime, t1)) != CRYPT_OK) goto cleanup;
5750 }
5851 while (mp_cmp(t1, prime) != LTC_MP_LT) {
59 if ((err = mp_sub(t1, prime, t1)) != CRYPT_OK) goto cleanup;
52 if ((err = mp_sub(t1, prime, t1)) != CRYPT_OK) goto cleanup;
6053 }
6154
6255 /* compare to b */
6760 }
6861
6962 cleanup:
70 mp_clear_multi(prime, a, b, t1, t2, NULL);
63 mp_clear_multi(t1, t2, NULL);
7164 return err;
7265 }
7366
7467 #endif
68
69 /* ref: $Format:%D$ */
70 /* git commit: $Format:%H$ */
71 /* commit time: $Format:%ai$ */
1414 * a point at infinity is any point (x,y,0) such that y^2 == x^3, except (0,0,0)
1515 */
1616
17 int ltc_ecc_is_point_at_infinity(ecc_point *P, void *modulus)
17 int ltc_ecc_is_point_at_infinity(const ecc_point *P, void *modulus)
1818 {
1919 int err, retval = 0;
2020 void *x3, *y2;
4545 }
4646
4747 #endif
48
49 /* ref: $Format:%D$ */
50 /* git commit: $Format:%H$ */
51 /* commit time: $Format:%ai$ */
+0
-42
src/ltc/pk/ecc/ltc_ecc_is_valid_idx.c less more
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
12 #include "tomcrypt.h"
13
14 /**
15 @file ltc_ecc_is_valid_idx.c
16 ECC Crypto, Tom St Denis
17 */
18
19 #ifdef LTC_MECC
20
21 /** Returns whether an ECC idx is valid or not
22 @param n The idx number to check
23 @return 1 if valid, 0 if not
24 */
25 int ltc_ecc_is_valid_idx(int n)
26 {
27 int x;
28
29 for (x = 0; ltc_ecc_sets[x].size != 0; x++);
30 /* -1 is a valid index --- indicating that the domain params were supplied by the user */
31 if ((n >= -1) && (n < x)) {
32 return 1;
33 }
34 return 0;
35 }
36
37 #endif
38 /* ref: $Format:%D$ */
39 /* git commit: $Format:%H$ */
40 /* commit time: $Format:%ai$ */
41
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
4239 }
4340
4441 if ((err = mp_init_multi(&t1, &t2, NULL)) != CRYPT_OK) {
45 return CRYPT_MEM;
42 return err;
4643 }
4744
4845 /* first map z back to normal */
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2522 @param kA What to multiple A by
2623 @param B Second point to multiply
2724 @param kB What to multiple B by
28 @param C [out] Destination point (can overlap with A or B
25 @param C [out] Destination point (can overlap with A or B)
26 @param ma ECC curve parameter a in montgomery form
2927 @param modulus Modulus for curve
3028 @return CRYPT_OK on success
3129 */
32 int ltc_ecc_mul2add(ecc_point *A, void *kA,
33 ecc_point *B, void *kB,
34 ecc_point *C,
35 void *a,
36 void *modulus)
30 int ltc_ecc_mul2add(const ecc_point *A, void *kA,
31 const ecc_point *B, void *kB,
32 ecc_point *C,
33 void *ma,
34 void *modulus)
3735 {
3836 ecc_point *precomp[16];
3937 unsigned bitbufA, bitbufB, lenA, lenB, len, nA, nB, nibble;
4038 unsigned x, y;
4139 unsigned char *tA, *tB;
4240 int err, first;
43 void *mp, *mu, *ma;
41 void *mp, *mu;
4442
4543 /* argchks */
4644 LTC_ARGCHK(A != NULL);
9492 if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) {
9593 goto ERR_P;
9694 }
97 if ((err = mp_init_multi(&mu, &ma, NULL)) != CRYPT_OK) {
95 if ((err = mp_init(&mu)) != CRYPT_OK) {
9896 goto ERR_MP;
9997 }
10098 if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) {
101 goto ERR_MU;
102 }
103 if ((err = mp_mulmod(a, mu, modulus, ma)) != CRYPT_OK) {
10499 goto ERR_MU;
105100 }
106101
182177
183178 /* clean up */
184179 ERR_MU:
185 mp_clear_multi(mu, ma, NULL);
180 mp_clear(mu);
186181 ERR_MP:
187182 mp_montgomery_free(mp);
188183 ERR_P:
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
3128 @param map Boolean whether to map back to affine or not (1==map, 0 == leave in projective)
3229 @return CRYPT_OK on success
3330 */
34 int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *a, void *modulus, int map)
31 int ltc_ecc_mulmod(void *k, const ecc_point *G, ecc_point *R, void *a, void *modulus, int map)
3532 {
3633 ecc_point *tG, *M[8];
3734 int i, j, err;
38 void *mu, *mp, *ma;
35 void *mp = NULL, *mu = NULL, *ma = NULL, *a_plus3 = NULL;
3936 ltc_mp_digit buf;
4037 int first, bitbuf, bitcpy, bitcnt, mode, digidx;
4138
5350 }
5451
5552 /* init montgomery reduction */
56 if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) {
57 return err;
58 }
59 if ((err = mp_init_multi(&mu, &ma, NULL)) != CRYPT_OK) {
60 mp_montgomery_free(mp);
61 return err;
62 }
63 if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) {
64 mp_montgomery_free(mp);
65 mp_clear_multi(mu, ma, NULL);
66 return err;
67 }
68 if ((err = mp_mulmod(a, mu, modulus, ma)) != CRYPT_OK) {
69 mp_montgomery_free(mp);
70 mp_clear_multi(mu, ma, NULL);
71 return err;
53 if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto error; }
54 if ((err = mp_init(&mu)) != CRYPT_OK) { goto error; }
55 if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) { goto error; }
56
57 /* for curves with a == -3 keep ma == NULL */
58 if ((err = mp_init(&a_plus3)) != CRYPT_OK) { goto error; }
59 if ((err = mp_add_d(a, 3, a_plus3)) != CRYPT_OK) { goto error; }
60 if (mp_cmp(a_plus3, modulus) != LTC_MP_EQ) {
61 if ((err = mp_init(&ma)) != CRYPT_OK) { goto error; }
62 if ((err = mp_mulmod(a, mu, modulus, ma)) != CRYPT_OK) { goto error; }
7263 }
7364
7465 /* alloc ram for window temps */
7869 for (j = 0; j < i; j++) {
7970 ltc_ecc_del_point(M[j]);
8071 }
81 mp_montgomery_free(mp);
82 mp_clear_multi(mu, ma, NULL);
83 return CRYPT_MEM;
72 err = CRYPT_MEM;
73 goto error;
8474 }
8575 }
8676
208198 err = CRYPT_OK;
209199 }
210200 done:
211 if (mu != NULL) {
212 mp_clear(mu);
213 }
214 mp_clear(ma);
215 mp_montgomery_free(mp);
216201 ltc_ecc_del_point(tG);
217202 for (i = 0; i < 8; i++) {
218203 ltc_ecc_del_point(M[i]);
219204 }
205 error:
206 if (ma != NULL) mp_clear(ma);
207 if (a_plus3 != NULL) mp_clear(a_plus3);
208 if (mu != NULL) mp_clear(mu);
209 if (mp != NULL) mp_montgomery_free(mp);
220210 return err;
221211 }
222212
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
3027 @param map Boolean whether to map back to affine or not (1==map, 0 == leave in projective)
3128 @return CRYPT_OK on success
3229 */
33 int ltc_ecc_mulmod(void *k, ecc_point *G, ecc_point *R, void *a, void *modulus, int map)
30 int ltc_ecc_mulmod(void *k, const ecc_point *G, ecc_point *R, void *a, void *modulus, int map)
3431 {
3532 ecc_point *tG, *M[3];
3633 int i, j, err;
37 void *mu, *mp, *ma;
34 void *mp = NULL, *mu = NULL, *ma = NULL, *a_plus3 = NULL;
3835 ltc_mp_digit buf;
3936 int bitcnt, mode, digidx;
4037
5249 }
5350
5451 /* init montgomery reduction */
55 if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) {
56 return err;
57 }
58 if ((err = mp_init_multi(&mu, &ma, NULL)) != CRYPT_OK) {
59 mp_montgomery_free(mp);
60 return err;
61 }
62 if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) {
63 mp_clear(mu);
64 mp_montgomery_free(mp);
65 return err;
66 }
67 if ((err = mp_mulmod(a, mu, modulus, ma)) != CRYPT_OK) {
68 mp_montgomery_free(mp);
69 mp_clear_multi(mu, ma, NULL);
70 return err;
52 if ((err = mp_montgomery_setup(modulus, &mp)) != CRYPT_OK) { goto error; }
53 if ((err = mp_init(&mu)) != CRYPT_OK) { goto error; }
54 if ((err = mp_montgomery_normalization(mu, modulus)) != CRYPT_OK) { goto error; }
55
56 /* for curves with a == -3 keep ma == NULL */
57 if ((err = mp_init(&a_plus3)) != CRYPT_OK) { goto error; }
58 if ((err = mp_add_d(a, 3, a_plus3)) != CRYPT_OK) { goto error; }
59 if (mp_cmp(a_plus3, modulus) != LTC_MP_EQ) {
60 if ((err = mp_init(&ma)) != CRYPT_OK) { goto error; }
61 if ((err = mp_mulmod(a, mu, modulus, ma)) != CRYPT_OK) { goto error; }
7162 }
7263
7364 /* alloc ram for window temps */
155146 err = CRYPT_OK;
156147 }
157148 done:
158 if (mu != NULL) {
159 mp_clear(mu);
160 }
161 mp_clear(ma);
162 mp_montgomery_free(mp);
163149 ltc_ecc_del_point(tG);
164150 for (i = 0; i < 3; i++) {
165151 ltc_ecc_del_point(M[i]);
166152 }
153 error:
154 if (ma != NULL) mp_clear(ma);
155 if (a_plus3 != NULL) mp_clear(a_plus3);
156 if (mu != NULL) mp_clear(mu);
157 if (mp != NULL) mp_montgomery_free(mp);
167158 return err;
168159 }
169160
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /**
2320 @param P The point to add
2421 @param Q The point to add
2522 @param R [out] The destination of the double
26 @param ma ECC curve parameter a in montgomery form (if NULL we assume a == -3)
23 @param ma ECC curve parameter a in montgomery form
2724 @param modulus The modulus of the field the ECC curve is in
2825 @param mp The "b" value from montgomery_setup()
2926 @return CRYPT_OK on success
3027 */
31 int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *ma, void *modulus, void *mp)
28 int ltc_ecc_projective_add_point(const ecc_point *P, const ecc_point *Q, ecc_point *R, void *ma, void *modulus, void *mp)
3229 {
3330 void *t1, *t2, *x, *y, *z;
3431 int err;
66 * guarantee it works.
77 */
88
9 /* Implements ECC over Z/pZ for curve y^2 = x^3 + a*x + b
10 *
11 */
129 #include "tomcrypt.h"
1310
1411 /* ### Point doubling in Jacobian coordinate system ###
4037 Double an ECC point
4138 @param P The point to double
4239 @param R [out] The destination of the double
43 @param ma ECC curve parameter a in montgomery form (if NULL we assume a == -3)
40 @param ma ECC curve parameter a in montgomery form
4441 @param modulus The modulus of the field the ECC curve is in
4542 @param mp The "b" value from montgomery_setup()
4643 @return CRYPT_OK on success
4744 */
48 int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *ma, void *modulus, void *mp)
45 int ltc_ecc_projective_dbl_point(const ecc_point *P, ecc_point *R, void *ma, void *modulus, void *mp)
4946 {
5047 void *t1, *t2;
5148 int err;
8582 if ((err = mp_sub(R->z, modulus, R->z)) != CRYPT_OK) { goto done; }
8683 }
8784
88 if (ma == NULL) { /* special case for ma == -3 (slightly faster than general case) */
85 if (ma == NULL) { /* special case for curves with a == -3 (10% faster than general case) */
8986 /* T2 = X - T1 */
9087 if ((err = mp_sub(R->x, t1, t2)) != CRYPT_OK) { goto done; }
9188 if (mp_cmp_d(t2, 0) == LTC_MP_LT) {
187184
188185 err = CRYPT_OK;
189186 done:
190 mp_clear_multi(t1, t2, NULL);
187 mp_clear_multi(t2, t1, NULL);
191188 return err;
192189 }
193190 #endif
0 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
1 *
2 * LibTomCrypt is a library that provides various cryptographic
3 * algorithms in a highly modular and flexible manner.
4 *
5 * The library is free for all purposes without any express
6 * guarantee it works.
7 */
8
9 #include "tomcrypt.h"
10
11 /* origin of this code - OLPC */
12
13 #ifdef LTC_MECC
14
15 /**
16 Verify a key according to ANSI spec
17 @param key The key to validate
18 @return CRYPT_OK if successful
19 */
20
21 int ltc_ecc_verify_key(ecc_key *key)
22 {
23 int err;
24 void *prime = NULL;
25 void *order = NULL;
26 void *a = NULL;
27 ecc_point *point;
28
29 prime = key->dp.prime;
30 order = key->dp.order;
31 a = key->dp.A;
32
33 /* Test 1: Are the x and y points of the public key in the field? */
34 if (ltc_mp.compare_d(key->pubkey.z, 1) == LTC_MP_EQ) {
35 if ((ltc_mp.compare(key->pubkey.x, prime) != LTC_MP_LT) ||
36 (ltc_mp.compare(key->pubkey.y, prime) != LTC_MP_LT) ||
37 (ltc_mp.compare_d(key->pubkey.x, 0) == LTC_MP_LT) ||
38 (ltc_mp.compare_d(key->pubkey.y, 0) == LTC_MP_LT) ||
39 (mp_iszero(key->pubkey.x) && mp_iszero(key->pubkey.y))
40 )
41 {
42 err = CRYPT_INVALID_PACKET;
43 goto done2;
44 }
45 }
46
47 /* Test 2: is the public key on the curve? */
48 if ((err = ltc_ecc_is_point(&key->dp, key->pubkey.x, key->pubkey.y)) != CRYPT_OK) { goto done2; }
49
50 /* Test 3: does nG = O? (n = order, O = point at infinity, G = public key) */
51 point = ltc_ecc_new_point();
52 if ((err = ltc_ecc_mulmod(order, &(key->pubkey), point, a, prime, 1)) != CRYPT_OK) { goto done1; }
53
54 if (ltc_ecc_is_point_at_infinity(point, prime)) {
55 err = CRYPT_ERROR;
56 }
57 else {
58 err = CRYPT_OK;
59 }
60
61 done1:
62 ltc_ecc_del_point(point);
63 done2:
64 return err;
65 }
66
67 #endif
68
69 /* ref: $Format:%D$ */
70 /* git commit: $Format:%H$ */
71 /* commit time: $Format:%ai$ */
7878 goto finish;
7979 }
8080
81 err = der_encode_subject_public_key_info(out, outlen,
81 err = x509_encode_subject_public_key_info(out, outlen,
8282 PKA_RSA, tmp, tmplen, LTC_ASN1_NULL, NULL, 0);
8383
8484 finish:
2626 int err;
2727 void *zero;
2828 unsigned char *tmpbuf=NULL;
29 unsigned long tmpbuf_len;
29 unsigned long tmpbuf_len, len;
3030
3131 LTC_ARGCHK(in != NULL);
3232 LTC_ARGCHK(key != NULL);
4646 goto LBL_ERR;
4747 }
4848
49 err = der_decode_subject_public_key_info(in, inlen,
49 len = 0;
50 err = x509_decode_subject_public_key_info(in, inlen,
5051 PKA_RSA, tmpbuf, &tmpbuf_len,
51 LTC_ASN1_NULL, NULL, 0);
52 LTC_ASN1_NULL, NULL, &len);
5253
5354 if (err == CRYPT_OK) { /* SubjectPublicKeyInfo format */
5455
2525 {
2626 int err;
2727 unsigned char *tmpbuf;
28 unsigned long tmpbuf_len, tmp_inlen;
28 unsigned long tmpbuf_len, tmp_inlen, len;
2929 ltc_asn1_list *decoded_list = NULL, *l;
3030
3131 LTC_ARGCHK(in != NULL);
7676 l->child->type == LTC_ASN1_SEQUENCE && l->child->child &&
7777 l->child->child->type == LTC_ASN1_OBJECT_IDENTIFIER && l->child->next &&
7878 l->child->next->type == LTC_ASN1_BIT_STRING) {
79 err = der_decode_subject_public_key_info(l->data, l->size,
79 len = 0;
80 err = x509_decode_subject_public_key_info(l->data, l->size,
8081 PKA_RSA, tmpbuf, &tmpbuf_len,
81 LTC_ASN1_NULL, NULL, 0);
82 LTC_ASN1_NULL, NULL, &len);
8283 if (err == CRYPT_OK) {
8384 /* now it should be SEQUENCE { INTEGER, INTEGER } */
8485 if ((err = der_decode_sequence_multi(tmpbuf, tmpbuf_len,
141141 LTC_SET_ASN1(siginfo, 0, LTC_ASN1_SEQUENCE, digestinfo, 2);
142142 LTC_SET_ASN1(siginfo, 1, LTC_ASN1_OCTET_STRING, tmpbuf, siglen);
143143
144 if ((err = der_decode_sequence(out, outlen, siginfo, 2)) != CRYPT_OK) {
144 if ((err = der_decode_sequence_strict(out, outlen, siginfo, 2)) != CRYPT_OK) {
145145 /* fallback to Legacy:missing NULL */
146146 LTC_SET_ASN1(siginfo, 0, LTC_ASN1_SEQUENCE, digestinfo, 1);
147 if ((err = der_decode_sequence(out, outlen, siginfo, 2)) != CRYPT_OK) {
147 if ((err = der_decode_sequence_strict(out, outlen, siginfo, 2)) != CRYPT_OK) {
148148 XFREE(out);
149149 goto bail_2;
150150 }
6767 use Crypt::Digest::SHA3_256;
6868 use Crypt::Digest::SHA3_384;
6969 use Crypt::Digest::SHA3_512;
70 use Crypt::Digest::Keccak224;
71 use Crypt::Digest::Keccak256;
72 use Crypt::Digest::Keccak384;
73 use Crypt::Digest::Keccak512;
7074 use Crypt::Digest::SHA512;
7175 use Crypt::Digest::SHA512_224;
7276 use Crypt::Digest::SHA512_256;
3030 $m =~ s|[\\/]|::|g;
3131 $m =~ s|^lib::||;
3232 $m =~ s|\.pm$||;
33 push @err, "ERROR: '$m' is missing in CryptX.pm" unless $cryptx =~ /L<$m>/s || $m =~ /^(CryptX|Math::BigInt::LTM|Crypt::(PK|Mode|Mac|AuthEnc))$/;
33 push @err, "ERROR: '$m' is missing in CryptX.pm" unless $cryptx =~ /L<$m>/s || $m =~ /^(CryptX|Math::BigInt::LTM|Crypt::(PK|Mode|Mac|AuthEnc|Checksum))$/;
3434 push @err, "ERROR: '$m' is missing in 001_compile.t" unless $compile_t =~ /\nuse $m;/s;
3535 eval "use $m; 1;" or push @err, "ERROR: 'use $m' failed";
3636 }
55 plan skip_all => "set TEST_POD to enable this test (developer only!)" unless $ENV{TEST_POD};
66 plan skip_all => "File::Find not installed" unless eval { require File::Find };
77 plan skip_all => "Test::Pod not installed" unless eval { require Test::Pod };
8 plan tests => 103;
8 plan tests => 107;
99
1010 my @files;
1111 File::Find::find({ wanted=>sub { push @files, $_ if /\.pm$/ }, no_chdir=>1 }, 'lib');
1616 params paramshash irand perl endian zbase bumac bmac budigest bdigest md de
1717 blakes_ blakeb_
1818 XOR'ing XOR'ed
19 keccak
1920 )]
2021 },
2122 );
2223
23 plan tests => 103;
24 plan tests => 107;
2425
2526 my @files;
2627 File::Find::find({ wanted=>sub { push @files, $_ if /\.pm$/ }, no_chdir=>1 }, 'lib');
55 plan skip_all => "set TEST_POD to enable this test (developer only!)" unless $ENV{TEST_POD};
66 plan skip_all => "Pod::Coverage not installed" unless eval { require Pod::Coverage };
77 plan skip_all => "File::Find not installed" unless eval { require File::Find };
8 plan tests => 103;
8 plan tests => 107;
99
1010 my @files;
1111 File::Find::find({ wanted=>sub { push @files, $_ if /\.pm$/ }, no_chdir=>1 }, 'lib');
2727 elsif ($m eq 'Crypt::Mode') {
2828 $pc = Pod::Coverage->new(package => $m, pod_from => $f, trustme => [qr/^(add|decrypt|encrypt|finish|new|start_decrypt|start_encrypt)$/] );
2929 }
30 elsif ($m eq 'Crypt::Checksum') {
31 $pc = Pod::Coverage->new(package => $m, pod_from => $f, trustme => [qr/^(addfile|(adler32_|crc32_)(file_hex|file_int|file|data_hex|data_int|data))$/] );
32 }
3033 elsif ($m eq 'Crypt::Mac') {
3134 $pc = Pod::Coverage->new(package => $m, pod_from => $f, trustme => [qr/^(add|addfile)$/] );
35 }
36 elsif ($m =~ /^Crypt::Mode::(CTR|CFB|OFB)$/) {
37 $pc = Pod::Coverage->new(package => $m, pod_from => $f, trustme => [qr/^(finish)$/] );
3238 }
3339 elsif ($m eq 'Crypt::AuthEnc::OCB') {
3440 $pc = Pod::Coverage->new(package => $m, pod_from => $f, trustme => [qr/^(blocksize|aad_add)$/] );
00 use strict;
11 use warnings;
22
3 use Test::More tests => 12;
3 use Test::More tests => 13;
44
55 use Crypt::AuthEnc::CCM qw( ccm_encrypt_authenticate ccm_decrypt_verify );
66
4444 }
4545
4646 {
47 my ($ct, $tag) = ccm_encrypt_authenticate('AES', $key, $nonce, "", 16, "plain_halfplain_half");
47 my ($ct, $tag) = ccm_encrypt_authenticate('AES', $key, $nonce, "", 16, "plain_halfplain_half");
48 my ($ct2, $tag2) = ccm_encrypt_authenticate('AES', $key, $nonce, undef, 16, "plain_halfplain_half");
49 ok($ct eq $ct2 && $tag eq $tag2, "header '' vs. undef");
4850 is(unpack('H*', $ct), "96b0114ff47da72e92631aadce84f203a8168b20", "ccm_encrypt_authenticate: ciphertext (no header)");
4951 is(unpack('H*', $tag), "9e9cba5dd4939d0d8e2687c85c5d3b89", "ccm_encrypt_authenticate: tag (no header)");
5052 my $pt = ccm_decrypt_verify('AES', $key, $nonce, "", $ct, $tag);
00 use strict;
11 use warnings;
22
3 use Test::More tests => 24;
3 use Test::More tests => 56;
44
5 use Crypt::Checksum ':all';
6 use Crypt::Checksum::Adler32;
7 use Crypt::Checksum::CRC32;
5 use Crypt::Checksum::Adler32 ':all';
6 use Crypt::Checksum::CRC32 ':all';
87
9 my $a32 = Crypt::Checksum::Adler32->new;
10 is($a32->hexdigest, "00000001");
11 is($a32->hexdigest, "00000001");
12 $a32->add("a");
13 is($a32->hexdigest, "00620062");
14 $a32->reset;
15 is($a32->hexdigest, "00000001");
16 $a32->add("abc");
17 is($a32->hexdigest, "024d0127");
18 $a32->reset;
19 $a32->add("abc");
20 $a32->add("abc");
21 is($a32->hexdigest, "080c024d");
22 $a32->reset;
23 $a32->add("abcabc");
24 is($a32->hexdigest, "080c024d");
25 $a32->reset;
26 $a32->add("\xFF" x 32);
27 is($a32->hexdigest, "0e2e1fe1");
28 is(adler32_data_hex("a"), "00620062");
29 is(adler32_data("a"), pack("H*","00620062"));
8 {
9 my $a32 = Crypt::Checksum::Adler32->new;
10 is($a32->hexdigest, "00000001");
11 $a32->add("a");
12 is($a32->hexdigest, "00620062");
13 $a32->reset;
14 is($a32->hexdigest, "00000001");
15 $a32->add("abc");
16 is($a32->hexdigest, "024d0127");
17 $a32->reset;
18 $a32->add("abc");
19 $a32->add("abc");
20 is($a32->hexdigest, "080c024d");
21 $a32->reset;
22 $a32->add("abc", "abc");
23 is($a32->hexdigest, "080c024d");
24 $a32->reset;
25 $a32->add("abcabc");
26 is($a32->hexdigest, "080c024d");
27 $a32->reset;
28 $a32->add("\xFF" x 32);
29 is($a32->hexdigest, "0e2e1fe1");
30 is($a32->intdigest, 237903841);
31 is($a32->digest, pack("H*", "0e2e1fe1"));
3032
31 is(crc32_data_hex("a"), "e8b7be43");
32 is(crc32_data_hex("libtomcrypt"), "b37376ef");
33 is(crc32_data_hex("This is the test string"), "6d680973");
34 is(crc32_data_int("This is the test string"), 1835534707);
35 is(crc32_data_hex("This is another test string"), "806e15e9");
36 is(crc32_data_int("This is another test string"), 2154698217);
33 is(adler32_data_hex("aaa"), "02490124");
34 is(adler32_data_int("aaa"), 38338852);
35 is(adler32_data("aaa"), pack("H*","02490124"));
36 is(adler32_data_hex("a","a","a"), "02490124");
37 is(adler32_data_int("a","a","a"), 38338852);
38 is(adler32_data("a","a","a"), pack("H*","02490124"));
3739
38 is(crc32_file_hex("t/data/binary-test.file"), "24111fed");
39 is(crc32_file_hex("t/data/text-CR.file"), "1ca430c6");
40 is(crc32_file_hex("t/data/text-CRLF.file"), "4d434dfb");
41 is(crc32_file_hex("t/data/text-LF.file"), "9f9b8258");
40 is(adler32_data_hex("libtomcrypt"), "1be804ba");
41 is(adler32_data_hex("This is the test string"), "6363088d");
42 is(adler32_data_int("This is the test string"), 1667434637);
43 is(adler32_data_hex("This is another test string"), "8b900a3d");
44 is(adler32_data_int("This is another test string"), 2341472829);
4245
43 is(adler32_file_hex("t/data/binary-test.file"), "f35fb68a");
44 is(adler32_file_hex("t/data/text-CR.file"), "948e2644");
45 is(adler32_file_hex("t/data/text-CRLF.file"), "3f0e2702");
46 is(adler32_file_hex("t/data/text-LF.file"), "86ba260b");
46 is(adler32_file("t/data/binary-test.file"), pack("H*", "f35fb68a"));
47 is(adler32_file_int("t/data/binary-test.file"), 4083136138);
48 is(adler32_file_hex("t/data/binary-test.file"), "f35fb68a");
49 is(Crypt::Checksum::Adler32->new->addfile("t/data/binary-test.file")->hexdigest, "f35fb68a");
50
51 is(adler32_file_hex("t/data/text-CR.file"), "948e2644");
52 is(adler32_file_hex("t/data/text-CRLF.file"), "3f0e2702");
53 is(adler32_file_hex("t/data/text-LF.file"), "86ba260b");
54 }
55
56 {
57 my $a32 = Crypt::Checksum::CRC32->new;
58 is($a32->hexdigest, "00000000");
59 $a32->add("a");
60 is($a32->hexdigest, "e8b7be43");
61 $a32->reset;
62 is($a32->hexdigest, "00000000");
63 $a32->add("abc");
64 is($a32->hexdigest, "352441c2");
65 $a32->reset;
66 $a32->add("abc");
67 $a32->add("abc");
68 is($a32->hexdigest, "726e994c");
69 $a32->reset;
70 $a32->add("abc", "abc");
71 is($a32->hexdigest, "726e994c");
72 $a32->reset;
73 $a32->add("abcabc");
74 is($a32->hexdigest, "726e994c");
75 $a32->reset;
76 $a32->add("\xFF" x 32);
77 is($a32->hexdigest, "ff6cab0b");
78 is($a32->intdigest, 4285311755);
79 is($a32->digest, pack("H*", "ff6cab0b"));
80
81 is(crc32_data_hex("aaa"), "f007732d");
82 is(crc32_data_int("aaa"), 4027020077);
83 is(crc32_data("aaa"), pack("H*","f007732d"));
84 is(crc32_data_hex("a","a","a"), "f007732d");
85 is(crc32_data_int("a","a","a"), 4027020077);
86 is(crc32_data("a","a","a"), pack("H*","f007732d"));
87
88 is(crc32_data_hex("libtomcrypt"), "b37376ef");
89 is(crc32_data_hex("This is the test string"), "6d680973");
90 is(crc32_data_int("This is the test string"), 1835534707);
91 is(crc32_data_hex("This is another test string"), "806e15e9");
92 is(crc32_data_int("This is another test string"), 2154698217);
93
94 is(crc32_file("t/data/binary-test.file"), pack("H*", "24111fed"));
95 is(crc32_file_int("t/data/binary-test.file"), 605102061);
96 is(crc32_file_hex("t/data/binary-test.file"), "24111fed");
97 is(Crypt::Checksum::CRC32->new->addfile("t/data/binary-test.file")->hexdigest, "24111fed");
98
99 is(crc32_file_hex("t/data/text-CR.file"), "1ca430c6");
100 is(crc32_file_hex("t/data/text-CRLF.file"), "4d434dfb");
101 is(crc32_file_hex("t/data/text-LF.file"), "9f9b8258");
102 }
00 use strict;
11 use warnings;
2 use Test::More tests => 679;
2 use Test::More tests => 680;
33
44 use Crypt::Misc qw( encode_b64 decode_b64
55 encode_b64u decode_b64u
142142 is(unpack("H*", decode_b32z(encode_b32z($b))), $h);
143143 is(unpack("H*", decode_b32c(encode_b32c($b))), $h);
144144 }
145
146 is(decode_b58b("111OIl0"), undef, "bug: decode_b58b + invalid input");
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2b_160 qw( blake2b_160 blake2b_160_hex blake2b_160_b64 blake2b_160_b64u blake2b_160_file blake2b_160_file_hex blake2b_160_file_b64 blake2b_160_file_b64u );
1313 is( Crypt::Digest::BLAKE2b_160->hashsize, 20, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2b_160')->hashsize, 20, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2b_160->new->hashsize, 20, 'hashsize/6');
16
17 is( blake2b_160("A","A","A"), pack("H*","14517ce78b0c7e5e5b7f096f1f3c046f01c46901"), 'blake2b_160 (raw/tripple_A)');
18 is( blake2b_160_hex("A","A","A"), "14517ce78b0c7e5e5b7f096f1f3c046f01c46901", 'blake2b_160 (hex/tripple_A)');
19 is( blake2b_160_b64("A","A","A"), "FFF854sMfl5bfwlvHzwEbwHEaQE=", 'blake2b_160 (base64/tripple_A)');
20 is( blake2b_160_b64u("A","A","A"), "FFF854sMfl5bfwlvHzwEbwHEaQE", 'blake2b_160 (base64url/tripple_A)');
21 is( digest_data('BLAKE2b_160', "A","A","A"), pack("H*","14517ce78b0c7e5e5b7f096f1f3c046f01c46901"), 'blake2b_160 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2b_160', "A","A","A"), "14517ce78b0c7e5e5b7f096f1f3c046f01c46901", 'blake2b_160 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2b_160', "A","A","A"), "FFF854sMfl5bfwlvHzwEbwHEaQE=", 'blake2b_160 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2b_160', "A","A","A"), "FFF854sMfl5bfwlvHzwEbwHEaQE", 'blake2b_160 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2b_160->new->add("A","A","A")->hexdigest, "14517ce78b0c7e5e5b7f096f1f3c046f01c46901", 'blake2b_160 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2b_160->new->add("A")->add("A")->add("A")->hexdigest, "14517ce78b0c7e5e5b7f096f1f3c046f01c46901", 'blake2b_160 (OO3/tripple_A)');
1627
1728
1829 is( blake2b_160(""), pack("H*","3345524abf6bbe1809449224b5972c41790b6cf2"), 'blake2b_160 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2b_256 qw( blake2b_256 blake2b_256_hex blake2b_256_b64 blake2b_256_b64u blake2b_256_file blake2b_256_file_hex blake2b_256_file_b64 blake2b_256_file_b64u );
1313 is( Crypt::Digest::BLAKE2b_256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2b_256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2b_256->new->hashsize, 32, 'hashsize/6');
16
17 is( blake2b_256("A","A","A"), pack("H*","cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649"), 'blake2b_256 (raw/tripple_A)');
18 is( blake2b_256_hex("A","A","A"), "cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649", 'blake2b_256 (hex/tripple_A)');
19 is( blake2b_256_b64("A","A","A"), "zcQzkpZ1P5MKpFRwD9De1uHgh3LeqEmFnhfbvYXK5kk=", 'blake2b_256 (base64/tripple_A)');
20 is( blake2b_256_b64u("A","A","A"), "zcQzkpZ1P5MKpFRwD9De1uHgh3LeqEmFnhfbvYXK5kk", 'blake2b_256 (base64url/tripple_A)');
21 is( digest_data('BLAKE2b_256', "A","A","A"), pack("H*","cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649"), 'blake2b_256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2b_256', "A","A","A"), "cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649", 'blake2b_256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2b_256', "A","A","A"), "zcQzkpZ1P5MKpFRwD9De1uHgh3LeqEmFnhfbvYXK5kk=", 'blake2b_256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2b_256', "A","A","A"), "zcQzkpZ1P5MKpFRwD9De1uHgh3LeqEmFnhfbvYXK5kk", 'blake2b_256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2b_256->new->add("A","A","A")->hexdigest, "cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649", 'blake2b_256 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2b_256->new->add("A")->add("A")->add("A")->hexdigest, "cdc4339296753f930aa454700fd0ded6e1e08772dea849859e17dbbd85cae649", 'blake2b_256 (OO3/tripple_A)');
1627
1728
1829 is( blake2b_256(""), pack("H*","0e5751c026e543b2e8ab2eb06099daa1d1e5df47778f7787faab45cdf12fe3a8"), 'blake2b_256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2b_384 qw( blake2b_384 blake2b_384_hex blake2b_384_b64 blake2b_384_b64u blake2b_384_file blake2b_384_file_hex blake2b_384_file_b64 blake2b_384_file_b64u );
1313 is( Crypt::Digest::BLAKE2b_384->hashsize, 48, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2b_384')->hashsize, 48, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2b_384->new->hashsize, 48, 'hashsize/6');
16
17 is( blake2b_384("A","A","A"), pack("H*","9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685"), 'blake2b_384 (raw/tripple_A)');
18 is( blake2b_384_hex("A","A","A"), "9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685", 'blake2b_384 (hex/tripple_A)');
19 is( blake2b_384_b64("A","A","A"), "mqB9nK8Xv/SXR/yUiOtrq83NV1YW+FqRdY7lDm5JpIhL9vtGtCTgrmaQcczYyxaF", 'blake2b_384 (base64/tripple_A)');
20 is( blake2b_384_b64u("A","A","A"), "mqB9nK8Xv_SXR_yUiOtrq83NV1YW-FqRdY7lDm5JpIhL9vtGtCTgrmaQcczYyxaF", 'blake2b_384 (base64url/tripple_A)');
21 is( digest_data('BLAKE2b_384', "A","A","A"), pack("H*","9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685"), 'blake2b_384 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2b_384', "A","A","A"), "9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685", 'blake2b_384 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2b_384', "A","A","A"), "mqB9nK8Xv/SXR/yUiOtrq83NV1YW+FqRdY7lDm5JpIhL9vtGtCTgrmaQcczYyxaF", 'blake2b_384 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2b_384', "A","A","A"), "mqB9nK8Xv_SXR_yUiOtrq83NV1YW-FqRdY7lDm5JpIhL9vtGtCTgrmaQcczYyxaF", 'blake2b_384 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2b_384->new->add("A","A","A")->hexdigest, "9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685", 'blake2b_384 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2b_384->new->add("A")->add("A")->add("A")->hexdigest, "9aa07d9caf17bff49747fc9488eb6babcdcd575616f85a91758ee50e6e49a4884bf6fb46b424e0ae669071ccd8cb1685", 'blake2b_384 (OO3/tripple_A)');
1627
1728
1829 is( blake2b_384(""), pack("H*","b32811423377f52d7862286ee1a72ee540524380fda1724a6f25d7978c6fd3244a6caf0498812673c5e05ef583825100"), 'blake2b_384 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2b_512 qw( blake2b_512 blake2b_512_hex blake2b_512_b64 blake2b_512_b64u blake2b_512_file blake2b_512_file_hex blake2b_512_file_b64 blake2b_512_file_b64u );
1313 is( Crypt::Digest::BLAKE2b_512->hashsize, 64, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2b_512')->hashsize, 64, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2b_512->new->hashsize, 64, 'hashsize/6');
16
17 is( blake2b_512("A","A","A"), pack("H*","dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823"), 'blake2b_512 (raw/tripple_A)');
18 is( blake2b_512_hex("A","A","A"), "dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823", 'blake2b_512 (hex/tripple_A)');
19 is( blake2b_512_b64("A","A","A"), "3aXJKuWtugR9MX+Z3FipBZtajAkH+V2M3c9b/aqOTHTd2EvCaDzcLRajQP9XmOG/S9LIODMmEfJmu2KHDTO4Iw==", 'blake2b_512 (base64/tripple_A)');
20 is( blake2b_512_b64u("A","A","A"), "3aXJKuWtugR9MX-Z3FipBZtajAkH-V2M3c9b_aqOTHTd2EvCaDzcLRajQP9XmOG_S9LIODMmEfJmu2KHDTO4Iw", 'blake2b_512 (base64url/tripple_A)');
21 is( digest_data('BLAKE2b_512', "A","A","A"), pack("H*","dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823"), 'blake2b_512 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2b_512', "A","A","A"), "dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823", 'blake2b_512 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2b_512', "A","A","A"), "3aXJKuWtugR9MX+Z3FipBZtajAkH+V2M3c9b/aqOTHTd2EvCaDzcLRajQP9XmOG/S9LIODMmEfJmu2KHDTO4Iw==", 'blake2b_512 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2b_512', "A","A","A"), "3aXJKuWtugR9MX-Z3FipBZtajAkH-V2M3c9b_aqOTHTd2EvCaDzcLRajQP9XmOG_S9LIODMmEfJmu2KHDTO4Iw", 'blake2b_512 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2b_512->new->add("A","A","A")->hexdigest, "dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823", 'blake2b_512 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2b_512->new->add("A")->add("A")->add("A")->hexdigest, "dda5c92ae5adba047d317f99dc58a9059b5a8c0907f95d8cddcf5bfdaa8e4c74ddd84bc2683cdc2d16a340ff5798e1bf4bd2c838332611f266bb62870d33b823", 'blake2b_512 (OO3/tripple_A)');
1627
1728
1829 is( blake2b_512(""), pack("H*","786a02f742015903c6c6fd852552d272912f4740e15847618a86e217f71f5419d25e1031afee585313896444934eb04b903a685b1448b755d56f701afe9be2ce"), 'blake2b_512 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2s_128 qw( blake2s_128 blake2s_128_hex blake2s_128_b64 blake2s_128_b64u blake2s_128_file blake2s_128_file_hex blake2s_128_file_b64 blake2s_128_file_b64u );
1313 is( Crypt::Digest::BLAKE2s_128->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2s_128')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2s_128->new->hashsize, 16, 'hashsize/6');
16
17 is( blake2s_128("A","A","A"), pack("H*","a2a5699c7579ee354f4d20fa75f09cb6"), 'blake2s_128 (raw/tripple_A)');
18 is( blake2s_128_hex("A","A","A"), "a2a5699c7579ee354f4d20fa75f09cb6", 'blake2s_128 (hex/tripple_A)');
19 is( blake2s_128_b64("A","A","A"), "oqVpnHV57jVPTSD6dfCctg==", 'blake2s_128 (base64/tripple_A)');
20 is( blake2s_128_b64u("A","A","A"), "oqVpnHV57jVPTSD6dfCctg", 'blake2s_128 (base64url/tripple_A)');
21 is( digest_data('BLAKE2s_128', "A","A","A"), pack("H*","a2a5699c7579ee354f4d20fa75f09cb6"), 'blake2s_128 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2s_128', "A","A","A"), "a2a5699c7579ee354f4d20fa75f09cb6", 'blake2s_128 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2s_128', "A","A","A"), "oqVpnHV57jVPTSD6dfCctg==", 'blake2s_128 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2s_128', "A","A","A"), "oqVpnHV57jVPTSD6dfCctg", 'blake2s_128 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2s_128->new->add("A","A","A")->hexdigest, "a2a5699c7579ee354f4d20fa75f09cb6", 'blake2s_128 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2s_128->new->add("A")->add("A")->add("A")->hexdigest, "a2a5699c7579ee354f4d20fa75f09cb6", 'blake2s_128 (OO3/tripple_A)');
1627
1728
1829 is( blake2s_128(""), pack("H*","64550d6ffe2c0a01a14aba1eade0200c"), 'blake2s_128 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2s_160 qw( blake2s_160 blake2s_160_hex blake2s_160_b64 blake2s_160_b64u blake2s_160_file blake2s_160_file_hex blake2s_160_file_b64 blake2s_160_file_b64u );
1313 is( Crypt::Digest::BLAKE2s_160->hashsize, 20, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2s_160')->hashsize, 20, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2s_160->new->hashsize, 20, 'hashsize/6');
16
17 is( blake2s_160("A","A","A"), pack("H*","f44c709aebd62a7a13bd6ee5979981970a60e117"), 'blake2s_160 (raw/tripple_A)');
18 is( blake2s_160_hex("A","A","A"), "f44c709aebd62a7a13bd6ee5979981970a60e117", 'blake2s_160 (hex/tripple_A)');
19 is( blake2s_160_b64("A","A","A"), "9ExwmuvWKnoTvW7ll5mBlwpg4Rc=", 'blake2s_160 (base64/tripple_A)');
20 is( blake2s_160_b64u("A","A","A"), "9ExwmuvWKnoTvW7ll5mBlwpg4Rc", 'blake2s_160 (base64url/tripple_A)');
21 is( digest_data('BLAKE2s_160', "A","A","A"), pack("H*","f44c709aebd62a7a13bd6ee5979981970a60e117"), 'blake2s_160 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2s_160', "A","A","A"), "f44c709aebd62a7a13bd6ee5979981970a60e117", 'blake2s_160 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2s_160', "A","A","A"), "9ExwmuvWKnoTvW7ll5mBlwpg4Rc=", 'blake2s_160 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2s_160', "A","A","A"), "9ExwmuvWKnoTvW7ll5mBlwpg4Rc", 'blake2s_160 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2s_160->new->add("A","A","A")->hexdigest, "f44c709aebd62a7a13bd6ee5979981970a60e117", 'blake2s_160 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2s_160->new->add("A")->add("A")->add("A")->hexdigest, "f44c709aebd62a7a13bd6ee5979981970a60e117", 'blake2s_160 (OO3/tripple_A)');
1627
1728
1829 is( blake2s_160(""), pack("H*","354c9c33f735962418bdacb9479873429c34916f"), 'blake2s_160 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2s_224 qw( blake2s_224 blake2s_224_hex blake2s_224_b64 blake2s_224_b64u blake2s_224_file blake2s_224_file_hex blake2s_224_file_b64 blake2s_224_file_b64u );
1313 is( Crypt::Digest::BLAKE2s_224->hashsize, 28, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2s_224')->hashsize, 28, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2s_224->new->hashsize, 28, 'hashsize/6');
16
17 is( blake2s_224("A","A","A"), pack("H*","8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006"), 'blake2s_224 (raw/tripple_A)');
18 is( blake2s_224_hex("A","A","A"), "8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006", 'blake2s_224 (hex/tripple_A)');
19 is( blake2s_224_b64("A","A","A"), "jCc44Y0LlkWHDX2ktSdWzvRsXz0YX06pPDYQBg==", 'blake2s_224 (base64/tripple_A)');
20 is( blake2s_224_b64u("A","A","A"), "jCc44Y0LlkWHDX2ktSdWzvRsXz0YX06pPDYQBg", 'blake2s_224 (base64url/tripple_A)');
21 is( digest_data('BLAKE2s_224', "A","A","A"), pack("H*","8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006"), 'blake2s_224 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2s_224', "A","A","A"), "8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006", 'blake2s_224 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2s_224', "A","A","A"), "jCc44Y0LlkWHDX2ktSdWzvRsXz0YX06pPDYQBg==", 'blake2s_224 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2s_224', "A","A","A"), "jCc44Y0LlkWHDX2ktSdWzvRsXz0YX06pPDYQBg", 'blake2s_224 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2s_224->new->add("A","A","A")->hexdigest, "8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006", 'blake2s_224 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2s_224->new->add("A")->add("A")->add("A")->hexdigest, "8c2738e18d0b9645870d7da4b52756cef46c5f3d185f4ea93c361006", 'blake2s_224 (OO3/tripple_A)');
1627
1728
1829 is( blake2s_224(""), pack("H*","1fa1291e65248b37b3433475b2a0dd63d54a11ecc4e3e034e7bc1ef4"), 'blake2s_224 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::BLAKE2s_256 qw( blake2s_256 blake2s_256_hex blake2s_256_b64 blake2s_256_b64u blake2s_256_file blake2s_256_file_hex blake2s_256_file_b64 blake2s_256_file_b64u );
1313 is( Crypt::Digest::BLAKE2s_256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('BLAKE2s_256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::BLAKE2s_256->new->hashsize, 32, 'hashsize/6');
16
17 is( blake2s_256("A","A","A"), pack("H*","8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6"), 'blake2s_256 (raw/tripple_A)');
18 is( blake2s_256_hex("A","A","A"), "8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6", 'blake2s_256 (hex/tripple_A)');
19 is( blake2s_256_b64("A","A","A"), "jU/p9TaP85fOdERkD1IvCQWXWRwhOSJiE42mdQvx3/Y=", 'blake2s_256 (base64/tripple_A)');
20 is( blake2s_256_b64u("A","A","A"), "jU_p9TaP85fOdERkD1IvCQWXWRwhOSJiE42mdQvx3_Y", 'blake2s_256 (base64url/tripple_A)');
21 is( digest_data('BLAKE2s_256', "A","A","A"), pack("H*","8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6"), 'blake2s_256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('BLAKE2s_256', "A","A","A"), "8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6", 'blake2s_256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('BLAKE2s_256', "A","A","A"), "jU/p9TaP85fOdERkD1IvCQWXWRwhOSJiE42mdQvx3/Y=", 'blake2s_256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('BLAKE2s_256', "A","A","A"), "jU_p9TaP85fOdERkD1IvCQWXWRwhOSJiE42mdQvx3_Y", 'blake2s_256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::BLAKE2s_256->new->add("A","A","A")->hexdigest, "8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6", 'blake2s_256 (OO/tripple_A)');
26 is( Crypt::Digest::BLAKE2s_256->new->add("A")->add("A")->add("A")->hexdigest, "8d4fe9f5368ff397ce7444640f522f090597591c21392262138da6750bf1dff6", 'blake2s_256 (OO3/tripple_A)');
1627
1728
1829 is( blake2s_256(""), pack("H*","69217a3079908094e11121d042354a7c1f55b6482ca1a51e1b250dfd1ed0eef9"), 'blake2s_256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::CHAES qw( chaes chaes_hex chaes_b64 chaes_b64u chaes_file chaes_file_hex chaes_file_b64 chaes_file_b64u );
1313 is( Crypt::Digest::CHAES->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('CHAES')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::CHAES->new->hashsize, 16, 'hashsize/6');
16
17 is( chaes("A","A","A"), pack("H*","f01416b4c3f6389816b2fcd0b4cf9e41"), 'chaes (raw/tripple_A)');
18 is( chaes_hex("A","A","A"), "f01416b4c3f6389816b2fcd0b4cf9e41", 'chaes (hex/tripple_A)');
19 is( chaes_b64("A","A","A"), "8BQWtMP2OJgWsvzQtM+eQQ==", 'chaes (base64/tripple_A)');
20 is( chaes_b64u("A","A","A"), "8BQWtMP2OJgWsvzQtM-eQQ", 'chaes (base64url/tripple_A)');
21 is( digest_data('CHAES', "A","A","A"), pack("H*","f01416b4c3f6389816b2fcd0b4cf9e41"), 'chaes (digest_data_raw/tripple_A)');
22 is( digest_data_hex('CHAES', "A","A","A"), "f01416b4c3f6389816b2fcd0b4cf9e41", 'chaes (digest_data_hex/tripple_A)');
23 is( digest_data_b64('CHAES', "A","A","A"), "8BQWtMP2OJgWsvzQtM+eQQ==", 'chaes (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('CHAES', "A","A","A"), "8BQWtMP2OJgWsvzQtM-eQQ", 'chaes (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::CHAES->new->add("A","A","A")->hexdigest, "f01416b4c3f6389816b2fcd0b4cf9e41", 'chaes (OO/tripple_A)');
26 is( Crypt::Digest::CHAES->new->add("A")->add("A")->add("A")->hexdigest, "f01416b4c3f6389816b2fcd0b4cf9e41", 'chaes (OO3/tripple_A)');
1627
1728
1829 is( chaes(""), pack("H*","4047929f1f572643b55f829eb3291d11"), 'chaes (raw/1)');
0 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
1
2 use strict;
3 use warnings;
4
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
6
7 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
8 use Crypt::Digest::Keccak224 qw( keccak224 keccak224_hex keccak224_b64 keccak224_b64u keccak224_file keccak224_file_hex keccak224_file_b64 keccak224_file_b64u );
9
10 is( Crypt::Digest::hashsize('Keccak224'), 28, 'hashsize/1');
11 is( Crypt::Digest->hashsize('Keccak224'), 28, 'hashsize/2');
12 is( Crypt::Digest::Keccak224::hashsize, 28, 'hashsize/3');
13 is( Crypt::Digest::Keccak224->hashsize, 28, 'hashsize/4');
14 is( Crypt::Digest->new('Keccak224')->hashsize, 28, 'hashsize/5');
15 is( Crypt::Digest::Keccak224->new->hashsize, 28, 'hashsize/6');
16
17 is( keccak224("A","A","A"), pack("H*","92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252"), 'keccak224 (raw/tripple_A)');
18 is( keccak224_hex("A","A","A"), "92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252", 'keccak224 (hex/tripple_A)');
19 is( keccak224_b64("A","A","A"), "krnSolIi0qA2xTvU3SRrQHPRAOCuIKxyQPWyUg==", 'keccak224 (base64/tripple_A)');
20 is( keccak224_b64u("A","A","A"), "krnSolIi0qA2xTvU3SRrQHPRAOCuIKxyQPWyUg", 'keccak224 (base64url/tripple_A)');
21 is( digest_data('Keccak224', "A","A","A"), pack("H*","92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252"), 'keccak224 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Keccak224', "A","A","A"), "92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252", 'keccak224 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Keccak224', "A","A","A"), "krnSolIi0qA2xTvU3SRrQHPRAOCuIKxyQPWyUg==", 'keccak224 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Keccak224', "A","A","A"), "krnSolIi0qA2xTvU3SRrQHPRAOCuIKxyQPWyUg", 'keccak224 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Keccak224->new->add("A","A","A")->hexdigest, "92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252", 'keccak224 (OO/tripple_A)');
26 is( Crypt::Digest::Keccak224->new->add("A")->add("A")->add("A")->hexdigest, "92b9d2a25222d2a036c53bd4dd246b4073d100e0ae20ac7240f5b252", 'keccak224 (OO3/tripple_A)');
27
28
29 is( keccak224(""), pack("H*","f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd"), 'keccak224 (raw/1)');
30 is( keccak224_hex(""), "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", 'keccak224 (hex/1)');
31 is( keccak224_b64(""), "9xg3UCuo4Qg3vdjTZa24VZGJVgL8VStItzkKvQ==", 'keccak224 (base64/1)');
32 is( digest_data('Keccak224', ""), pack("H*","f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd"), 'keccak224 (digest_data_raw/1)');
33 is( digest_data_hex('Keccak224', ""), "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", 'keccak224 (digest_data_hex/1)');
34 is( digest_data_b64('Keccak224', ""), "9xg3UCuo4Qg3vdjTZa24VZGJVgL8VStItzkKvQ==", 'keccak224 (digest_data_b64/1)');
35 is( digest_data_b64u('Keccak224', ""), "9xg3UCuo4Qg3vdjTZa24VZGJVgL8VStItzkKvQ", 'keccak224 (digest_data_b64u/1)');
36 is( Crypt::Digest::Keccak224->new->add("")->hexdigest, "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd", 'keccak224 (OO/1)');
37
38 is( keccak224("123"), pack("H*","5c52615361ce4c5469f9d8c90113c7a543a4bf43490782d291cb32d8"), 'keccak224 (raw/2)');
39 is( keccak224_hex("123"), "5c52615361ce4c5469f9d8c90113c7a543a4bf43490782d291cb32d8", 'keccak224 (hex/2)');
40 is( keccak224_b64("123"), "XFJhU2HOTFRp+djJARPHpUOkv0NJB4LSkcsy2A==", 'keccak224 (base64/2)');
41 is( digest_data('Keccak224', "123"), pack("H*","5c52615361ce4c5469f9d8c90113c7a543a4bf43490782d291cb32d8"), 'keccak224 (digest_data_raw/2)');
42 is( digest_data_hex('Keccak224', "123"), "5c52615361ce4c5469f9d8c90113c7a543a4bf43490782d291cb32d8", 'keccak224 (digest_data_hex/2)');
43 is( digest_data_b64('Keccak224', "123"), "XFJhU2HOTFRp+djJARPHpUOkv0NJB4LSkcsy2A==", 'keccak224 (digest_data_b64/2)');
44 is( digest_data_b64u('Keccak224', "123"), "XFJhU2HOTFRp-djJARPHpUOkv0NJB4LSkcsy2A", 'keccak224 (digest_data_b64u/2)');
45 is( Crypt::Digest::Keccak224->new->add("123")->hexdigest, "5c52615361ce4c5469f9d8c90113c7a543a4bf43490782d291cb32d8", 'keccak224 (OO/2)');
46
47 is( keccak224("test\0test\0test\n"), pack("H*","7cbb8e9a6026e7c8324ab2f1cba55a1aff03b7b0424b8915b0439179"), 'keccak224 (raw/3)');
48 is( keccak224_hex("test\0test\0test\n"), "7cbb8e9a6026e7c8324ab2f1cba55a1aff03b7b0424b8915b0439179", 'keccak224 (hex/3)');
49 is( keccak224_b64("test\0test\0test\n"), "fLuOmmAm58gySrLxy6VaGv8Dt7BCS4kVsEOReQ==", 'keccak224 (base64/3)');
50 is( digest_data('Keccak224', "test\0test\0test\n"), pack("H*","7cbb8e9a6026e7c8324ab2f1cba55a1aff03b7b0424b8915b0439179"), 'keccak224 (digest_data_raw/3)');
51 is( digest_data_hex('Keccak224', "test\0test\0test\n"), "7cbb8e9a6026e7c8324ab2f1cba55a1aff03b7b0424b8915b0439179", 'keccak224 (digest_data_hex/3)');
52 is( digest_data_b64('Keccak224', "test\0test\0test\n"), "fLuOmmAm58gySrLxy6VaGv8Dt7BCS4kVsEOReQ==", 'keccak224 (digest_data_b64/3)');
53 is( digest_data_b64u('Keccak224', "test\0test\0test\n"), "fLuOmmAm58gySrLxy6VaGv8Dt7BCS4kVsEOReQ", 'keccak224 (digest_data_b64u/3)');
54 is( Crypt::Digest::Keccak224->new->add("test\0test\0test\n")->hexdigest, "7cbb8e9a6026e7c8324ab2f1cba55a1aff03b7b0424b8915b0439179", 'keccak224 (OO/3)');
55
56
57 is( keccak224_file('t/data/binary-test.file'), pack("H*","8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e"), 'keccak224 (raw/file/1)');
58 is( keccak224_file_hex('t/data/binary-test.file'), "8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e", 'keccak224 (hex/file/1)');
59 is( keccak224_file_b64('t/data/binary-test.file'), "jxZR/6uQNhkxShs9fImu+8H49UEomxiJMgsajg==", 'keccak224 (base64/file/1)');
60 is( digest_file('Keccak224', 't/data/binary-test.file'), pack("H*","8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e"), 'keccak224 (digest_file_raw/file/1)');
61 is( digest_file_hex('Keccak224', 't/data/binary-test.file'), "8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e", 'keccak224 (digest_file_hex/file/1)');
62 is( digest_file_b64('Keccak224', 't/data/binary-test.file'), "jxZR/6uQNhkxShs9fImu+8H49UEomxiJMgsajg==", 'keccak224 (digest_file_b64/file/1)');
63 is( digest_file_b64u('Keccak224', 't/data/binary-test.file'), "jxZR_6uQNhkxShs9fImu-8H49UEomxiJMgsajg", 'keccak224 (digest_file_b64u/file/1)');
64 is( Crypt::Digest::Keccak224->new->addfile('t/data/binary-test.file')->hexdigest, "8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e", 'keccak224 (OO/file/1)');
65 {
66 open(my $fh, '<', 't/data/binary-test.file');
67 binmode($fh);
68 is( Crypt::Digest::Keccak224->new->addfile($fh)->hexdigest, "8f1651ffab903619314a1b3d7c89aefbc1f8f541289b1889320b1a8e", 'keccak224 (OO/filehandle/1)');
69 close($fh);
70 }
71
72 is( keccak224_file('t/data/text-CR.file'), pack("H*","28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8"), 'keccak224 (raw/file/2)');
73 is( keccak224_file_hex('t/data/text-CR.file'), "28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8", 'keccak224 (hex/file/2)');
74 is( keccak224_file_b64('t/data/text-CR.file'), "KP+KFzguH6EcN81uJUO/JX+RSq43YO93BzmHyA==", 'keccak224 (base64/file/2)');
75 is( digest_file('Keccak224', 't/data/text-CR.file'), pack("H*","28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8"), 'keccak224 (digest_file_raw/file/2)');
76 is( digest_file_hex('Keccak224', 't/data/text-CR.file'), "28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8", 'keccak224 (digest_file_hex/file/2)');
77 is( digest_file_b64('Keccak224', 't/data/text-CR.file'), "KP+KFzguH6EcN81uJUO/JX+RSq43YO93BzmHyA==", 'keccak224 (digest_file_b64/file/2)');
78 is( digest_file_b64u('Keccak224', 't/data/text-CR.file'), "KP-KFzguH6EcN81uJUO_JX-RSq43YO93BzmHyA", 'keccak224 (digest_file_b64u/file/2)');
79 is( Crypt::Digest::Keccak224->new->addfile('t/data/text-CR.file')->hexdigest, "28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8", 'keccak224 (OO/file/2)');
80 {
81 open(my $fh, '<', 't/data/text-CR.file');
82 binmode($fh);
83 is( Crypt::Digest::Keccak224->new->addfile($fh)->hexdigest, "28ff8a17382e1fa11c37cd6e2543bf257f914aae3760ef77073987c8", 'keccak224 (OO/filehandle/2)');
84 close($fh);
85 }
86
87 is( keccak224_file('t/data/text-CRLF.file'), pack("H*","26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa"), 'keccak224 (raw/file/3)');
88 is( keccak224_file_hex('t/data/text-CRLF.file'), "26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa", 'keccak224 (hex/file/3)');
89 is( keccak224_file_b64('t/data/text-CRLF.file'), "JmWQCHWUI83kTEmEdIr2th19TqXH6Bvlj7cvqg==", 'keccak224 (base64/file/3)');
90 is( digest_file('Keccak224', 't/data/text-CRLF.file'), pack("H*","26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa"), 'keccak224 (digest_file_raw/file/3)');
91 is( digest_file_hex('Keccak224', 't/data/text-CRLF.file'), "26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa", 'keccak224 (digest_file_hex/file/3)');
92 is( digest_file_b64('Keccak224', 't/data/text-CRLF.file'), "JmWQCHWUI83kTEmEdIr2th19TqXH6Bvlj7cvqg==", 'keccak224 (digest_file_b64/file/3)');
93 is( digest_file_b64u('Keccak224', 't/data/text-CRLF.file'), "JmWQCHWUI83kTEmEdIr2th19TqXH6Bvlj7cvqg", 'keccak224 (digest_file_b64u/file/3)');
94 is( Crypt::Digest::Keccak224->new->addfile('t/data/text-CRLF.file')->hexdigest, "26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa", 'keccak224 (OO/file/3)');
95 {
96 open(my $fh, '<', 't/data/text-CRLF.file');
97 binmode($fh);
98 is( Crypt::Digest::Keccak224->new->addfile($fh)->hexdigest, "26659008759423cde44c4984748af6b61d7d4ea5c7e81be58fb72faa", 'keccak224 (OO/filehandle/3)');
99 close($fh);
100 }
101
102 is( keccak224_file('t/data/text-LF.file'), pack("H*","2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b"), 'keccak224 (raw/file/4)');
103 is( keccak224_file_hex('t/data/text-LF.file'), "2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b", 'keccak224 (hex/file/4)');
104 is( keccak224_file_b64('t/data/text-LF.file'), "ICFxfRb5n0k5YNCDmjyysBvoB4wotCXX8chmKw==", 'keccak224 (base64/file/4)');
105 is( digest_file('Keccak224', 't/data/text-LF.file'), pack("H*","2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b"), 'keccak224 (digest_file_raw/file/4)');
106 is( digest_file_hex('Keccak224', 't/data/text-LF.file'), "2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b", 'keccak224 (digest_file_hex/file/4)');
107 is( digest_file_b64('Keccak224', 't/data/text-LF.file'), "ICFxfRb5n0k5YNCDmjyysBvoB4wotCXX8chmKw==", 'keccak224 (digest_file_b64/file/4)');
108 is( digest_file_b64u('Keccak224', 't/data/text-LF.file'), "ICFxfRb5n0k5YNCDmjyysBvoB4wotCXX8chmKw", 'keccak224 (digest_file_b64u/file/4)');
109 is( Crypt::Digest::Keccak224->new->addfile('t/data/text-LF.file')->hexdigest, "2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b", 'keccak224 (OO/file/4)');
110 {
111 open(my $fh, '<', 't/data/text-LF.file');
112 binmode($fh);
113 is( Crypt::Digest::Keccak224->new->addfile($fh)->hexdigest, "2021717d16f99f493960d0839a3cb2b01be8078c28b425d7f1c8662b", 'keccak224 (OO/filehandle/4)');
114 close($fh);
115 }
0 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
1
2 use strict;
3 use warnings;
4
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
6
7 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
8 use Crypt::Digest::Keccak256 qw( keccak256 keccak256_hex keccak256_b64 keccak256_b64u keccak256_file keccak256_file_hex keccak256_file_b64 keccak256_file_b64u );
9
10 is( Crypt::Digest::hashsize('Keccak256'), 32, 'hashsize/1');
11 is( Crypt::Digest->hashsize('Keccak256'), 32, 'hashsize/2');
12 is( Crypt::Digest::Keccak256::hashsize, 32, 'hashsize/3');
13 is( Crypt::Digest::Keccak256->hashsize, 32, 'hashsize/4');
14 is( Crypt::Digest->new('Keccak256')->hashsize, 32, 'hashsize/5');
15 is( Crypt::Digest::Keccak256->new->hashsize, 32, 'hashsize/6');
16
17 is( keccak256("A","A","A"), pack("H*","2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a"), 'keccak256 (raw/tripple_A)');
18 is( keccak256_hex("A","A","A"), "2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a", 'keccak256 (hex/tripple_A)');
19 is( keccak256_b64("A","A","A"), "IHBQQAOge0cT14OuemZCqzuVm3xXXG5PpPM+t0PbYxo=", 'keccak256 (base64/tripple_A)');
20 is( keccak256_b64u("A","A","A"), "IHBQQAOge0cT14OuemZCqzuVm3xXXG5PpPM-t0PbYxo", 'keccak256 (base64url/tripple_A)');
21 is( digest_data('Keccak256', "A","A","A"), pack("H*","2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a"), 'keccak256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Keccak256', "A","A","A"), "2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a", 'keccak256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Keccak256', "A","A","A"), "IHBQQAOge0cT14OuemZCqzuVm3xXXG5PpPM+t0PbYxo=", 'keccak256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Keccak256', "A","A","A"), "IHBQQAOge0cT14OuemZCqzuVm3xXXG5PpPM-t0PbYxo", 'keccak256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Keccak256->new->add("A","A","A")->hexdigest, "2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a", 'keccak256 (OO/tripple_A)');
26 is( Crypt::Digest::Keccak256->new->add("A")->add("A")->add("A")->hexdigest, "2070504003a07b4713d783ae7a6642ab3b959b7c575c6e4fa4f33eb743db631a", 'keccak256 (OO3/tripple_A)');
27
28
29 is( keccak256(""), pack("H*","c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"), 'keccak256 (raw/1)');
30 is( keccak256_hex(""), "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", 'keccak256 (hex/1)');
31 is( keccak256_b64(""), "xdJGAYb3IzySfn2y3McDwOUAtlPKgic7e/rYBF2FpHA=", 'keccak256 (base64/1)');
32 is( digest_data('Keccak256', ""), pack("H*","c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"), 'keccak256 (digest_data_raw/1)');
33 is( digest_data_hex('Keccak256', ""), "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", 'keccak256 (digest_data_hex/1)');
34 is( digest_data_b64('Keccak256', ""), "xdJGAYb3IzySfn2y3McDwOUAtlPKgic7e/rYBF2FpHA=", 'keccak256 (digest_data_b64/1)');
35 is( digest_data_b64u('Keccak256', ""), "xdJGAYb3IzySfn2y3McDwOUAtlPKgic7e_rYBF2FpHA", 'keccak256 (digest_data_b64u/1)');
36 is( Crypt::Digest::Keccak256->new->add("")->hexdigest, "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", 'keccak256 (OO/1)');
37
38 is( keccak256("123"), pack("H*","64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107"), 'keccak256 (raw/2)');
39 is( keccak256_hex("123"), "64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107", 'keccak256 (hex/2)');
40 is( keccak256_b64("123"), "ZOYEeHy/GUhB57aNfNKHhvbJoKOrn4sKDofLQ4erAQc=", 'keccak256 (base64/2)');
41 is( digest_data('Keccak256', "123"), pack("H*","64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107"), 'keccak256 (digest_data_raw/2)');
42 is( digest_data_hex('Keccak256', "123"), "64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107", 'keccak256 (digest_data_hex/2)');
43 is( digest_data_b64('Keccak256', "123"), "ZOYEeHy/GUhB57aNfNKHhvbJoKOrn4sKDofLQ4erAQc=", 'keccak256 (digest_data_b64/2)');
44 is( digest_data_b64u('Keccak256', "123"), "ZOYEeHy_GUhB57aNfNKHhvbJoKOrn4sKDofLQ4erAQc", 'keccak256 (digest_data_b64u/2)');
45 is( Crypt::Digest::Keccak256->new->add("123")->hexdigest, "64e604787cbf194841e7b68d7cd28786f6c9a0a3ab9f8b0a0e87cb4387ab0107", 'keccak256 (OO/2)');
46
47 is( keccak256("test\0test\0test\n"), pack("H*","fbc121310d505fb7172a28e0e9e8c7d2976c9f63a739fe60bc298467bc72bb86"), 'keccak256 (raw/3)');
48 is( keccak256_hex("test\0test\0test\n"), "fbc121310d505fb7172a28e0e9e8c7d2976c9f63a739fe60bc298467bc72bb86", 'keccak256 (hex/3)');
49 is( keccak256_b64("test\0test\0test\n"), "+8EhMQ1QX7cXKijg6ejH0pdsn2OnOf5gvCmEZ7xyu4Y=", 'keccak256 (base64/3)');
50 is( digest_data('Keccak256', "test\0test\0test\n"), pack("H*","fbc121310d505fb7172a28e0e9e8c7d2976c9f63a739fe60bc298467bc72bb86"), 'keccak256 (digest_data_raw/3)');
51 is( digest_data_hex('Keccak256', "test\0test\0test\n"), "fbc121310d505fb7172a28e0e9e8c7d2976c9f63a739fe60bc298467bc72bb86", 'keccak256 (digest_data_hex/3)');
52 is( digest_data_b64('Keccak256', "test\0test\0test\n"), "+8EhMQ1QX7cXKijg6ejH0pdsn2OnOf5gvCmEZ7xyu4Y=", 'keccak256 (digest_data_b64/3)');
53 is( digest_data_b64u('Keccak256', "test\0test\0test\n"), "-8EhMQ1QX7cXKijg6ejH0pdsn2OnOf5gvCmEZ7xyu4Y", 'keccak256 (digest_data_b64u/3)');
54 is( Crypt::Digest::Keccak256->new->add("test\0test\0test\n")->hexdigest, "fbc121310d505fb7172a28e0e9e8c7d2976c9f63a739fe60bc298467bc72bb86", 'keccak256 (OO/3)');
55
56
57 is( keccak256_file('t/data/binary-test.file'), pack("H*","7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8"), 'keccak256 (raw/file/1)');
58 is( keccak256_file_hex('t/data/binary-test.file'), "7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8", 'keccak256 (hex/file/1)');
59 is( keccak256_file_b64('t/data/binary-test.file'), "cEb1+tds95Oh9EwVm2Vid62j9CgFesgWDQT9zcWw/Lg=", 'keccak256 (base64/file/1)');
60 is( digest_file('Keccak256', 't/data/binary-test.file'), pack("H*","7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8"), 'keccak256 (digest_file_raw/file/1)');
61 is( digest_file_hex('Keccak256', 't/data/binary-test.file'), "7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8", 'keccak256 (digest_file_hex/file/1)');
62 is( digest_file_b64('Keccak256', 't/data/binary-test.file'), "cEb1+tds95Oh9EwVm2Vid62j9CgFesgWDQT9zcWw/Lg=", 'keccak256 (digest_file_b64/file/1)');
63 is( digest_file_b64u('Keccak256', 't/data/binary-test.file'), "cEb1-tds95Oh9EwVm2Vid62j9CgFesgWDQT9zcWw_Lg", 'keccak256 (digest_file_b64u/file/1)');
64 is( Crypt::Digest::Keccak256->new->addfile('t/data/binary-test.file')->hexdigest, "7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8", 'keccak256 (OO/file/1)');
65 {
66 open(my $fh, '<', 't/data/binary-test.file');
67 binmode($fh);
68 is( Crypt::Digest::Keccak256->new->addfile($fh)->hexdigest, "7046f5fad76cf793a1f44c159b656277ada3f428057ac8160d04fdcdc5b0fcb8", 'keccak256 (OO/filehandle/1)');
69 close($fh);
70 }
71
72 is( keccak256_file('t/data/text-CR.file'), pack("H*","288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18"), 'keccak256 (raw/file/2)');
73 is( keccak256_file_hex('t/data/text-CR.file'), "288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18", 'keccak256 (hex/file/2)');
74 is( keccak256_file_b64('t/data/text-CR.file'), "KI1HiXIipvvW2Fk80GeW5sPrVjem6vj8Az3JJDzgHBg=", 'keccak256 (base64/file/2)');
75 is( digest_file('Keccak256', 't/data/text-CR.file'), pack("H*","288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18"), 'keccak256 (digest_file_raw/file/2)');
76 is( digest_file_hex('Keccak256', 't/data/text-CR.file'), "288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18", 'keccak256 (digest_file_hex/file/2)');
77 is( digest_file_b64('Keccak256', 't/data/text-CR.file'), "KI1HiXIipvvW2Fk80GeW5sPrVjem6vj8Az3JJDzgHBg=", 'keccak256 (digest_file_b64/file/2)');
78 is( digest_file_b64u('Keccak256', 't/data/text-CR.file'), "KI1HiXIipvvW2Fk80GeW5sPrVjem6vj8Az3JJDzgHBg", 'keccak256 (digest_file_b64u/file/2)');
79 is( Crypt::Digest::Keccak256->new->addfile('t/data/text-CR.file')->hexdigest, "288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18", 'keccak256 (OO/file/2)');
80 {
81 open(my $fh, '<', 't/data/text-CR.file');
82 binmode($fh);
83 is( Crypt::Digest::Keccak256->new->addfile($fh)->hexdigest, "288d47897222a6fbd6d8593cd06796e6c3eb5637a6eaf8fc033dc9243ce01c18", 'keccak256 (OO/filehandle/2)');
84 close($fh);
85 }
86
87 is( keccak256_file('t/data/text-CRLF.file'), pack("H*","a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1"), 'keccak256 (raw/file/3)');
88 is( keccak256_file_hex('t/data/text-CRLF.file'), "a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1", 'keccak256 (hex/file/3)');
89 is( keccak256_file_b64('t/data/text-CRLF.file'), "pEcDuF1e5/NbPAwhxkbWlZeNDsXqNqGgWndCfF+WTuE=", 'keccak256 (base64/file/3)');
90 is( digest_file('Keccak256', 't/data/text-CRLF.file'), pack("H*","a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1"), 'keccak256 (digest_file_raw/file/3)');
91 is( digest_file_hex('Keccak256', 't/data/text-CRLF.file'), "a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1", 'keccak256 (digest_file_hex/file/3)');
92 is( digest_file_b64('Keccak256', 't/data/text-CRLF.file'), "pEcDuF1e5/NbPAwhxkbWlZeNDsXqNqGgWndCfF+WTuE=", 'keccak256 (digest_file_b64/file/3)');
93 is( digest_file_b64u('Keccak256', 't/data/text-CRLF.file'), "pEcDuF1e5_NbPAwhxkbWlZeNDsXqNqGgWndCfF-WTuE", 'keccak256 (digest_file_b64u/file/3)');
94 is( Crypt::Digest::Keccak256->new->addfile('t/data/text-CRLF.file')->hexdigest, "a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1", 'keccak256 (OO/file/3)');
95 {
96 open(my $fh, '<', 't/data/text-CRLF.file');
97 binmode($fh);
98 is( Crypt::Digest::Keccak256->new->addfile($fh)->hexdigest, "a44703b85d5ee7f35b3c0c21c646d695978d0ec5ea36a1a05a77427c5f964ee1", 'keccak256 (OO/filehandle/3)');
99 close($fh);
100 }
101
102 is( keccak256_file('t/data/text-LF.file'), pack("H*","188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4"), 'keccak256 (raw/file/4)');
103 is( keccak256_file_hex('t/data/text-LF.file'), "188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4", 'keccak256 (hex/file/4)');
104 is( keccak256_file_b64('t/data/text-LF.file'), "GIR2xx3ir8t+2p28VgteteTmgaVYVopBBo621zjvpPQ=", 'keccak256 (base64/file/4)');
105 is( digest_file('Keccak256', 't/data/text-LF.file'), pack("H*","188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4"), 'keccak256 (digest_file_raw/file/4)');
106 is( digest_file_hex('Keccak256', 't/data/text-LF.file'), "188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4", 'keccak256 (digest_file_hex/file/4)');
107 is( digest_file_b64('Keccak256', 't/data/text-LF.file'), "GIR2xx3ir8t+2p28VgteteTmgaVYVopBBo621zjvpPQ=", 'keccak256 (digest_file_b64/file/4)');
108 is( digest_file_b64u('Keccak256', 't/data/text-LF.file'), "GIR2xx3ir8t-2p28VgteteTmgaVYVopBBo621zjvpPQ", 'keccak256 (digest_file_b64u/file/4)');
109 is( Crypt::Digest::Keccak256->new->addfile('t/data/text-LF.file')->hexdigest, "188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4", 'keccak256 (OO/file/4)');
110 {
111 open(my $fh, '<', 't/data/text-LF.file');
112 binmode($fh);
113 is( Crypt::Digest::Keccak256->new->addfile($fh)->hexdigest, "188476c71de2afcb7eda9dbc560b5eb5e4e681a558568a41068eb6d738efa4f4", 'keccak256 (OO/filehandle/4)');
114 close($fh);
115 }
0 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
1
2 use strict;
3 use warnings;
4
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
6
7 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
8 use Crypt::Digest::Keccak384 qw( keccak384 keccak384_hex keccak384_b64 keccak384_b64u keccak384_file keccak384_file_hex keccak384_file_b64 keccak384_file_b64u );
9
10 is( Crypt::Digest::hashsize('Keccak384'), 48, 'hashsize/1');
11 is( Crypt::Digest->hashsize('Keccak384'), 48, 'hashsize/2');
12 is( Crypt::Digest::Keccak384::hashsize, 48, 'hashsize/3');
13 is( Crypt::Digest::Keccak384->hashsize, 48, 'hashsize/4');
14 is( Crypt::Digest->new('Keccak384')->hashsize, 48, 'hashsize/5');
15 is( Crypt::Digest::Keccak384->new->hashsize, 48, 'hashsize/6');
16
17 is( keccak384("A","A","A"), pack("H*","173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297"), 'keccak384 (raw/tripple_A)');
18 is( keccak384_hex("A","A","A"), "173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297", 'keccak384 (hex/tripple_A)');
19 is( keccak384_b64("A","A","A"), "FztUXg/YF4T4wCTKgDZBk2CC7vmlrOc/r3OtaOzeYCnMNFpcVJOE4Ndifcv1jQKX", 'keccak384 (base64/tripple_A)');
20 is( keccak384_b64u("A","A","A"), "FztUXg_YF4T4wCTKgDZBk2CC7vmlrOc_r3OtaOzeYCnMNFpcVJOE4Ndifcv1jQKX", 'keccak384 (base64url/tripple_A)');
21 is( digest_data('Keccak384', "A","A","A"), pack("H*","173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297"), 'keccak384 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Keccak384', "A","A","A"), "173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297", 'keccak384 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Keccak384', "A","A","A"), "FztUXg/YF4T4wCTKgDZBk2CC7vmlrOc/r3OtaOzeYCnMNFpcVJOE4Ndifcv1jQKX", 'keccak384 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Keccak384', "A","A","A"), "FztUXg_YF4T4wCTKgDZBk2CC7vmlrOc_r3OtaOzeYCnMNFpcVJOE4Ndifcv1jQKX", 'keccak384 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Keccak384->new->add("A","A","A")->hexdigest, "173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297", 'keccak384 (OO/tripple_A)');
26 is( Crypt::Digest::Keccak384->new->add("A")->add("A")->add("A")->hexdigest, "173b545e0fd81784f8c024ca803641936082eef9a5ace73faf73ad68ecde6029cc345a5c549384e0d7627dcbf58d0297", 'keccak384 (OO3/tripple_A)');
27
28
29 is( keccak384(""), pack("H*","2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff"), 'keccak384 (raw/1)');
30 is( keccak384_hex(""), "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", 'keccak384 (hex/1)');
31 is( keccak384_b64(""), "LCMUamOims+Z5zuI+MJOqn3GCqdxeAzMAGr7+o/iR5st0rITYjN0QawStRWRGVf/", 'keccak384 (base64/1)');
32 is( digest_data('Keccak384', ""), pack("H*","2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff"), 'keccak384 (digest_data_raw/1)');
33 is( digest_data_hex('Keccak384', ""), "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", 'keccak384 (digest_data_hex/1)');
34 is( digest_data_b64('Keccak384', ""), "LCMUamOims+Z5zuI+MJOqn3GCqdxeAzMAGr7+o/iR5st0rITYjN0QawStRWRGVf/", 'keccak384 (digest_data_b64/1)');
35 is( digest_data_b64u('Keccak384', ""), "LCMUamOims-Z5zuI-MJOqn3GCqdxeAzMAGr7-o_iR5st0rITYjN0QawStRWRGVf_", 'keccak384 (digest_data_b64u/1)');
36 is( Crypt::Digest::Keccak384->new->add("")->hexdigest, "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff", 'keccak384 (OO/1)');
37
38 is( keccak384("123"), pack("H*","7dd34ccaae92bfc7eb541056d200db23b6bbeefe95be0d2bb43625113361906f0afc701dbef1cfb615bf98b1535a84c1"), 'keccak384 (raw/2)');
39 is( keccak384_hex("123"), "7dd34ccaae92bfc7eb541056d200db23b6bbeefe95be0d2bb43625113361906f0afc701dbef1cfb615bf98b1535a84c1", 'keccak384 (hex/2)');
40 is( keccak384_b64("123"), "fdNMyq6Sv8frVBBW0gDbI7a77v6Vvg0rtDYlETNhkG8K/HAdvvHPthW/mLFTWoTB", 'keccak384 (base64/2)');
41 is( digest_data('Keccak384', "123"), pack("H*","7dd34ccaae92bfc7eb541056d200db23b6bbeefe95be0d2bb43625113361906f0afc701dbef1cfb615bf98b1535a84c1"), 'keccak384 (digest_data_raw/2)');
42 is( digest_data_hex('Keccak384', "123"), "7dd34ccaae92bfc7eb541056d200db23b6bbeefe95be0d2bb43625113361906f0afc701dbef1cfb615bf98b1535a84c1", 'keccak384 (digest_data_hex/2)');
43 is( digest_data_b64('Keccak384', "123"), "fdNMyq6Sv8frVBBW0gDbI7a77v6Vvg0rtDYlETNhkG8K/HAdvvHPthW/mLFTWoTB", 'keccak384 (digest_data_b64/2)');
44 is( digest_data_b64u('Keccak384', "123"), "fdNMyq6Sv8frVBBW0gDbI7a77v6Vvg0rtDYlETNhkG8K_HAdvvHPthW_mLFTWoTB", 'keccak384 (digest_data_b64u/2)');
45 is( Crypt::Digest::Keccak384->new->add("123")->hexdigest, "7dd34ccaae92bfc7eb541056d200db23b6bbeefe95be0d2bb43625113361906f0afc701dbef1cfb615bf98b1535a84c1", 'keccak384 (OO/2)');
46
47 is( keccak384("test\0test\0test\n"), pack("H*","d05c31062f5401c5d370cf84949937c52764626a61d2bbd5bf5c50f6f742ebcf9269691a3c70ef83dc49f4e186e5d908"), 'keccak384 (raw/3)');
48 is( keccak384_hex("test\0test\0test\n"), "d05c31062f5401c5d370cf84949937c52764626a61d2bbd5bf5c50f6f742ebcf9269691a3c70ef83dc49f4e186e5d908", 'keccak384 (hex/3)');
49 is( keccak384_b64("test\0test\0test\n"), "0FwxBi9UAcXTcM+ElJk3xSdkYmph0rvVv1xQ9vdC68+SaWkaPHDvg9xJ9OGG5dkI", 'keccak384 (base64/3)');
50 is( digest_data('Keccak384', "test\0test\0test\n"), pack("H*","d05c31062f5401c5d370cf84949937c52764626a61d2bbd5bf5c50f6f742ebcf9269691a3c70ef83dc49f4e186e5d908"), 'keccak384 (digest_data_raw/3)');
51 is( digest_data_hex('Keccak384', "test\0test\0test\n"), "d05c31062f5401c5d370cf84949937c52764626a61d2bbd5bf5c50f6f742ebcf9269691a3c70ef83dc49f4e186e5d908", 'keccak384 (digest_data_hex/3)');
52 is( digest_data_b64('Keccak384', "test\0test\0test\n"), "0FwxBi9UAcXTcM+ElJk3xSdkYmph0rvVv1xQ9vdC68+SaWkaPHDvg9xJ9OGG5dkI", 'keccak384 (digest_data_b64/3)');
53 is( digest_data_b64u('Keccak384', "test\0test\0test\n"), "0FwxBi9UAcXTcM-ElJk3xSdkYmph0rvVv1xQ9vdC68-SaWkaPHDvg9xJ9OGG5dkI", 'keccak384 (digest_data_b64u/3)');
54 is( Crypt::Digest::Keccak384->new->add("test\0test\0test\n")->hexdigest, "d05c31062f5401c5d370cf84949937c52764626a61d2bbd5bf5c50f6f742ebcf9269691a3c70ef83dc49f4e186e5d908", 'keccak384 (OO/3)');
55
56
57 is( keccak384_file('t/data/binary-test.file'), pack("H*","16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc"), 'keccak384 (raw/file/1)');
58 is( keccak384_file_hex('t/data/binary-test.file'), "16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc", 'keccak384 (hex/file/1)');
59 is( keccak384_file_b64('t/data/binary-test.file'), "FqWn2C3h7sHLu1HEA90PwCVg3fSIwbjGm5tM8VhedRQk38wGzwuvL/c9kxxvckC8", 'keccak384 (base64/file/1)');
60 is( digest_file('Keccak384', 't/data/binary-test.file'), pack("H*","16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc"), 'keccak384 (digest_file_raw/file/1)');
61 is( digest_file_hex('Keccak384', 't/data/binary-test.file'), "16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc", 'keccak384 (digest_file_hex/file/1)');
62 is( digest_file_b64('Keccak384', 't/data/binary-test.file'), "FqWn2C3h7sHLu1HEA90PwCVg3fSIwbjGm5tM8VhedRQk38wGzwuvL/c9kxxvckC8", 'keccak384 (digest_file_b64/file/1)');
63 is( digest_file_b64u('Keccak384', 't/data/binary-test.file'), "FqWn2C3h7sHLu1HEA90PwCVg3fSIwbjGm5tM8VhedRQk38wGzwuvL_c9kxxvckC8", 'keccak384 (digest_file_b64u/file/1)');
64 is( Crypt::Digest::Keccak384->new->addfile('t/data/binary-test.file')->hexdigest, "16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc", 'keccak384 (OO/file/1)');
65 {
66 open(my $fh, '<', 't/data/binary-test.file');
67 binmode($fh);
68 is( Crypt::Digest::Keccak384->new->addfile($fh)->hexdigest, "16a5a7d82de1eec1cbbb51c403dd0fc02560ddf488c1b8c69b9b4cf1585e751424dfcc06cf0baf2ff73d931c6f7240bc", 'keccak384 (OO/filehandle/1)');
69 close($fh);
70 }
71
72 is( keccak384_file('t/data/text-CR.file'), pack("H*","d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc"), 'keccak384 (raw/file/2)');
73 is( keccak384_file_hex('t/data/text-CR.file'), "d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc", 'keccak384 (hex/file/2)');
74 is( keccak384_file_b64('t/data/text-CR.file'), "1CoL+yqVu/66N1sUbr4375ly0lgJuToY/RdU+4atkTmsLKceXNFxMCTs2gYmOjnM", 'keccak384 (base64/file/2)');
75 is( digest_file('Keccak384', 't/data/text-CR.file'), pack("H*","d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc"), 'keccak384 (digest_file_raw/file/2)');
76 is( digest_file_hex('Keccak384', 't/data/text-CR.file'), "d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc", 'keccak384 (digest_file_hex/file/2)');
77 is( digest_file_b64('Keccak384', 't/data/text-CR.file'), "1CoL+yqVu/66N1sUbr4375ly0lgJuToY/RdU+4atkTmsLKceXNFxMCTs2gYmOjnM", 'keccak384 (digest_file_b64/file/2)');
78 is( digest_file_b64u('Keccak384', 't/data/text-CR.file'), "1CoL-yqVu_66N1sUbr4375ly0lgJuToY_RdU-4atkTmsLKceXNFxMCTs2gYmOjnM", 'keccak384 (digest_file_b64u/file/2)');
79 is( Crypt::Digest::Keccak384->new->addfile('t/data/text-CR.file')->hexdigest, "d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc", 'keccak384 (OO/file/2)');
80 {
81 open(my $fh, '<', 't/data/text-CR.file');
82 binmode($fh);
83 is( Crypt::Digest::Keccak384->new->addfile($fh)->hexdigest, "d42a0bfb2a95bbfeba375b146ebe37ef9972d25809b93a18fd1754fb86ad9139ac2ca71e5cd1713024ecda06263a39cc", 'keccak384 (OO/filehandle/2)');
84 close($fh);
85 }
86
87 is( keccak384_file('t/data/text-CRLF.file'), pack("H*","06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982"), 'keccak384 (raw/file/3)');
88 is( keccak384_file_hex('t/data/text-CRLF.file'), "06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982", 'keccak384 (hex/file/3)');
89 is( keccak384_file_b64('t/data/text-CRLF.file'), "BiiLNQblCArrvN+qulmFrInj5CJ/0yuKUyZABkyYv+qZGl6IzACzB/0N0tHIejmC", 'keccak384 (base64/file/3)');
90 is( digest_file('Keccak384', 't/data/text-CRLF.file'), pack("H*","06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982"), 'keccak384 (digest_file_raw/file/3)');
91 is( digest_file_hex('Keccak384', 't/data/text-CRLF.file'), "06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982", 'keccak384 (digest_file_hex/file/3)');
92 is( digest_file_b64('Keccak384', 't/data/text-CRLF.file'), "BiiLNQblCArrvN+qulmFrInj5CJ/0yuKUyZABkyYv+qZGl6IzACzB/0N0tHIejmC", 'keccak384 (digest_file_b64/file/3)');
93 is( digest_file_b64u('Keccak384', 't/data/text-CRLF.file'), "BiiLNQblCArrvN-qulmFrInj5CJ_0yuKUyZABkyYv-qZGl6IzACzB_0N0tHIejmC", 'keccak384 (digest_file_b64u/file/3)');
94 is( Crypt::Digest::Keccak384->new->addfile('t/data/text-CRLF.file')->hexdigest, "06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982", 'keccak384 (OO/file/3)');
95 {
96 open(my $fh, '<', 't/data/text-CRLF.file');
97 binmode($fh);
98 is( Crypt::Digest::Keccak384->new->addfile($fh)->hexdigest, "06288b3506e5080aebbcdfaaba5985ac89e3e4227fd32b8a532640064c98bfea991a5e88cc00b307fd0dd2d1c87a3982", 'keccak384 (OO/filehandle/3)');
99 close($fh);
100 }
101
102 is( keccak384_file('t/data/text-LF.file'), pack("H*","14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71"), 'keccak384 (raw/file/4)');
103 is( keccak384_file_hex('t/data/text-LF.file'), "14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71", 'keccak384 (hex/file/4)');
104 is( keccak384_file_b64('t/data/text-LF.file'), "FLVNEYgVT3AX/3sz4h5C75PJHXnqa0SiIwAq3G2JuHXTvLJcGJrqgnVgVAr75c9x", 'keccak384 (base64/file/4)');
105 is( digest_file('Keccak384', 't/data/text-LF.file'), pack("H*","14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71"), 'keccak384 (digest_file_raw/file/4)');
106 is( digest_file_hex('Keccak384', 't/data/text-LF.file'), "14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71", 'keccak384 (digest_file_hex/file/4)');
107 is( digest_file_b64('Keccak384', 't/data/text-LF.file'), "FLVNEYgVT3AX/3sz4h5C75PJHXnqa0SiIwAq3G2JuHXTvLJcGJrqgnVgVAr75c9x", 'keccak384 (digest_file_b64/file/4)');
108 is( digest_file_b64u('Keccak384', 't/data/text-LF.file'), "FLVNEYgVT3AX_3sz4h5C75PJHXnqa0SiIwAq3G2JuHXTvLJcGJrqgnVgVAr75c9x", 'keccak384 (digest_file_b64u/file/4)');
109 is( Crypt::Digest::Keccak384->new->addfile('t/data/text-LF.file')->hexdigest, "14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71", 'keccak384 (OO/file/4)');
110 {
111 open(my $fh, '<', 't/data/text-LF.file');
112 binmode($fh);
113 is( Crypt::Digest::Keccak384->new->addfile($fh)->hexdigest, "14b54d1188154f7017ff7b33e21e42ef93c91d79ea6b44a223002adc6d89b875d3bcb25c189aea827560540afbe5cf71", 'keccak384 (OO/filehandle/4)');
114 close($fh);
115 }
0 ### BEWARE - GENERATED FILE, DO NOT EDIT MANUALLY!
1
2 use strict;
3 use warnings;
4
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
6
7 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
8 use Crypt::Digest::Keccak512 qw( keccak512 keccak512_hex keccak512_b64 keccak512_b64u keccak512_file keccak512_file_hex keccak512_file_b64 keccak512_file_b64u );
9
10 is( Crypt::Digest::hashsize('Keccak512'), 64, 'hashsize/1');
11 is( Crypt::Digest->hashsize('Keccak512'), 64, 'hashsize/2');
12 is( Crypt::Digest::Keccak512::hashsize, 64, 'hashsize/3');
13 is( Crypt::Digest::Keccak512->hashsize, 64, 'hashsize/4');
14 is( Crypt::Digest->new('Keccak512')->hashsize, 64, 'hashsize/5');
15 is( Crypt::Digest::Keccak512->new->hashsize, 64, 'hashsize/6');
16
17 is( keccak512("A","A","A"), pack("H*","a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391"), 'keccak512 (raw/tripple_A)');
18 is( keccak512_hex("A","A","A"), "a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391", 'keccak512 (hex/tripple_A)');
19 is( keccak512_b64("A","A","A"), "oCQ6iRWE9IrrWWd0WHBdIJwN79l3ZVy4pseCmKydWYFXFlnh01AkKF1xjdH2A4dq14X1nqgUuR7mGkQzhWxjkQ==", 'keccak512 (base64/tripple_A)');
20 is( keccak512_b64u("A","A","A"), "oCQ6iRWE9IrrWWd0WHBdIJwN79l3ZVy4pseCmKydWYFXFlnh01AkKF1xjdH2A4dq14X1nqgUuR7mGkQzhWxjkQ", 'keccak512 (base64url/tripple_A)');
21 is( digest_data('Keccak512', "A","A","A"), pack("H*","a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391"), 'keccak512 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Keccak512', "A","A","A"), "a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391", 'keccak512 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Keccak512', "A","A","A"), "oCQ6iRWE9IrrWWd0WHBdIJwN79l3ZVy4pseCmKydWYFXFlnh01AkKF1xjdH2A4dq14X1nqgUuR7mGkQzhWxjkQ==", 'keccak512 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Keccak512', "A","A","A"), "oCQ6iRWE9IrrWWd0WHBdIJwN79l3ZVy4pseCmKydWYFXFlnh01AkKF1xjdH2A4dq14X1nqgUuR7mGkQzhWxjkQ", 'keccak512 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Keccak512->new->add("A","A","A")->hexdigest, "a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391", 'keccak512 (OO/tripple_A)');
26 is( Crypt::Digest::Keccak512->new->add("A")->add("A")->add("A")->hexdigest, "a0243a891584f48aeb59677458705d209c0defd977655cb8a6c78298ac9d5981571659e1d35024285d718dd1f603876ad785f59ea814b91ee61a4433856c6391", 'keccak512 (OO3/tripple_A)');
27
28
29 is( keccak512(""), pack("H*","0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"), 'keccak512 (raw/1)');
30 is( keccak512_hex(""), "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", 'keccak512 (hex/1)');
31 is( keccak512_b64(""), "DqtC3kw865I1/JGs/+dGspwpqMNmt8YOTmfEZvNqQwTAD6nK+dh5drpGm8vgZxO0NfCR7ydp+xYM2rM9NnBoDg==", 'keccak512 (base64/1)');
32 is( digest_data('Keccak512', ""), pack("H*","0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e"), 'keccak512 (digest_data_raw/1)');
33 is( digest_data_hex('Keccak512', ""), "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", 'keccak512 (digest_data_hex/1)');
34 is( digest_data_b64('Keccak512', ""), "DqtC3kw865I1/JGs/+dGspwpqMNmt8YOTmfEZvNqQwTAD6nK+dh5drpGm8vgZxO0NfCR7ydp+xYM2rM9NnBoDg==", 'keccak512 (digest_data_b64/1)');
35 is( digest_data_b64u('Keccak512', ""), "DqtC3kw865I1_JGs_-dGspwpqMNmt8YOTmfEZvNqQwTAD6nK-dh5drpGm8vgZxO0NfCR7ydp-xYM2rM9NnBoDg", 'keccak512 (digest_data_b64u/1)');
36 is( Crypt::Digest::Keccak512->new->add("")->hexdigest, "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e", 'keccak512 (OO/1)');
37
38 is( keccak512("123"), pack("H*","8ca32d950873fd2b5b34a7d79c4a294b2fd805abe3261beb04fab61a3b4b75609afd6478aa8d34e03f262d68bb09a2ba9d655e228c96723b2854838a6e613b9d"), 'keccak512 (raw/2)');
39 is( keccak512_hex("123"), "8ca32d950873fd2b5b34a7d79c4a294b2fd805abe3261beb04fab61a3b4b75609afd6478aa8d34e03f262d68bb09a2ba9d655e228c96723b2854838a6e613b9d", 'keccak512 (hex/2)');
40 is( keccak512_b64("123"), "jKMtlQhz/StbNKfXnEopSy/YBavjJhvrBPq2GjtLdWCa/WR4qo004D8mLWi7CaK6nWVeIoyWcjsoVIOKbmE7nQ==", 'keccak512 (base64/2)');
41 is( digest_data('Keccak512', "123"), pack("H*","8ca32d950873fd2b5b34a7d79c4a294b2fd805abe3261beb04fab61a3b4b75609afd6478aa8d34e03f262d68bb09a2ba9d655e228c96723b2854838a6e613b9d"), 'keccak512 (digest_data_raw/2)');
42 is( digest_data_hex('Keccak512', "123"), "8ca32d950873fd2b5b34a7d79c4a294b2fd805abe3261beb04fab61a3b4b75609afd6478aa8d34e03f262d68bb09a2ba9d655e228c96723b2854838a6e613b9d", 'keccak512 (digest_data_hex/2)');
43 is( digest_data_b64('Keccak512', "123"), "jKMtlQhz/StbNKfXnEopSy/YBavjJhvrBPq2GjtLdWCa/WR4qo004D8mLWi7CaK6nWVeIoyWcjsoVIOKbmE7nQ==", 'keccak512 (digest_data_b64/2)');
44 is( digest_data_b64u('Keccak512', "123"), "jKMtlQhz_StbNKfXnEopSy_YBavjJhvrBPq2GjtLdWCa_WR4qo004D8mLWi7CaK6nWVeIoyWcjsoVIOKbmE7nQ", 'keccak512 (digest_data_b64u/2)');
45 is( Crypt::Digest::Keccak512->new->add("123")->hexdigest, "8ca32d950873fd2b5b34a7d79c4a294b2fd805abe3261beb04fab61a3b4b75609afd6478aa8d34e03f262d68bb09a2ba9d655e228c96723b2854838a6e613b9d", 'keccak512 (OO/2)');
46
47 is( keccak512("test\0test\0test\n"), pack("H*","32c764ac224dfa7a5c8205dada12006a56d15a6377b6fcd65b6e17be8759459ae847d9d7cadf335d4b477541db19883a4d4a7e2dae8f9f8504f4e36cc3417e00"), 'keccak512 (raw/3)');
48 is( keccak512_hex("test\0test\0test\n"), "32c764ac224dfa7a5c8205dada12006a56d15a6377b6fcd65b6e17be8759459ae847d9d7cadf335d4b477541db19883a4d4a7e2dae8f9f8504f4e36cc3417e00", 'keccak512 (hex/3)');
49 is( keccak512_b64("test\0test\0test\n"), "MsdkrCJN+npcggXa2hIAalbRWmN3tvzWW24XvodZRZroR9nXyt8zXUtHdUHbGYg6TUp+La6Pn4UE9ONsw0F+AA==", 'keccak512 (base64/3)');
50 is( digest_data('Keccak512', "test\0test\0test\n"), pack("H*","32c764ac224dfa7a5c8205dada12006a56d15a6377b6fcd65b6e17be8759459ae847d9d7cadf335d4b477541db19883a4d4a7e2dae8f9f8504f4e36cc3417e00"), 'keccak512 (digest_data_raw/3)');
51 is( digest_data_hex('Keccak512', "test\0test\0test\n"), "32c764ac224dfa7a5c8205dada12006a56d15a6377b6fcd65b6e17be8759459ae847d9d7cadf335d4b477541db19883a4d4a7e2dae8f9f8504f4e36cc3417e00", 'keccak512 (digest_data_hex/3)');
52 is( digest_data_b64('Keccak512', "test\0test\0test\n"), "MsdkrCJN+npcggXa2hIAalbRWmN3tvzWW24XvodZRZroR9nXyt8zXUtHdUHbGYg6TUp+La6Pn4UE9ONsw0F+AA==", 'keccak512 (digest_data_b64/3)');
53 is( digest_data_b64u('Keccak512', "test\0test\0test\n"), "MsdkrCJN-npcggXa2hIAalbRWmN3tvzWW24XvodZRZroR9nXyt8zXUtHdUHbGYg6TUp-La6Pn4UE9ONsw0F-AA", 'keccak512 (digest_data_b64u/3)');
54 is( Crypt::Digest::Keccak512->new->add("test\0test\0test\n")->hexdigest, "32c764ac224dfa7a5c8205dada12006a56d15a6377b6fcd65b6e17be8759459ae847d9d7cadf335d4b477541db19883a4d4a7e2dae8f9f8504f4e36cc3417e00", 'keccak512 (OO/3)');
55
56
57 is( keccak512_file('t/data/binary-test.file'), pack("H*","369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8"), 'keccak512 (raw/file/1)');
58 is( keccak512_file_hex('t/data/binary-test.file'), "369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8", 'keccak512 (hex/file/1)');
59 is( keccak512_file_b64('t/data/binary-test.file'), "Npt3nzT16yjLwE9WJOZIl6Y9xeVlLpQU+yTiUvkdTWQ1jR2DfDQ8XzOPav2IjwzMR3DKbDSoHgwPKINrfkBH+A==", 'keccak512 (base64/file/1)');
60 is( digest_file('Keccak512', 't/data/binary-test.file'), pack("H*","369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8"), 'keccak512 (digest_file_raw/file/1)');
61 is( digest_file_hex('Keccak512', 't/data/binary-test.file'), "369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8", 'keccak512 (digest_file_hex/file/1)');
62 is( digest_file_b64('Keccak512', 't/data/binary-test.file'), "Npt3nzT16yjLwE9WJOZIl6Y9xeVlLpQU+yTiUvkdTWQ1jR2DfDQ8XzOPav2IjwzMR3DKbDSoHgwPKINrfkBH+A==", 'keccak512 (digest_file_b64/file/1)');
63 is( digest_file_b64u('Keccak512', 't/data/binary-test.file'), "Npt3nzT16yjLwE9WJOZIl6Y9xeVlLpQU-yTiUvkdTWQ1jR2DfDQ8XzOPav2IjwzMR3DKbDSoHgwPKINrfkBH-A", 'keccak512 (digest_file_b64u/file/1)');
64 is( Crypt::Digest::Keccak512->new->addfile('t/data/binary-test.file')->hexdigest, "369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8", 'keccak512 (OO/file/1)');
65 {
66 open(my $fh, '<', 't/data/binary-test.file');
67 binmode($fh);
68 is( Crypt::Digest::Keccak512->new->addfile($fh)->hexdigest, "369b779f34f5eb28cbc04f5624e64897a63dc5e5652e9414fb24e252f91d4d64358d1d837c343c5f338f6afd888f0ccc4770ca6c34a81e0c0f28836b7e4047f8", 'keccak512 (OO/filehandle/1)');
69 close($fh);
70 }
71
72 is( keccak512_file('t/data/text-CR.file'), pack("H*","6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793"), 'keccak512 (raw/file/2)');
73 is( keccak512_file_hex('t/data/text-CR.file'), "6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793", 'keccak512 (hex/file/2)');
74 is( keccak512_file_b64('t/data/text-CR.file'), "bsa1r5uKNatJkQAChvhbLiU/4A9ZBK1LmZhZxhxQscjyMFD2rZf4e+vY4Oa4J3iWtRI74qP5YetZR1mVLEm3kw==", 'keccak512 (base64/file/2)');
75 is( digest_file('Keccak512', 't/data/text-CR.file'), pack("H*","6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793"), 'keccak512 (digest_file_raw/file/2)');
76 is( digest_file_hex('Keccak512', 't/data/text-CR.file'), "6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793", 'keccak512 (digest_file_hex/file/2)');
77 is( digest_file_b64('Keccak512', 't/data/text-CR.file'), "bsa1r5uKNatJkQAChvhbLiU/4A9ZBK1LmZhZxhxQscjyMFD2rZf4e+vY4Oa4J3iWtRI74qP5YetZR1mVLEm3kw==", 'keccak512 (digest_file_b64/file/2)');
78 is( digest_file_b64u('Keccak512', 't/data/text-CR.file'), "bsa1r5uKNatJkQAChvhbLiU_4A9ZBK1LmZhZxhxQscjyMFD2rZf4e-vY4Oa4J3iWtRI74qP5YetZR1mVLEm3kw", 'keccak512 (digest_file_b64u/file/2)');
79 is( Crypt::Digest::Keccak512->new->addfile('t/data/text-CR.file')->hexdigest, "6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793", 'keccak512 (OO/file/2)');
80 {
81 open(my $fh, '<', 't/data/text-CR.file');
82 binmode($fh);
83 is( Crypt::Digest::Keccak512->new->addfile($fh)->hexdigest, "6ec6b5af9b8a35ab4991000286f85b2e253fe00f5904ad4b999859c61c50b1c8f23050f6ad97f87bebd8e0e6b8277896b5123be2a3f961eb594759952c49b793", 'keccak512 (OO/filehandle/2)');
84 close($fh);
85 }
86
87 is( keccak512_file('t/data/text-CRLF.file'), pack("H*","f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf"), 'keccak512 (raw/file/3)');
88 is( keccak512_file_hex('t/data/text-CRLF.file'), "f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf", 'keccak512 (hex/file/3)');
89 is( keccak512_file_b64('t/data/text-CRLF.file'), "9oYHpqDJhFeAui45xBdI/1cYjZPdm4FAVz8KNVjdT3eo4sg0ipNuQ2APK7L98qc7uicET7UbbBF4f0U75Af7rw==", 'keccak512 (base64/file/3)');
90 is( digest_file('Keccak512', 't/data/text-CRLF.file'), pack("H*","f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf"), 'keccak512 (digest_file_raw/file/3)');
91 is( digest_file_hex('Keccak512', 't/data/text-CRLF.file'), "f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf", 'keccak512 (digest_file_hex/file/3)');
92 is( digest_file_b64('Keccak512', 't/data/text-CRLF.file'), "9oYHpqDJhFeAui45xBdI/1cYjZPdm4FAVz8KNVjdT3eo4sg0ipNuQ2APK7L98qc7uicET7UbbBF4f0U75Af7rw==", 'keccak512 (digest_file_b64/file/3)');
93 is( digest_file_b64u('Keccak512', 't/data/text-CRLF.file'), "9oYHpqDJhFeAui45xBdI_1cYjZPdm4FAVz8KNVjdT3eo4sg0ipNuQ2APK7L98qc7uicET7UbbBF4f0U75Af7rw", 'keccak512 (digest_file_b64u/file/3)');
94 is( Crypt::Digest::Keccak512->new->addfile('t/data/text-CRLF.file')->hexdigest, "f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf", 'keccak512 (OO/file/3)');
95 {
96 open(my $fh, '<', 't/data/text-CRLF.file');
97 binmode($fh);
98 is( Crypt::Digest::Keccak512->new->addfile($fh)->hexdigest, "f68607a6a0c9845780ba2e39c41748ff57188d93dd9b8140573f0a3558dd4f77a8e2c8348a936e43600f2bb2fdf2a73bba27044fb51b6c11787f453be407fbaf", 'keccak512 (OO/filehandle/3)');
99 close($fh);
100 }
101
102 is( keccak512_file('t/data/text-LF.file'), pack("H*","241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446"), 'keccak512 (raw/file/4)');
103 is( keccak512_file_hex('t/data/text-LF.file'), "241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446", 'keccak512 (hex/file/4)');
104 is( keccak512_file_b64('t/data/text-LF.file'), "JB6sQnTNdsYmP6Z5EdP3aK+3kcKA8Dx1f1wtBn6wIOUsSsk04nEs01C/y+ARFOCCTexyFA8DVbYV8SayDFfERg==", 'keccak512 (base64/file/4)');
105 is( digest_file('Keccak512', 't/data/text-LF.file'), pack("H*","241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446"), 'keccak512 (digest_file_raw/file/4)');
106 is( digest_file_hex('Keccak512', 't/data/text-LF.file'), "241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446", 'keccak512 (digest_file_hex/file/4)');
107 is( digest_file_b64('Keccak512', 't/data/text-LF.file'), "JB6sQnTNdsYmP6Z5EdP3aK+3kcKA8Dx1f1wtBn6wIOUsSsk04nEs01C/y+ARFOCCTexyFA8DVbYV8SayDFfERg==", 'keccak512 (digest_file_b64/file/4)');
108 is( digest_file_b64u('Keccak512', 't/data/text-LF.file'), "JB6sQnTNdsYmP6Z5EdP3aK-3kcKA8Dx1f1wtBn6wIOUsSsk04nEs01C_y-ARFOCCTexyFA8DVbYV8SayDFfERg", 'keccak512 (digest_file_b64u/file/4)');
109 is( Crypt::Digest::Keccak512->new->addfile('t/data/text-LF.file')->hexdigest, "241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446", 'keccak512 (OO/file/4)');
110 {
111 open(my $fh, '<', 't/data/text-LF.file');
112 binmode($fh);
113 is( Crypt::Digest::Keccak512->new->addfile($fh)->hexdigest, "241eac4274cd76c6263fa67911d3f768afb791c280f03c757f5c2d067eb020e52c4ac934e2712cd350bfcbe01114e0824dec72140f0355b615f126b20c57c446", 'keccak512 (OO/filehandle/4)');
114 close($fh);
115 }
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::MD2 qw( md2 md2_hex md2_b64 md2_b64u md2_file md2_file_hex md2_file_b64 md2_file_b64u );
1313 is( Crypt::Digest::MD2->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('MD2')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::MD2->new->hashsize, 16, 'hashsize/6');
16
17 is( md2("A","A","A"), pack("H*","8788c1729761fdad983b830f04b19e86"), 'md2 (raw/tripple_A)');
18 is( md2_hex("A","A","A"), "8788c1729761fdad983b830f04b19e86", 'md2 (hex/tripple_A)');
19 is( md2_b64("A","A","A"), "h4jBcpdh/a2YO4MPBLGehg==", 'md2 (base64/tripple_A)');
20 is( md2_b64u("A","A","A"), "h4jBcpdh_a2YO4MPBLGehg", 'md2 (base64url/tripple_A)');
21 is( digest_data('MD2', "A","A","A"), pack("H*","8788c1729761fdad983b830f04b19e86"), 'md2 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('MD2', "A","A","A"), "8788c1729761fdad983b830f04b19e86", 'md2 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('MD2', "A","A","A"), "h4jBcpdh/a2YO4MPBLGehg==", 'md2 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('MD2', "A","A","A"), "h4jBcpdh_a2YO4MPBLGehg", 'md2 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::MD2->new->add("A","A","A")->hexdigest, "8788c1729761fdad983b830f04b19e86", 'md2 (OO/tripple_A)');
26 is( Crypt::Digest::MD2->new->add("A")->add("A")->add("A")->hexdigest, "8788c1729761fdad983b830f04b19e86", 'md2 (OO3/tripple_A)');
1627
1728
1829 is( md2(""), pack("H*","8350e5a3e24c153df2275c9f80692773"), 'md2 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::MD4 qw( md4 md4_hex md4_b64 md4_b64u md4_file md4_file_hex md4_file_b64 md4_file_b64u );
1313 is( Crypt::Digest::MD4->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('MD4')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::MD4->new->hashsize, 16, 'hashsize/6');
16
17 is( md4("A","A","A"), pack("H*","17c3b38c112ac61c1f0d46555f379f14"), 'md4 (raw/tripple_A)');
18 is( md4_hex("A","A","A"), "17c3b38c112ac61c1f0d46555f379f14", 'md4 (hex/tripple_A)');
19 is( md4_b64("A","A","A"), "F8OzjBEqxhwfDUZVXzefFA==", 'md4 (base64/tripple_A)');
20 is( md4_b64u("A","A","A"), "F8OzjBEqxhwfDUZVXzefFA", 'md4 (base64url/tripple_A)');
21 is( digest_data('MD4', "A","A","A"), pack("H*","17c3b38c112ac61c1f0d46555f379f14"), 'md4 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('MD4', "A","A","A"), "17c3b38c112ac61c1f0d46555f379f14", 'md4 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('MD4', "A","A","A"), "F8OzjBEqxhwfDUZVXzefFA==", 'md4 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('MD4', "A","A","A"), "F8OzjBEqxhwfDUZVXzefFA", 'md4 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::MD4->new->add("A","A","A")->hexdigest, "17c3b38c112ac61c1f0d46555f379f14", 'md4 (OO/tripple_A)');
26 is( Crypt::Digest::MD4->new->add("A")->add("A")->add("A")->hexdigest, "17c3b38c112ac61c1f0d46555f379f14", 'md4 (OO3/tripple_A)');
1627
1728
1829 is( md4(""), pack("H*","31d6cfe0d16ae931b73c59d7e0c089c0"), 'md4 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::MD5 qw( md5 md5_hex md5_b64 md5_b64u md5_file md5_file_hex md5_file_b64 md5_file_b64u );
1313 is( Crypt::Digest::MD5->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('MD5')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::MD5->new->hashsize, 16, 'hashsize/6');
16
17 is( md5("A","A","A"), pack("H*","e1faffb3e614e6c2fba74296962386b7"), 'md5 (raw/tripple_A)');
18 is( md5_hex("A","A","A"), "e1faffb3e614e6c2fba74296962386b7", 'md5 (hex/tripple_A)');
19 is( md5_b64("A","A","A"), "4fr/s+YU5sL7p0KWliOGtw==", 'md5 (base64/tripple_A)');
20 is( md5_b64u("A","A","A"), "4fr_s-YU5sL7p0KWliOGtw", 'md5 (base64url/tripple_A)');
21 is( digest_data('MD5', "A","A","A"), pack("H*","e1faffb3e614e6c2fba74296962386b7"), 'md5 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('MD5', "A","A","A"), "e1faffb3e614e6c2fba74296962386b7", 'md5 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('MD5', "A","A","A"), "4fr/s+YU5sL7p0KWliOGtw==", 'md5 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('MD5', "A","A","A"), "4fr_s-YU5sL7p0KWliOGtw", 'md5 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::MD5->new->add("A","A","A")->hexdigest, "e1faffb3e614e6c2fba74296962386b7", 'md5 (OO/tripple_A)');
26 is( Crypt::Digest::MD5->new->add("A")->add("A")->add("A")->hexdigest, "e1faffb3e614e6c2fba74296962386b7", 'md5 (OO3/tripple_A)');
1627
1728
1829 is( md5(""), pack("H*","d41d8cd98f00b204e9800998ecf8427e"), 'md5 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::RIPEMD128 qw( ripemd128 ripemd128_hex ripemd128_b64 ripemd128_b64u ripemd128_file ripemd128_file_hex ripemd128_file_b64 ripemd128_file_b64u );
1313 is( Crypt::Digest::RIPEMD128->hashsize, 16, 'hashsize/4');
1414 is( Crypt::Digest->new('RIPEMD128')->hashsize, 16, 'hashsize/5');
1515 is( Crypt::Digest::RIPEMD128->new->hashsize, 16, 'hashsize/6');
16
17 is( ripemd128("A","A","A"), pack("H*","c2750c6ca0c35d367de2993c3f55e1df"), 'ripemd128 (raw/tripple_A)');
18 is( ripemd128_hex("A","A","A"), "c2750c6ca0c35d367de2993c3f55e1df", 'ripemd128 (hex/tripple_A)');
19 is( ripemd128_b64("A","A","A"), "wnUMbKDDXTZ94pk8P1Xh3w==", 'ripemd128 (base64/tripple_A)');
20 is( ripemd128_b64u("A","A","A"), "wnUMbKDDXTZ94pk8P1Xh3w", 'ripemd128 (base64url/tripple_A)');
21 is( digest_data('RIPEMD128', "A","A","A"), pack("H*","c2750c6ca0c35d367de2993c3f55e1df"), 'ripemd128 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('RIPEMD128', "A","A","A"), "c2750c6ca0c35d367de2993c3f55e1df", 'ripemd128 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('RIPEMD128', "A","A","A"), "wnUMbKDDXTZ94pk8P1Xh3w==", 'ripemd128 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('RIPEMD128', "A","A","A"), "wnUMbKDDXTZ94pk8P1Xh3w", 'ripemd128 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::RIPEMD128->new->add("A","A","A")->hexdigest, "c2750c6ca0c35d367de2993c3f55e1df", 'ripemd128 (OO/tripple_A)');
26 is( Crypt::Digest::RIPEMD128->new->add("A")->add("A")->add("A")->hexdigest, "c2750c6ca0c35d367de2993c3f55e1df", 'ripemd128 (OO3/tripple_A)');
1627
1728
1829 is( ripemd128(""), pack("H*","cdf26213a150dc3ecb610f18f6b38b46"), 'ripemd128 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::RIPEMD160 qw( ripemd160 ripemd160_hex ripemd160_b64 ripemd160_b64u ripemd160_file ripemd160_file_hex ripemd160_file_b64 ripemd160_file_b64u );
1313 is( Crypt::Digest::RIPEMD160->hashsize, 20, 'hashsize/4');
1414 is( Crypt::Digest->new('RIPEMD160')->hashsize, 20, 'hashsize/5');
1515 is( Crypt::Digest::RIPEMD160->new->hashsize, 20, 'hashsize/6');
16
17 is( ripemd160("A","A","A"), pack("H*","e4e130acc1d2a5a63c17efb1eedbd02be28443d1"), 'ripemd160 (raw/tripple_A)');
18 is( ripemd160_hex("A","A","A"), "e4e130acc1d2a5a63c17efb1eedbd02be28443d1", 'ripemd160 (hex/tripple_A)');
19 is( ripemd160_b64("A","A","A"), "5OEwrMHSpaY8F++x7tvQK+KEQ9E=", 'ripemd160 (base64/tripple_A)');
20 is( ripemd160_b64u("A","A","A"), "5OEwrMHSpaY8F--x7tvQK-KEQ9E", 'ripemd160 (base64url/tripple_A)');
21 is( digest_data('RIPEMD160', "A","A","A"), pack("H*","e4e130acc1d2a5a63c17efb1eedbd02be28443d1"), 'ripemd160 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('RIPEMD160', "A","A","A"), "e4e130acc1d2a5a63c17efb1eedbd02be28443d1", 'ripemd160 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('RIPEMD160', "A","A","A"), "5OEwrMHSpaY8F++x7tvQK+KEQ9E=", 'ripemd160 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('RIPEMD160', "A","A","A"), "5OEwrMHSpaY8F--x7tvQK-KEQ9E", 'ripemd160 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::RIPEMD160->new->add("A","A","A")->hexdigest, "e4e130acc1d2a5a63c17efb1eedbd02be28443d1", 'ripemd160 (OO/tripple_A)');
26 is( Crypt::Digest::RIPEMD160->new->add("A")->add("A")->add("A")->hexdigest, "e4e130acc1d2a5a63c17efb1eedbd02be28443d1", 'ripemd160 (OO3/tripple_A)');
1627
1728
1829 is( ripemd160(""), pack("H*","9c1185a5c5e9fc54612808977ee8f548b2258d31"), 'ripemd160 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::RIPEMD256 qw( ripemd256 ripemd256_hex ripemd256_b64 ripemd256_b64u ripemd256_file ripemd256_file_hex ripemd256_file_b64 ripemd256_file_b64u );
1313 is( Crypt::Digest::RIPEMD256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('RIPEMD256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::RIPEMD256->new->hashsize, 32, 'hashsize/6');
16
17 is( ripemd256("A","A","A"), pack("H*","0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82"), 'ripemd256 (raw/tripple_A)');
18 is( ripemd256_hex("A","A","A"), "0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82", 'ripemd256 (hex/tripple_A)');
19 is( ripemd256_b64("A","A","A"), "DJdlgmMUNdT7xCR1gQWgWmIq4ncm85V3SFjX6isvXYI=", 'ripemd256 (base64/tripple_A)');
20 is( ripemd256_b64u("A","A","A"), "DJdlgmMUNdT7xCR1gQWgWmIq4ncm85V3SFjX6isvXYI", 'ripemd256 (base64url/tripple_A)');
21 is( digest_data('RIPEMD256', "A","A","A"), pack("H*","0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82"), 'ripemd256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('RIPEMD256', "A","A","A"), "0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82", 'ripemd256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('RIPEMD256', "A","A","A"), "DJdlgmMUNdT7xCR1gQWgWmIq4ncm85V3SFjX6isvXYI=", 'ripemd256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('RIPEMD256', "A","A","A"), "DJdlgmMUNdT7xCR1gQWgWmIq4ncm85V3SFjX6isvXYI", 'ripemd256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::RIPEMD256->new->add("A","A","A")->hexdigest, "0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82", 'ripemd256 (OO/tripple_A)');
26 is( Crypt::Digest::RIPEMD256->new->add("A")->add("A")->add("A")->hexdigest, "0c976582631435d4fbc424758105a05a622ae27726f395774858d7ea2b2f5d82", 'ripemd256 (OO3/tripple_A)');
1627
1728
1829 is( ripemd256(""), pack("H*","02ba4c4e5f8ecd1877fc52d64d30e37a2d9774fb1e5d026380ae0168e3c5522d"), 'ripemd256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::RIPEMD320 qw( ripemd320 ripemd320_hex ripemd320_b64 ripemd320_b64u ripemd320_file ripemd320_file_hex ripemd320_file_b64 ripemd320_file_b64u );
1313 is( Crypt::Digest::RIPEMD320->hashsize, 40, 'hashsize/4');
1414 is( Crypt::Digest->new('RIPEMD320')->hashsize, 40, 'hashsize/5');
1515 is( Crypt::Digest::RIPEMD320->new->hashsize, 40, 'hashsize/6');
16
17 is( ripemd320("A","A","A"), pack("H*","4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60"), 'ripemd320 (raw/tripple_A)');
18 is( ripemd320_hex("A","A","A"), "4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60", 'ripemd320 (hex/tripple_A)');
19 is( ripemd320_b64("A","A","A"), "TPNLKIfx3RVD+wzpUL8VX7fJPGPWGtxn6FjBCD/VTkp+HasbmzO6YA==", 'ripemd320 (base64/tripple_A)');
20 is( ripemd320_b64u("A","A","A"), "TPNLKIfx3RVD-wzpUL8VX7fJPGPWGtxn6FjBCD_VTkp-HasbmzO6YA", 'ripemd320 (base64url/tripple_A)');
21 is( digest_data('RIPEMD320', "A","A","A"), pack("H*","4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60"), 'ripemd320 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('RIPEMD320', "A","A","A"), "4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60", 'ripemd320 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('RIPEMD320', "A","A","A"), "TPNLKIfx3RVD+wzpUL8VX7fJPGPWGtxn6FjBCD/VTkp+HasbmzO6YA==", 'ripemd320 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('RIPEMD320', "A","A","A"), "TPNLKIfx3RVD-wzpUL8VX7fJPGPWGtxn6FjBCD_VTkp-HasbmzO6YA", 'ripemd320 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::RIPEMD320->new->add("A","A","A")->hexdigest, "4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60", 'ripemd320 (OO/tripple_A)');
26 is( Crypt::Digest::RIPEMD320->new->add("A")->add("A")->add("A")->hexdigest, "4cf34b2887f1dd1543fb0ce950bf155fb7c93c63d61adc67e858c1083fd54e4a7e1dab1b9b33ba60", 'ripemd320 (OO3/tripple_A)');
1627
1728
1829 is( ripemd320(""), pack("H*","22d65d5661536cdc75c1fdf5c6de7b41b9f27325ebc61e8557177d705a0ec880151c3a32a00899b8"), 'ripemd320 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA1 qw( sha1 sha1_hex sha1_b64 sha1_b64u sha1_file sha1_file_hex sha1_file_b64 sha1_file_b64u );
1313 is( Crypt::Digest::SHA1->hashsize, 20, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA1')->hashsize, 20, 'hashsize/5');
1515 is( Crypt::Digest::SHA1->new->hashsize, 20, 'hashsize/6');
16
17 is( sha1("A","A","A"), pack("H*","606ec6e9bd8a8ff2ad14e5fade3f264471e82251"), 'sha1 (raw/tripple_A)');
18 is( sha1_hex("A","A","A"), "606ec6e9bd8a8ff2ad14e5fade3f264471e82251", 'sha1 (hex/tripple_A)');
19 is( sha1_b64("A","A","A"), "YG7G6b2Kj/KtFOX63j8mRHHoIlE=", 'sha1 (base64/tripple_A)');
20 is( sha1_b64u("A","A","A"), "YG7G6b2Kj_KtFOX63j8mRHHoIlE", 'sha1 (base64url/tripple_A)');
21 is( digest_data('SHA1', "A","A","A"), pack("H*","606ec6e9bd8a8ff2ad14e5fade3f264471e82251"), 'sha1 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA1', "A","A","A"), "606ec6e9bd8a8ff2ad14e5fade3f264471e82251", 'sha1 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA1', "A","A","A"), "YG7G6b2Kj/KtFOX63j8mRHHoIlE=", 'sha1 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA1', "A","A","A"), "YG7G6b2Kj_KtFOX63j8mRHHoIlE", 'sha1 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA1->new->add("A","A","A")->hexdigest, "606ec6e9bd8a8ff2ad14e5fade3f264471e82251", 'sha1 (OO/tripple_A)');
26 is( Crypt::Digest::SHA1->new->add("A")->add("A")->add("A")->hexdigest, "606ec6e9bd8a8ff2ad14e5fade3f264471e82251", 'sha1 (OO3/tripple_A)');
1627
1728
1829 is( sha1(""), pack("H*","da39a3ee5e6b4b0d3255bfef95601890afd80709"), 'sha1 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA224 qw( sha224 sha224_hex sha224_b64 sha224_b64u sha224_file sha224_file_hex sha224_file_b64 sha224_file_b64u );
1313 is( Crypt::Digest::SHA224->hashsize, 28, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA224')->hashsize, 28, 'hashsize/5');
1515 is( Crypt::Digest::SHA224->new->hashsize, 28, 'hashsize/6');
16
17 is( sha224("A","A","A"), pack("H*","808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018"), 'sha224 (raw/tripple_A)');
18 is( sha224_hex("A","A","A"), "808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018", 'sha224 (hex/tripple_A)');
19 is( sha224_b64("A","A","A"), "gIdRr195NvINHHlQjZjAeeQuwmgC7iOKWkhgGA==", 'sha224 (base64/tripple_A)');
20 is( sha224_b64u("A","A","A"), "gIdRr195NvINHHlQjZjAeeQuwmgC7iOKWkhgGA", 'sha224 (base64url/tripple_A)');
21 is( digest_data('SHA224', "A","A","A"), pack("H*","808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018"), 'sha224 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA224', "A","A","A"), "808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018", 'sha224 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA224', "A","A","A"), "gIdRr195NvINHHlQjZjAeeQuwmgC7iOKWkhgGA==", 'sha224 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA224', "A","A","A"), "gIdRr195NvINHHlQjZjAeeQuwmgC7iOKWkhgGA", 'sha224 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA224->new->add("A","A","A")->hexdigest, "808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018", 'sha224 (OO/tripple_A)');
26 is( Crypt::Digest::SHA224->new->add("A")->add("A")->add("A")->hexdigest, "808751af5f7936f20d1c79508d98c079e42ec26802ee238a5a486018", 'sha224 (OO3/tripple_A)');
1627
1728
1829 is( sha224(""), pack("H*","d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"), 'sha224 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA256 qw( sha256 sha256_hex sha256_b64 sha256_b64u sha256_file sha256_file_hex sha256_file_b64 sha256_file_b64u );
1313 is( Crypt::Digest::SHA256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::SHA256->new->hashsize, 32, 'hashsize/6');
16
17 is( sha256("A","A","A"), pack("H*","cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358"), 'sha256 (raw/tripple_A)');
18 is( sha256_hex("A","A","A"), "cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358", 'sha256 (hex/tripple_A)');
19 is( sha256_b64("A","A","A"), "yxrSEZ2Pr7aVZlEO5xJmH58UuDOFAG75KuxH9SOjg1g=", 'sha256 (base64/tripple_A)');
20 is( sha256_b64u("A","A","A"), "yxrSEZ2Pr7aVZlEO5xJmH58UuDOFAG75KuxH9SOjg1g", 'sha256 (base64url/tripple_A)');
21 is( digest_data('SHA256', "A","A","A"), pack("H*","cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358"), 'sha256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA256', "A","A","A"), "cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358", 'sha256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA256', "A","A","A"), "yxrSEZ2Pr7aVZlEO5xJmH58UuDOFAG75KuxH9SOjg1g=", 'sha256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA256', "A","A","A"), "yxrSEZ2Pr7aVZlEO5xJmH58UuDOFAG75KuxH9SOjg1g", 'sha256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA256->new->add("A","A","A")->hexdigest, "cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358", 'sha256 (OO/tripple_A)');
26 is( Crypt::Digest::SHA256->new->add("A")->add("A")->add("A")->hexdigest, "cb1ad2119d8fafb69566510ee712661f9f14b83385006ef92aec47f523a38358", 'sha256 (OO3/tripple_A)');
1627
1728
1829 is( sha256(""), pack("H*","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"), 'sha256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA384 qw( sha384 sha384_hex sha384_b64 sha384_b64u sha384_file sha384_file_hex sha384_file_b64 sha384_file_b64u );
1313 is( Crypt::Digest::SHA384->hashsize, 48, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA384')->hashsize, 48, 'hashsize/5');
1515 is( Crypt::Digest::SHA384->new->hashsize, 48, 'hashsize/6');
16
17 is( sha384("A","A","A"), pack("H*","8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe"), 'sha384 (raw/tripple_A)');
18 is( sha384_hex("A","A","A"), "8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe", 'sha384 (hex/tripple_A)');
19 is( sha384_b64("A","A","A"), "ilt8GbzRcE1SH4a5YY2G3g7Uj6KXEa1NFiMPfSazYRG+r3/v6LO+ehfODhQMoAL+", 'sha384 (base64/tripple_A)');
20 is( sha384_b64u("A","A","A"), "ilt8GbzRcE1SH4a5YY2G3g7Uj6KXEa1NFiMPfSazYRG-r3_v6LO-ehfODhQMoAL-", 'sha384 (base64url/tripple_A)');
21 is( digest_data('SHA384', "A","A","A"), pack("H*","8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe"), 'sha384 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA384', "A","A","A"), "8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe", 'sha384 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA384', "A","A","A"), "ilt8GbzRcE1SH4a5YY2G3g7Uj6KXEa1NFiMPfSazYRG+r3/v6LO+ehfODhQMoAL+", 'sha384 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA384', "A","A","A"), "ilt8GbzRcE1SH4a5YY2G3g7Uj6KXEa1NFiMPfSazYRG-r3_v6LO-ehfODhQMoAL-", 'sha384 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA384->new->add("A","A","A")->hexdigest, "8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe", 'sha384 (OO/tripple_A)');
26 is( Crypt::Digest::SHA384->new->add("A")->add("A")->add("A")->hexdigest, "8a5b7c19bcd1704d521f86b9618d86de0ed48fa29711ad4d16230f7d26b36111beaf7fefe8b3be7a17ce0e140ca002fe", 'sha384 (OO3/tripple_A)');
1627
1728
1829 is( sha384(""), pack("H*","38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"), 'sha384 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA3_224 qw( sha3_224 sha3_224_hex sha3_224_b64 sha3_224_b64u sha3_224_file sha3_224_file_hex sha3_224_file_b64 sha3_224_file_b64u );
1313 is( Crypt::Digest::SHA3_224->hashsize, 28, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA3_224')->hashsize, 28, 'hashsize/5');
1515 is( Crypt::Digest::SHA3_224->new->hashsize, 28, 'hashsize/6');
16
17 is( sha3_224("A","A","A"), pack("H*","c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b"), 'sha3_224 (raw/tripple_A)');
18 is( sha3_224_hex("A","A","A"), "c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b", 'sha3_224 (hex/tripple_A)');
19 is( sha3_224_b64("A","A","A"), "wJ1a99mgIcSEBBIY88N4f9QnS2T/0BLtyg/lWw==", 'sha3_224 (base64/tripple_A)');
20 is( sha3_224_b64u("A","A","A"), "wJ1a99mgIcSEBBIY88N4f9QnS2T_0BLtyg_lWw", 'sha3_224 (base64url/tripple_A)');
21 is( digest_data('SHA3_224', "A","A","A"), pack("H*","c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b"), 'sha3_224 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA3_224', "A","A","A"), "c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b", 'sha3_224 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA3_224', "A","A","A"), "wJ1a99mgIcSEBBIY88N4f9QnS2T/0BLtyg/lWw==", 'sha3_224 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA3_224', "A","A","A"), "wJ1a99mgIcSEBBIY88N4f9QnS2T_0BLtyg_lWw", 'sha3_224 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA3_224->new->add("A","A","A")->hexdigest, "c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b", 'sha3_224 (OO/tripple_A)');
26 is( Crypt::Digest::SHA3_224->new->add("A")->add("A")->add("A")->hexdigest, "c09d5af7d9a021c484041218f3c3787fd4274b64ffd012edca0fe55b", 'sha3_224 (OO3/tripple_A)');
1627
1728
1829 is( sha3_224(""), pack("H*","6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7"), 'sha3_224 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA3_256 qw( sha3_256 sha3_256_hex sha3_256_b64 sha3_256_b64u sha3_256_file sha3_256_file_hex sha3_256_file_b64 sha3_256_file_b64u );
1313 is( Crypt::Digest::SHA3_256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA3_256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::SHA3_256->new->hashsize, 32, 'hashsize/6');
16
17 is( sha3_256("A","A","A"), pack("H*","7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa"), 'sha3_256 (raw/tripple_A)');
18 is( sha3_256_hex("A","A","A"), "7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa", 'sha3_256 (hex/tripple_A)');
19 is( sha3_256_b64("A","A","A"), "fcuCeh9afL6kI+djp90MeCTjUSx/HOSM1XEPYDtPHvo=", 'sha3_256 (base64/tripple_A)');
20 is( sha3_256_b64u("A","A","A"), "fcuCeh9afL6kI-djp90MeCTjUSx_HOSM1XEPYDtPHvo", 'sha3_256 (base64url/tripple_A)');
21 is( digest_data('SHA3_256', "A","A","A"), pack("H*","7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa"), 'sha3_256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA3_256', "A","A","A"), "7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa", 'sha3_256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA3_256', "A","A","A"), "fcuCeh9afL6kI+djp90MeCTjUSx/HOSM1XEPYDtPHvo=", 'sha3_256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA3_256', "A","A","A"), "fcuCeh9afL6kI-djp90MeCTjUSx_HOSM1XEPYDtPHvo", 'sha3_256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA3_256->new->add("A","A","A")->hexdigest, "7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa", 'sha3_256 (OO/tripple_A)');
26 is( Crypt::Digest::SHA3_256->new->add("A")->add("A")->add("A")->hexdigest, "7dcb827a1f5a7cbea423e763a7dd0c7824e3512c7f1ce48cd5710f603b4f1efa", 'sha3_256 (OO3/tripple_A)');
1627
1728
1829 is( sha3_256(""), pack("H*","a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a"), 'sha3_256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA3_384 qw( sha3_384 sha3_384_hex sha3_384_b64 sha3_384_b64u sha3_384_file sha3_384_file_hex sha3_384_file_b64 sha3_384_file_b64u );
1313 is( Crypt::Digest::SHA3_384->hashsize, 48, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA3_384')->hashsize, 48, 'hashsize/5');
1515 is( Crypt::Digest::SHA3_384->new->hashsize, 48, 'hashsize/6');
16
17 is( sha3_384("A","A","A"), pack("H*","3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4"), 'sha3_384 (raw/tripple_A)');
18 is( sha3_384_hex("A","A","A"), "3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4", 'sha3_384 (hex/tripple_A)');
19 is( sha3_384_b64("A","A","A"), "NVXtimNLI1+wemkeGTSz6BIoyFm8HBes3rtLq4LNY/BuF8rtWFUztGFbxuP7LgvE", 'sha3_384 (base64/tripple_A)');
20 is( sha3_384_b64u("A","A","A"), "NVXtimNLI1-wemkeGTSz6BIoyFm8HBes3rtLq4LNY_BuF8rtWFUztGFbxuP7LgvE", 'sha3_384 (base64url/tripple_A)');
21 is( digest_data('SHA3_384', "A","A","A"), pack("H*","3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4"), 'sha3_384 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA3_384', "A","A","A"), "3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4", 'sha3_384 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA3_384', "A","A","A"), "NVXtimNLI1+wemkeGTSz6BIoyFm8HBes3rtLq4LNY/BuF8rtWFUztGFbxuP7LgvE", 'sha3_384 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA3_384', "A","A","A"), "NVXtimNLI1-wemkeGTSz6BIoyFm8HBes3rtLq4LNY_BuF8rtWFUztGFbxuP7LgvE", 'sha3_384 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA3_384->new->add("A","A","A")->hexdigest, "3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4", 'sha3_384 (OO/tripple_A)');
26 is( Crypt::Digest::SHA3_384->new->add("A")->add("A")->add("A")->hexdigest, "3555ed8a634b235fb07a691e1934b3e81228c859bc1c17acdebb4bab82cd63f06e17caed585533b4615bc6e3fb2e0bc4", 'sha3_384 (OO3/tripple_A)');
1627
1728
1829 is( sha3_384(""), pack("H*","0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004"), 'sha3_384 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA3_512 qw( sha3_512 sha3_512_hex sha3_512_b64 sha3_512_b64u sha3_512_file sha3_512_file_hex sha3_512_file_b64 sha3_512_file_b64u );
1313 is( Crypt::Digest::SHA3_512->hashsize, 64, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA3_512')->hashsize, 64, 'hashsize/5');
1515 is( Crypt::Digest::SHA3_512->new->hashsize, 64, 'hashsize/6');
16
17 is( sha3_512("A","A","A"), pack("H*","852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857"), 'sha3_512 (raw/tripple_A)');
18 is( sha3_512_hex("A","A","A"), "852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857", 'sha3_512 (hex/tripple_A)');
19 is( sha3_512_b64("A","A","A"), "hSz0TrjThxXIR5drbeUmVkE211b6mbStWoJf1uO6XYkce0V2sRQQpulR//ozmbFL4dpCItU7WjX/I21lmJnoVw==", 'sha3_512 (base64/tripple_A)');
20 is( sha3_512_b64u("A","A","A"), "hSz0TrjThxXIR5drbeUmVkE211b6mbStWoJf1uO6XYkce0V2sRQQpulR__ozmbFL4dpCItU7WjX_I21lmJnoVw", 'sha3_512 (base64url/tripple_A)');
21 is( digest_data('SHA3_512', "A","A","A"), pack("H*","852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857"), 'sha3_512 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA3_512', "A","A","A"), "852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857", 'sha3_512 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA3_512', "A","A","A"), "hSz0TrjThxXIR5drbeUmVkE211b6mbStWoJf1uO6XYkce0V2sRQQpulR//ozmbFL4dpCItU7WjX/I21lmJnoVw==", 'sha3_512 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA3_512', "A","A","A"), "hSz0TrjThxXIR5drbeUmVkE211b6mbStWoJf1uO6XYkce0V2sRQQpulR__ozmbFL4dpCItU7WjX_I21lmJnoVw", 'sha3_512 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA3_512->new->add("A","A","A")->hexdigest, "852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857", 'sha3_512 (OO/tripple_A)');
26 is( Crypt::Digest::SHA3_512->new->add("A")->add("A")->add("A")->hexdigest, "852cf44eb8d38715c847976b6de526564136d756fa99b4ad5a825fd6e3ba5d891c7b4576b11410a6e951fffa3399b14be1da4222d53b5a35ff236d659899e857", 'sha3_512 (OO3/tripple_A)');
1627
1728
1829 is( sha3_512(""), pack("H*","a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26"), 'sha3_512 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA512 qw( sha512 sha512_hex sha512_b64 sha512_b64u sha512_file sha512_file_hex sha512_file_b64 sha512_file_b64u );
1313 is( Crypt::Digest::SHA512->hashsize, 64, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA512')->hashsize, 64, 'hashsize/5');
1515 is( Crypt::Digest::SHA512->new->hashsize, 64, 'hashsize/6');
16
17 is( sha512("A","A","A"), pack("H*","8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385"), 'sha512 (raw/tripple_A)');
18 is( sha512_hex("A","A","A"), "8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385", 'sha512 (hex/tripple_A)');
19 is( sha512_b64("A","A","A"), "jXCNGLVN85YtaW8GmtQtrXditdTTyX7l+i2uBnPtRlRRZMB4uNs9WcS5YCDkMW8Xuz2Rvx9rwIlrvnVBbrjDhQ==", 'sha512 (base64/tripple_A)');
20 is( sha512_b64u("A","A","A"), "jXCNGLVN85YtaW8GmtQtrXditdTTyX7l-i2uBnPtRlRRZMB4uNs9WcS5YCDkMW8Xuz2Rvx9rwIlrvnVBbrjDhQ", 'sha512 (base64url/tripple_A)');
21 is( digest_data('SHA512', "A","A","A"), pack("H*","8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385"), 'sha512 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA512', "A","A","A"), "8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385", 'sha512 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA512', "A","A","A"), "jXCNGLVN85YtaW8GmtQtrXditdTTyX7l+i2uBnPtRlRRZMB4uNs9WcS5YCDkMW8Xuz2Rvx9rwIlrvnVBbrjDhQ==", 'sha512 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA512', "A","A","A"), "jXCNGLVN85YtaW8GmtQtrXditdTTyX7l-i2uBnPtRlRRZMB4uNs9WcS5YCDkMW8Xuz2Rvx9rwIlrvnVBbrjDhQ", 'sha512 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA512->new->add("A","A","A")->hexdigest, "8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385", 'sha512 (OO/tripple_A)');
26 is( Crypt::Digest::SHA512->new->add("A")->add("A")->add("A")->hexdigest, "8d708d18b54df3962d696f069ad42dad7762b5d4d3c97ee5fa2dae0673ed46545164c078b8db3d59c4b96020e4316f17bb3d91bf1f6bc0896bbe75416eb8c385", 'sha512 (OO3/tripple_A)');
1627
1728
1829 is( sha512(""), pack("H*","cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"), 'sha512 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA512_224 qw( sha512_224 sha512_224_hex sha512_224_b64 sha512_224_b64u sha512_224_file sha512_224_file_hex sha512_224_file_b64 sha512_224_file_b64u );
1313 is( Crypt::Digest::SHA512_224->hashsize, 28, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA512_224')->hashsize, 28, 'hashsize/5');
1515 is( Crypt::Digest::SHA512_224->new->hashsize, 28, 'hashsize/6');
16
17 is( sha512_224("A","A","A"), pack("H*","3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3"), 'sha512_224 (raw/tripple_A)');
18 is( sha512_224_hex("A","A","A"), "3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3", 'sha512_224 (hex/tripple_A)');
19 is( sha512_224_b64("A","A","A"), "PVoLdC9MYdMVxs6GRXqfowkDiA0wVYxozkcTsw==", 'sha512_224 (base64/tripple_A)');
20 is( sha512_224_b64u("A","A","A"), "PVoLdC9MYdMVxs6GRXqfowkDiA0wVYxozkcTsw", 'sha512_224 (base64url/tripple_A)');
21 is( digest_data('SHA512_224', "A","A","A"), pack("H*","3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3"), 'sha512_224 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA512_224', "A","A","A"), "3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3", 'sha512_224 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA512_224', "A","A","A"), "PVoLdC9MYdMVxs6GRXqfowkDiA0wVYxozkcTsw==", 'sha512_224 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA512_224', "A","A","A"), "PVoLdC9MYdMVxs6GRXqfowkDiA0wVYxozkcTsw", 'sha512_224 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA512_224->new->add("A","A","A")->hexdigest, "3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3", 'sha512_224 (OO/tripple_A)');
26 is( Crypt::Digest::SHA512_224->new->add("A")->add("A")->add("A")->hexdigest, "3d5a0b742f4c61d315c6ce86457a9fa30903880d30558c68ce4713b3", 'sha512_224 (OO3/tripple_A)');
1627
1728
1829 is( sha512_224(""), pack("H*","6ed0dd02806fa89e25de060c19d3ac86cabb87d6a0ddd05c333b84f4"), 'sha512_224 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::SHA512_256 qw( sha512_256 sha512_256_hex sha512_256_b64 sha512_256_b64u sha512_256_file sha512_256_file_hex sha512_256_file_b64 sha512_256_file_b64u );
1313 is( Crypt::Digest::SHA512_256->hashsize, 32, 'hashsize/4');
1414 is( Crypt::Digest->new('SHA512_256')->hashsize, 32, 'hashsize/5');
1515 is( Crypt::Digest::SHA512_256->new->hashsize, 32, 'hashsize/6');
16
17 is( sha512_256("A","A","A"), pack("H*","b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4"), 'sha512_256 (raw/tripple_A)');
18 is( sha512_256_hex("A","A","A"), "b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4", 'sha512_256 (hex/tripple_A)');
19 is( sha512_256_b64("A","A","A"), "sopilp2LmwIpe6YVxIW+Lf/vkHykGcKklABAJtbEvfQ=", 'sha512_256 (base64/tripple_A)');
20 is( sha512_256_b64u("A","A","A"), "sopilp2LmwIpe6YVxIW-Lf_vkHykGcKklABAJtbEvfQ", 'sha512_256 (base64url/tripple_A)');
21 is( digest_data('SHA512_256', "A","A","A"), pack("H*","b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4"), 'sha512_256 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('SHA512_256', "A","A","A"), "b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4", 'sha512_256 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('SHA512_256', "A","A","A"), "sopilp2LmwIpe6YVxIW+Lf/vkHykGcKklABAJtbEvfQ=", 'sha512_256 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('SHA512_256', "A","A","A"), "sopilp2LmwIpe6YVxIW-Lf_vkHykGcKklABAJtbEvfQ", 'sha512_256 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::SHA512_256->new->add("A","A","A")->hexdigest, "b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4", 'sha512_256 (OO/tripple_A)');
26 is( Crypt::Digest::SHA512_256->new->add("A")->add("A")->add("A")->hexdigest, "b28a62969d8b9b02297ba615c485be2dffef907ca419c2a494004026d6c4bdf4", 'sha512_256 (OO3/tripple_A)');
1627
1728
1829 is( sha512_256(""), pack("H*","c672b8d1ef56ed28ab87c3622c5114069bdd3ad7b8f9737498d0c01ecef0967a"), 'sha512_256 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::Tiger192 qw( tiger192 tiger192_hex tiger192_b64 tiger192_b64u tiger192_file tiger192_file_hex tiger192_file_b64 tiger192_file_b64u );
1313 is( Crypt::Digest::Tiger192->hashsize, 24, 'hashsize/4');
1414 is( Crypt::Digest->new('Tiger192')->hashsize, 24, 'hashsize/5');
1515 is( Crypt::Digest::Tiger192->new->hashsize, 24, 'hashsize/6');
16
17 is( tiger192("A","A","A"), pack("H*","04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9"), 'tiger192 (raw/tripple_A)');
18 is( tiger192_hex("A","A","A"), "04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9", 'tiger192 (hex/tripple_A)');
19 is( tiger192_b64("A","A","A"), "BGgiU6zE5gkgFCKtUK1r4sUc8WmLCkHJ", 'tiger192 (base64/tripple_A)');
20 is( tiger192_b64u("A","A","A"), "BGgiU6zE5gkgFCKtUK1r4sUc8WmLCkHJ", 'tiger192 (base64url/tripple_A)');
21 is( digest_data('Tiger192', "A","A","A"), pack("H*","04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9"), 'tiger192 (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Tiger192', "A","A","A"), "04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9", 'tiger192 (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Tiger192', "A","A","A"), "BGgiU6zE5gkgFCKtUK1r4sUc8WmLCkHJ", 'tiger192 (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Tiger192', "A","A","A"), "BGgiU6zE5gkgFCKtUK1r4sUc8WmLCkHJ", 'tiger192 (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Tiger192->new->add("A","A","A")->hexdigest, "04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9", 'tiger192 (OO/tripple_A)');
26 is( Crypt::Digest::Tiger192->new->add("A")->add("A")->add("A")->hexdigest, "04682253acc4e609201422ad50ad6be2c51cf1698b0a41c9", 'tiger192 (OO3/tripple_A)');
1627
1728
1829 is( tiger192(""), pack("H*","3293ac630c13f0245f92bbb1766e16167a4e58492dde73f3"), 'tiger192 (raw/1)');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 8*3 + 9*4 + 6;
5 use Test::More tests => 8*3 + 9*4 + 10 + 6;
66
77 use Crypt::Digest qw( digest_data digest_data_hex digest_data_b64 digest_data_b64u digest_file digest_file_hex digest_file_b64 digest_file_b64u );
88 use Crypt::Digest::Whirlpool qw( whirlpool whirlpool_hex whirlpool_b64 whirlpool_b64u whirlpool_file whirlpool_file_hex whirlpool_file_b64 whirlpool_file_b64u );
1313 is( Crypt::Digest::Whirlpool->hashsize, 64, 'hashsize/4');
1414 is( Crypt::Digest->new('Whirlpool')->hashsize, 64, 'hashsize/5');
1515 is( Crypt::Digest::Whirlpool->new->hashsize, 64, 'hashsize/6');
16
17 is( whirlpool("A","A","A"), pack("H*","a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64"), 'whirlpool (raw/tripple_A)');
18 is( whirlpool_hex("A","A","A"), "a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64", 'whirlpool (hex/tripple_A)');
19 is( whirlpool_b64("A","A","A"), "pN6jjHQ/MY23Fp4orCev8XOUK2e1b5iB2kZL2sSPR8xIHuKXRlV88BPRxUx6dpEsE4CxaCUd9xGCk1Ef2JqaZA==", 'whirlpool (base64/tripple_A)');
20 is( whirlpool_b64u("A","A","A"), "pN6jjHQ_MY23Fp4orCev8XOUK2e1b5iB2kZL2sSPR8xIHuKXRlV88BPRxUx6dpEsE4CxaCUd9xGCk1Ef2JqaZA", 'whirlpool (base64url/tripple_A)');
21 is( digest_data('Whirlpool', "A","A","A"), pack("H*","a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64"), 'whirlpool (digest_data_raw/tripple_A)');
22 is( digest_data_hex('Whirlpool', "A","A","A"), "a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64", 'whirlpool (digest_data_hex/tripple_A)');
23 is( digest_data_b64('Whirlpool', "A","A","A"), "pN6jjHQ/MY23Fp4orCev8XOUK2e1b5iB2kZL2sSPR8xIHuKXRlV88BPRxUx6dpEsE4CxaCUd9xGCk1Ef2JqaZA==", 'whirlpool (digest_data_b64/tripple_A)');
24 is( digest_data_b64u('Whirlpool', "A","A","A"), "pN6jjHQ_MY23Fp4orCev8XOUK2e1b5iB2kZL2sSPR8xIHuKXRlV88BPRxUx6dpEsE4CxaCUd9xGCk1Ef2JqaZA", 'whirlpool (digest_data_b64u/tripple_A)');
25 is( Crypt::Digest::Whirlpool->new->add("A","A","A")->hexdigest, "a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64", 'whirlpool (OO/tripple_A)');
26 is( Crypt::Digest::Whirlpool->new->add("A")->add("A")->add("A")->hexdigest, "a4dea38c743f318db7169e28ac27aff173942b67b56f9881da464bdac48f47cc481ee29746557cf013d1c54c7a76912c1380b168251df7118293511fd89a9a64", 'whirlpool (OO3/tripple_A)');
1627
1728
1829 is( whirlpool(""), pack("H*","19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3"), 'whirlpool (raw/1)');
146146 curve_cofactor => 1,
147147 curve_Gx => "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
148148 curve_Gy => "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
149 curve_name => "secp256r1",
149 curve_oid => "1.2.840.10045.3.1.7",
150150 curve_order => "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
151151 curve_prime => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
152152 k => "F3BD0C07A81FB932781ED52752F60CC89A6BE5E51934FE01938DDB55D8F77801",
166166 curve_cofactor => 1,
167167 curve_Gx => "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296",
168168 curve_Gy => "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5",
169 curve_name => "secp256r1",
169 curve_oid => "1.2.840.10045.3.1.7",
170170 curve_order => "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551",
171171 curve_prime => "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF",
172172 k => "",
182182 is($kh->{pub_x}, $EC1->{pub_x}, "EC x test HASH1");
183183 is($kh->{pub_y}, $EC1->{pub_y}, "EC y test HASH1");
184184 is($kh->{k}, $EC1->{k}, "EC k test HASH1");
185 is($kh->{curve_name}, "secp256r1", "EC curve test HASH1");
185 is($kh->{curve_oid}, "1.2.840.10045.3.1.7", "EC curve test HASH1");
186186 ok($ec->is_private, "EC private test HASH1");
187187 my $jwk = $ec->export_key_jwk('private');
188188 my $jwkp = $ec->export_key_jwk('public');
204204 is($kh->{pub_x}, $EC1->{pub_x}, "EC x test JWK1");
205205 is($kh->{pub_y}, $EC1->{pub_y}, "EC y test JWK1");
206206 is($kh->{k}, $EC1->{k}, "EC k test JWK1");
207 is($kh->{curve_name}, "secp256r1", "EC curve test JWK1");
207 is($kh->{curve_oid}, "1.2.840.10045.3.1.7", "EC curve test JWK1");
208208 ok($ec->is_private, "EC private test JWK1");
209209 $jwk_tp = $ec->export_key_jwk_thumbprint('SHA256');
210210 is($jwk_tp, $ec1_jwk_thumbprint_sha256, 'export_key_jwk_thumbprint(SHA256)');
214214 is($kh->{pub_x}, $EC1->{pub_x}, "EC x test JWK2");
215215 is($kh->{pub_y}, $EC1->{pub_y}, "EC y test JWK2");
216216 is($kh->{k}, "", "EC k test JWK2");
217 is($kh->{curve_name}, "secp256r1", "EC curve test JWK2");
217 is($kh->{curve_oid}, "1.2.840.10045.3.1.7", "EC curve test JWK2");
218218 ok(!$ec->is_private, "EC !private test JWK2");
219219 $jwk_tp = $ec->export_key_jwk_thumbprint('SHA256');
220220 is($jwk_tp, $ec1_jwk_thumbprint_sha256, 'export_key_jwk_thumbprint(SHA256)');
226226 is($kh->{pub_x}, $EC1->{pub_x}, "EC x test HASH2");
227227 is($kh->{pub_y}, $EC1->{pub_y}, "EC y test HASH2");
228228 is($kh->{k}, "", "EC k test HASH2");
229 is($kh->{curve_name}, "secp256r1", "EC curve test HASH2");
229 is($kh->{curve_oid}, "1.2.840.10045.3.1.7", "EC curve test HASH2");
230230 ok(!$ec->is_private, "EC private test HASH2");
231231 }
232232
22 use strict;
33 use warnings;
44
5 use Test::More tests => 36;
5 use Test::More tests => 36 + 8;
66
77 use Crypt::Mac::BLAKE2b qw( blake2b blake2b_hex blake2b_b64 blake2b_b64u );
88
4242 is( blake2b_hex(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'dc29010f123a4cd59c91da5fc494375962502ca2179021ebca2f6dd41befa8d2', 'BLAKE2b/func+hex/6');
4343 is( blake2b_b64(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), '3CkBDxI6TNWckdpfxJQ3WWJQLKIXkCHryi9t1BvvqNI=', 'BLAKE2b/func+b64/6');
4444 is( blake2b_b64u(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), '3CkBDxI6TNWckdpfxJQ3WWJQLKIXkCHryi9t1BvvqNI', 'BLAKE2b/func+b64u/6');
45
46 is( unpack('H*', Crypt::Mac::BLAKE2b->new(32, '12345678901234561234567890123456')->add("A","A","A")->mac), '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/oo+raw/tripple_A');
47 is( unpack('H*', Crypt::Mac::BLAKE2b->new(32, '12345678901234561234567890123456')->add("A")->add("A")->add("A")->mac), '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/oo3+raw/tripple_A');
48 is( Crypt::Mac::BLAKE2b->new(32, '12345678901234561234567890123456')->add("A","A","A")->hexmac, '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/oo+hex/tripple_A');
49 is( Crypt::Mac::BLAKE2b->new(32, '12345678901234561234567890123456')->add("A")->add("A")->add("A")->hexmac, '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/oo3+hex/tripple_A');
50 is( unpack('H*', blake2b(32, '12345678901234561234567890123456',"A","A","A")), '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/func+raw/tripple_A');
51 is( blake2b_hex (32, '12345678901234561234567890123456',"A","A","A"), '794a20cc22c1f9f278aa1219ded10105cc9cfd264e66a327f32fbc309b2d404f', 'BLAKE2b/func+hex/tripple_A');
52 is( blake2b_b64 (32, '12345678901234561234567890123456',"A","A","A"), 'eUogzCLB+fJ4qhIZ3tEBBcyc/SZOZqMn8y+8MJstQE8=', 'BLAKE2b/func+b64/tripple_A');
53 is( blake2b_b64u(32, '12345678901234561234567890123456',"A","A","A"), 'eUogzCLB-fJ4qhIZ3tEBBcyc_SZOZqMn8y-8MJstQE8', 'BLAKE2b/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 36;
5 use Test::More tests => 36 + 8;
66
77 use Crypt::Mac::BLAKE2s qw( blake2s blake2s_hex blake2s_b64 blake2s_b64u );
88
4242 is( blake2s_hex(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'a31f0e2ba5e73a3aab7e14503690515662758279075d7b68512709824923e65c', 'BLAKE2s/func+hex/6');
4343 is( blake2s_b64(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'ox8OK6XnOjqrfhRQNpBRVmJ1gnkHXXtoUScJgkkj5lw=', 'BLAKE2s/func+b64/6');
4444 is( blake2s_b64u(32,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'ox8OK6XnOjqrfhRQNpBRVmJ1gnkHXXtoUScJgkkj5lw', 'BLAKE2s/func+b64u/6');
45
46 is( unpack('H*', Crypt::Mac::BLAKE2s->new(32, '12345678901234561234567890123456')->add("A","A","A")->mac), '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/oo+raw/tripple_A');
47 is( unpack('H*', Crypt::Mac::BLAKE2s->new(32, '12345678901234561234567890123456')->add("A")->add("A")->add("A")->mac), '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/oo3+raw/tripple_A');
48 is( Crypt::Mac::BLAKE2s->new(32, '12345678901234561234567890123456')->add("A","A","A")->hexmac, '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/oo+hex/tripple_A');
49 is( Crypt::Mac::BLAKE2s->new(32, '12345678901234561234567890123456')->add("A")->add("A")->add("A")->hexmac, '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/oo3+hex/tripple_A');
50 is( unpack('H*', blake2s(32, '12345678901234561234567890123456',"A","A","A")), '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/func+raw/tripple_A');
51 is( blake2s_hex (32, '12345678901234561234567890123456',"A","A","A"), '8acd7813fe7251676d1cf2817c09a25840fa9a1df7143536448a5dfdf7365725', 'BLAKE2s/func+hex/tripple_A');
52 is( blake2s_b64 (32, '12345678901234561234567890123456',"A","A","A"), 'is14E/5yUWdtHPKBfAmiWED6mh33FDU2RIpd/fc2VyU=', 'BLAKE2s/func+b64/tripple_A');
53 is( blake2s_b64u(32, '12345678901234561234567890123456',"A","A","A"), 'is14E_5yUWdtHPKBfAmiWED6mh33FDU2RIpd_fc2VyU', 'BLAKE2s/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::F9 qw( f9 f9_hex f9_b64 f9_b64u );
88
7878 is( f9_hex('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'fa83d84023c43a81', 'F9/func+hex/12');
7979 is( f9_b64('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), '+oPYQCPEOoE=', 'F9/func+b64/12');
8080 is( f9_b64u('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), '-oPYQCPEOoE', 'F9/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::F9->new('AES', '1234567890123456')->add("A","A","A")->mac), 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::F9->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->mac), 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/oo3+raw/tripple_A');
84 is( Crypt::Mac::F9->new('AES', '1234567890123456')->add("A","A","A")->hexmac, 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/oo+hex/tripple_A');
85 is( Crypt::Mac::F9->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->hexmac, 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/oo3+hex/tripple_A');
86 is( unpack('H*', f9('AES', '1234567890123456',"A","A","A")), 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/func+raw/tripple_A');
87 is( f9_hex ('AES', '1234567890123456',"A","A","A"), 'a30e9e0ee8cd9d7401f9a9967e82b5a1', 'F9/func+hex/tripple_A');
88 is( f9_b64 ('AES', '1234567890123456',"A","A","A"), 'ow6eDujNnXQB+amWfoK1oQ==', 'F9/func+b64/tripple_A');
89 is( f9_b64u('AES', '1234567890123456',"A","A","A"), 'ow6eDujNnXQB-amWfoK1oQ', 'F9/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::HMAC qw( hmac hmac_hex hmac_b64 hmac_b64u );
88
7878 is( hmac_hex('Whirlpool','secretkey',"test\0test\0test\n"), 'dab6a22e05b46ce641e022e6ea2b42646a25b994ed15fed09145e3906d159efba37b899c344f589b3ad5868cd631a8eb304d21dedf47e364c791ccfa665681f7', 'HMAC/func+hex/12');
7979 is( hmac_b64('Whirlpool','secretkey',"test\0test\0test\n"), '2raiLgW0bOZB4CLm6itCZGoluZTtFf7QkUXjkG0Vnvuje4mcNE9YmzrVhozWMajrME0h3t9H42THkcz6ZlaB9w==', 'HMAC/func+b64/12');
8080 is( hmac_b64u('Whirlpool','secretkey',"test\0test\0test\n"), '2raiLgW0bOZB4CLm6itCZGoluZTtFf7QkUXjkG0Vnvuje4mcNE9YmzrVhozWMajrME0h3t9H42THkcz6ZlaB9w', 'HMAC/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::HMAC->new('SHA1', 'secretkey')->add("A","A","A")->mac), '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::HMAC->new('SHA1', 'secretkey')->add("A")->add("A")->add("A")->mac), '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/oo3+raw/tripple_A');
84 is( Crypt::Mac::HMAC->new('SHA1', 'secretkey')->add("A","A","A")->hexmac, '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/oo+hex/tripple_A');
85 is( Crypt::Mac::HMAC->new('SHA1', 'secretkey')->add("A")->add("A")->add("A")->hexmac, '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/oo3+hex/tripple_A');
86 is( unpack('H*', hmac('SHA1', 'secretkey',"A","A","A")), '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/func+raw/tripple_A');
87 is( hmac_hex ('SHA1', 'secretkey',"A","A","A"), '99070fd56a6595bbb458747d63808344fed0b9c1', 'HMAC/func+hex/tripple_A');
88 is( hmac_b64 ('SHA1', 'secretkey',"A","A","A"), 'mQcP1Wpllbu0WHR9Y4CDRP7QucE=', 'HMAC/func+b64/tripple_A');
89 is( hmac_b64u('SHA1', 'secretkey',"A","A","A"), 'mQcP1Wpllbu0WHR9Y4CDRP7QucE', 'HMAC/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::OMAC qw( omac omac_hex omac_b64 omac_b64u );
88
7878 is( omac_hex('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), '40e6d018b49ada77', 'OMAC/func+hex/12');
7979 is( omac_b64('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'QObQGLSa2nc=', 'OMAC/func+b64/12');
8080 is( omac_b64u('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'QObQGLSa2nc', 'OMAC/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::OMAC->new('AES', '1234567890123456')->add("A","A","A")->mac), '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::OMAC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->mac), '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/oo3+raw/tripple_A');
84 is( Crypt::Mac::OMAC->new('AES', '1234567890123456')->add("A","A","A")->hexmac, '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/oo+hex/tripple_A');
85 is( Crypt::Mac::OMAC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->hexmac, '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/oo3+hex/tripple_A');
86 is( unpack('H*', omac('AES', '1234567890123456',"A","A","A")), '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/func+raw/tripple_A');
87 is( omac_hex ('AES', '1234567890123456',"A","A","A"), '49b745733f380fb4cdd8ce1ff1e52abc', 'OMAC/func+hex/tripple_A');
88 is( omac_b64 ('AES', '1234567890123456',"A","A","A"), 'SbdFcz84D7TN2M4f8eUqvA==', 'OMAC/func+b64/tripple_A');
89 is( omac_b64u('AES', '1234567890123456',"A","A","A"), 'SbdFcz84D7TN2M4f8eUqvA', 'OMAC/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::Pelican qw( pelican pelican_hex pelican_b64 pelican_b64u );
88
7878 is( pelican_hex('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), '8a798fcb2181d9f9ed81fcd2a7f6cd4e', 'Pelican/func+hex/12');
7979 is( pelican_b64('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'inmPyyGB2fntgfzSp/bNTg==', 'Pelican/func+b64/12');
8080 is( pelican_b64u('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'inmPyyGB2fntgfzSp_bNTg', 'Pelican/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::Pelican->new('1234567890123456')->add("A","A","A")->mac), '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::Pelican->new('1234567890123456')->add("A")->add("A")->add("A")->mac), '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/oo3+raw/tripple_A');
84 is( Crypt::Mac::Pelican->new('1234567890123456')->add("A","A","A")->hexmac, '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/oo+hex/tripple_A');
85 is( Crypt::Mac::Pelican->new('1234567890123456')->add("A")->add("A")->add("A")->hexmac, '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/oo3+hex/tripple_A');
86 is( unpack('H*', pelican('1234567890123456',"A","A","A")), '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/func+raw/tripple_A');
87 is( pelican_hex ('1234567890123456',"A","A","A"), '6f7dda998b3fdfeaa80737e5127532a5', 'Pelican/func+hex/tripple_A');
88 is( pelican_b64 ('1234567890123456',"A","A","A"), 'b33amYs/3+qoBzflEnUypQ==', 'Pelican/func+b64/tripple_A');
89 is( pelican_b64u('1234567890123456',"A","A","A"), 'b33amYs_3-qoBzflEnUypQ', 'Pelican/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::PMAC qw( pmac pmac_hex pmac_b64 pmac_b64u );
88
7878 is( pmac_hex('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), '3797cde072a8e286', 'PMAC/func+hex/12');
7979 is( pmac_b64('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'N5fN4HKo4oY=', 'PMAC/func+b64/12');
8080 is( pmac_b64u('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'N5fN4HKo4oY', 'PMAC/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::PMAC->new('AES', '1234567890123456')->add("A","A","A")->mac), 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::PMAC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->mac), 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/oo3+raw/tripple_A');
84 is( Crypt::Mac::PMAC->new('AES', '1234567890123456')->add("A","A","A")->hexmac, 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/oo+hex/tripple_A');
85 is( Crypt::Mac::PMAC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->hexmac, 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/oo3+hex/tripple_A');
86 is( unpack('H*', pmac('AES', '1234567890123456',"A","A","A")), 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/func+raw/tripple_A');
87 is( pmac_hex ('AES', '1234567890123456',"A","A","A"), 'c46c52ff026e4e24837bc51a7e21f8cb', 'PMAC/func+hex/tripple_A');
88 is( pmac_b64 ('AES', '1234567890123456',"A","A","A"), 'xGxS/wJuTiSDe8UafiH4yw==', 'PMAC/func+b64/tripple_A');
89 is( pmac_b64u('AES', '1234567890123456',"A","A","A"), 'xGxS_wJuTiSDe8UafiH4yw', 'PMAC/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 36;
5 use Test::More tests => 36 + 8;
66
77 use Crypt::Mac::Poly1305 qw( poly1305 poly1305_hex poly1305_b64 poly1305_b64u );
88
4242 is( poly1305_hex('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), '4c02cea60201d83ae4b2d644789422e5', 'Poly1305/func+hex/6');
4343 is( poly1305_b64('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'TALOpgIB2DrkstZEeJQi5Q==', 'Poly1305/func+b64/6');
4444 is( poly1305_b64u('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',"test\0test\0test\n"), 'TALOpgIB2DrkstZEeJQi5Q', 'Poly1305/func+b64u/6');
45
46 is( unpack('H*', Crypt::Mac::Poly1305->new('12345678901234561234567890123456')->add("A","A","A")->mac), '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/oo+raw/tripple_A');
47 is( unpack('H*', Crypt::Mac::Poly1305->new('12345678901234561234567890123456')->add("A")->add("A")->add("A")->mac), '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/oo3+raw/tripple_A');
48 is( Crypt::Mac::Poly1305->new('12345678901234561234567890123456')->add("A","A","A")->hexmac, '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/oo+hex/tripple_A');
49 is( Crypt::Mac::Poly1305->new('12345678901234561234567890123456')->add("A")->add("A")->add("A")->hexmac, '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/oo3+hex/tripple_A');
50 is( unpack('H*', poly1305('12345678901234561234567890123456',"A","A","A")), '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/func+raw/tripple_A');
51 is( poly1305_hex ('12345678901234561234567890123456',"A","A","A"), '7c1e6c34ad72384ac4f52eb49f642abc', 'Poly1305/func+hex/tripple_A');
52 is( poly1305_b64 ('12345678901234561234567890123456',"A","A","A"), 'fB5sNK1yOErE9S60n2QqvA==', 'Poly1305/func+b64/tripple_A');
53 is( poly1305_b64u('12345678901234561234567890123456',"A","A","A"), 'fB5sNK1yOErE9S60n2QqvA', 'Poly1305/func+b64u/tripple_A');
22 use strict;
33 use warnings;
44
5 use Test::More tests => 72;
5 use Test::More tests => 72 + 8;
66
77 use Crypt::Mac::XCBC qw( xcbc xcbc_hex xcbc_b64 xcbc_b64u );
88
7878 is( xcbc_hex('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), '98276a4a6aafd86b', 'XCBC/func+hex/12');
7979 is( xcbc_b64('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'mCdqSmqv2Gs=', 'XCBC/func+b64/12');
8080 is( xcbc_b64u('Blowfish','12345678901234561234567890123456',"test\0test\0test\n"), 'mCdqSmqv2Gs', 'XCBC/func+b64u/12');
81
82 is( unpack('H*', Crypt::Mac::XCBC->new('AES', '1234567890123456')->add("A","A","A")->mac), 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/oo+raw/tripple_A');
83 is( unpack('H*', Crypt::Mac::XCBC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->mac), 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/oo3+raw/tripple_A');
84 is( Crypt::Mac::XCBC->new('AES', '1234567890123456')->add("A","A","A")->hexmac, 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/oo+hex/tripple_A');
85 is( Crypt::Mac::XCBC->new('AES', '1234567890123456')->add("A")->add("A")->add("A")->hexmac, 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/oo3+hex/tripple_A');
86 is( unpack('H*', xcbc('AES', '1234567890123456',"A","A","A")), 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/func+raw/tripple_A');
87 is( xcbc_hex ('AES', '1234567890123456',"A","A","A"), 'da243c0a133fc33cd1f96b872c0bec9b', 'XCBC/func+hex/tripple_A');
88 is( xcbc_b64 ('AES', '1234567890123456',"A","A","A"), '2iQ8ChM/wzzR+WuHLAvsmw==', 'XCBC/func+b64/tripple_A');
89 is( xcbc_b64u('AES', '1234567890123456',"A","A","A"), '2iQ8ChM_wzzR-WuHLAvsmw', 'XCBC/func+b64u/tripple_A');
00 use strict;
11 use warnings;
2 use Test::More tests => 8;
2 use Test::More tests => 24;
33
44 use Crypt::Mode::CTR;
55
1414 my $pt = pack("H*", $a{pt});
1515 my $key = pack("H*", $a{key});
1616 my $iv = pack("H*", $a{iv});
17 # test: encrypt/decrypt in a single step
1718 my $ct_out = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->encrypt($pt, $key, $iv);
18 is(unpack("H*", $ct_out), $a{ct}, "cipher text [m=$a{mode}, w=$a{width}]");
19 is(unpack("H*", $ct_out), $a{ct}, "cipher text1 [m=$a{mode}, w=$a{width}]");
1920 my $pt_out = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->decrypt($ct_out, $key, $iv);
20 is(unpack("H*", $pt_out), $a{pt}, "plain text [m=$a{mode}, w=$a{width}]");
21 is(unpack("H*", $pt_out), $a{pt}, "plain text1 [m=$a{mode}, w=$a{width}]");
22 # test: add(@in)
23 my $mode;
24 my @in = map { pack("H*", $_) } ($a{pt} =~ /(..)/g);
25 $mode = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->start_encrypt($key, $iv);
26 $ct_out = $mode->add(@in) . $mode->finish;
27 is(unpack("H*", $ct_out), $a{ct}, "cipher text2 [m=$a{mode}, w=$a{width}]");
28 $mode = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->start_encrypt($key, $iv);
29 $ct_out = join ('', map { $mode->add($_) } @in) . $mode->finish;
30 is(unpack("H*", $ct_out), $a{ct}, "cipher text3 [m=$a{mode}, w=$a{width}]");
31 # test: add(?)->add(?)->add(?)->add(?)
32 @in = split //, $ct_out;
33 $mode = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->start_decrypt($key, $iv);
34 $pt_out = $mode->add(@in) . $mode->finish;
35 is(unpack("H*", $pt_out), $a{pt}, "plain text2 [m=$a{mode}, w=$a{width}]");
36 $mode = Crypt::Mode::CTR->new('AES', $a{mode}, $a{width})->start_decrypt($key, $iv);
37 $pt_out = join ('', map { $mode->add($_) } @in) . $mode->finish;
38 is(unpack("H*", $pt_out), $a{pt}, "plain text3 [m=$a{mode}, w=$a{width}]");
2139 }
2240
2341 do_test(%$_) for (
7474 ok($pu1->verify_message($sig, "message"), 'verify_message');
7575
7676 my $hash = pack("H*","04624fae618e9ad0c5e479f62e1420c71fff34dd");
77 $sig = $pr1->sign_hash($hash, 'SHA1');
77 $sig = $pr1->sign_hash($hash);
7878 ok(length $sig > 60, 'sign_hash ' . length($sig));
79 ok($pu1->verify_hash($sig, $hash, 'SHA1'), 'verify_hash');
79 ok($pu1->verify_hash($sig, $hash), 'verify_hash');
8080
8181 my $pr2 = Crypt::PK::DSA->new;
8282 $pr2->import_key('t/data/cryptx_priv_dsa2.der');
194194 ok($sig, 'dsa_sign_message');
195195 ok(dsa_verify_message('t/data/cryptx_pub_dsa1.der', $sig, 'test string'), 'dsa_verify_message');
196196 my $hash = pack("H*","04624fae618e9ad0c5e479f62e1420c71fff34dd");
197 $sig = dsa_sign_hash('t/data/cryptx_priv_dsa1.der', $hash, 'SHA1');
197 $sig = dsa_sign_hash('t/data/cryptx_priv_dsa1.der', $hash);
198198 ok($sig, 'dsa_sign_hash');
199 ok(dsa_verify_hash('t/data/cryptx_pub_dsa1.der', $sig, $hash, 'SHA1'), 'dsa_verify_hash');
200 }
199 ok(dsa_verify_hash('t/data/cryptx_pub_dsa1.der', $sig, $hash), 'dsa_verify_hash');
200 }
178178 ok($@, 'key not generated');
179179
180180 # known curves lookup
181 my $params = $Crypt::PK::ECC::curve{secp384r1};
181 my $params = { # NIST P-384
182 prime => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF",
183 A => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC",
184 B => "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF",
185 Gx => "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
186 Gy => "3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F",
187 order => "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973",
188 cofactor => 1,
189 };
182190 $k = Crypt::PK::ECC->new;
183191 ok($k->generate_key($params), "generate_key hash params");
184192 is($k->key2hash->{curve_name}, 'secp384r1', "key2hash curve_name");
185 is($k->key2hash->{curve_oid}, $params->{oid}, "key2hash curve_oid");
193 is($k->key2hash->{curve_oid}, '1.3.132.0.34', "key2hash curve_oid");
186194 ok($k->export_key_der('private_short'), "export_key_der auto oid");
187195
188196 $k = Crypt::PK::ECC->new;
189 ok($k->generate_key({ %$params, A => '0' }), "generate_key invalid auto oid");
190 is($k->key2hash->{curve_name}, 'custom', "key2hash custom curve_name");
197 ok($k->generate_key({ %$params, cofactor => 6 }), "generate_key invalid auto oid");
198 ok(!exists($k->key2hash->{curve_name}) || $k->key2hash->{curve_name} eq 'custom', "key2hash custom curve_name");
191199 ok(!exists($k->key2hash->{curve_oid}), "key2hash curve_oid doesn't exist");
192200 eval { $k->export_key_der('private_short'); };
193201 ok($@, "export_key_der invalid auto oid");
00 use strict;
11 use warnings;
2 use Test::More tests => 8;
2 use Test::More tests => 12;
33
44 use Crypt::PK::RSA;
55 use Crypt::PK::ECC;
3737
3838 ### XXX-FIXME password protected pkcs8 private keys are not supported
3939 ### for my $f (qw/pkcs8.rsa-priv-pass.der pkcs8.rsa-priv-pass.pem/) {
40 ### $rsa->import_key("t/data/$f");
40 ### $rsa->import_key("t/data/$f", "secret");
4141 ### ok($rsa->is_private, "RSA is_private $f");
4242 ### }
4343
4646 ok($ec->is_private, "ECC is_private $f");
4747 }
4848
49 ### XXX-FIXME password protected pkcs8 private keys are not supported
50 ### for my $f (qw/pkcs8.ec-priv-pass.der pkcs8.ec-priv-pass.pem pkcs8.ec-short-priv-pass.der pkcs8.ec-short-priv-pass.pem/) {
51 ### $ec->import_key("t/data/$f");
52 ### ok($ec->is_private, "ECC is_private $f");
53 ### }
49 for my $f (qw/pkcs8.ec-priv-pass.der pkcs8.ec-priv-pass.pem pkcs8.ec-short-priv-pass.der pkcs8.ec-short-priv-pass.pem/) {
50 $ec->import_key("t/data/$f", "secret");
51 ok($ec->is_private, "ECC is_private $f (pw)");
52 }
66 use Test::More;
77
88 plan skip_all => "No JSON::* module installed" unless eval { require JSON::PP } || eval { require JSON::XS } || eval { require Cpanel::JSON::XS };
9 plan tests => 762;
9 plan tests => 1298;
1010
1111 use CryptX;
1212 use Crypt::Misc 'read_rawfile';
116116 # do the test
117117 my $testname = "type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result";
118118 my $pk = Crypt::PK::DSA->new( \$keyPem );
119 my $valid = $pk->verify_message($sig, $message, $sha);
120119 my $hash = digest_data($sha, $message);
121120 my $valid_h = $pk->verify_hash($sig, $hash);
121 my $valid = $pk->verify_message($sig, $message, $sha);
122122 if ($result eq 'valid' || $result eq 'acceptable') {
123123 ok($valid, $testname);
124124 }
132132 }
133133 }
134134
135 if (0) {
136 #XXX-TODO:
137 # not ok 749 - type=ECDSAVer/SHA256 tcId=50 comment='appending unused 0's' expected-result=invalid verify_message=1
138 # not ok 819 - type=ECDSAVer/SHA256 tcId=120 comment='Modified r or s, e.g. by adding or subtracting the order of the group' expected-result=invalid verify_message=1
139 # not ok 820 - type=ECDSAVer/SHA256 tcId=121 comment='Modified r or s, e.g. by adding or subtracting the order of the group' expected-result=invalid verify_message=1
140 # not ok 821 - type=ECDSAVer/SHA256 tcId=122 comment='Modified r or s, e.g. by adding or subtracting the order of the group' expected-result=invalid verify_message=1
141
135 if (1) {
142136 use Crypt::PK::ECC;
143137
144138 my $tests = CryptX::_decode_json read_rawfile 't/wycheproof/ecdsa_test.json';
156150 my $result = $t->{result};
157151 my $message = pack "H*", $t->{message};
158152 my $sig = pack "H*", $t->{sig};
153 # skip unsupported tests:
154 next if $tcId==9 && $result eq 'acceptable' && $comment eq "BER:long form encoding of length";
155 next if $tcId==10 && $result eq 'acceptable' && $comment eq "BER:long form encoding of length";
156 next if $tcId==12 && $result eq 'acceptable' && $comment eq "BER:length contains leading 0";
157 next if $tcId==13 && $result eq 'acceptable' && $comment eq "BER:length contains leading 0";
158 next if $tcId==14 && $result eq 'acceptable' && $comment eq "BER:indefinite length";
159 next if $tcId==15 && $result eq 'acceptable' && $comment eq "BER:prepending 0's to integer";
160 next if $tcId==16 && $result eq 'acceptable' && $comment eq "BER:prepending 0's to integer";
159161 # do the test
160162 my $testname = "type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result";
161163 my $pk = Crypt::PK::ECC->new( \$keyPem );
162164 my $valid = $pk->verify_message($sig, $message, $sha);
163 if ($result eq 'valid') {
165 if ($result eq 'valid' || $result eq 'acceptable') {
164166 ok($valid, "$testname verify_message=$valid");
165167 }
166 elsif ($result eq 'acceptable') {
167 #XXX-TODO
168 #ok($valid, "$testname verify_message=$valid");
169 }
170168 elsif ($result eq 'invalid') {
171169 ok(!$valid, "$testname verify_message=$valid");
172170 }
177175 }
178176 }
179177
180 if (0) {
178 if (1) {
181179 use Crypt::PK::ECC;
182180
183181 my $tests = CryptX::_decode_json read_rawfile 't/wycheproof/ecdsa_webcrypto_test.json';
200198 # do the test
201199 my $testname = "type=$type/$sha tcId=$tcId comment='$comment' expected-result=$result";
202200 my $pk = Crypt::PK::ECC->new( \$keyPem );
203 my $valid = $pk->verify_message($sig, $message, $sha);
204 if ($result eq 'valid') {
201 my $valid = $pk->verify_message_rfc7518($sig, $message, $sha);
202 if ($result eq 'valid' || $result eq 'acceptable') {
205203 ok($valid, "$testname verify_message=$valid");
206 }
207 elsif ($result eq 'acceptable') {
208 #XXX-TODO
209 #ok($valid, "$testname verify_message=$valid");
210204 }
211205 elsif ($result eq 'invalid') {
212206 ok(!$valid, "$testname verify_message=$valid");