@@ -56,24 +56,20 @@ ERL_NIF_TERM enacl_crypto_sign_init(ErlNifEnv *env, int argc,
56
56
57
57
if ((obj = enif_alloc_resource (enacl_sign_ctx_rtype ,
58
58
sizeof (enacl_sign_ctx ))) == NULL ) {
59
- ret = enacl_error_tuple (env , "alloc_failed" );
60
- goto done ;
59
+ goto err ;
61
60
}
62
61
obj -> alive = 0 ;
63
62
obj -> state = enif_alloc (crypto_sign_statebytes ());
64
63
if (obj -> state == NULL ) {
65
- ret = enacl_error_tuple (env , "state_malloc" );
66
64
goto release ;
67
65
}
68
66
obj -> alive = 1 ;
69
67
70
68
if ((obj -> mtx = enif_mutex_create ("enacl.sign" )) == NULL ) {
71
- ret = enacl_error_tuple (env , "mutex_create" );
72
69
goto free ;
73
70
}
74
71
75
72
if (0 != crypto_sign_init (obj -> state )) {
76
- ret = enacl_error_tuple (env , "sign_init_error" );
77
73
goto free ;
78
74
}
79
75
@@ -94,6 +90,8 @@ ERL_NIF_TERM enacl_crypto_sign_init(ErlNifEnv *env, int argc,
94
90
release :
95
91
// This also frees the mutex via the destructor
96
92
enif_release_resource (obj );
93
+ err :
94
+ ret = enacl_internal_error (env );
97
95
done :
98
96
return ret ;
99
97
}
@@ -120,12 +118,12 @@ ERL_NIF_TERM enacl_crypto_sign_update(ErlNifEnv *env, int argc,
120
118
121
119
enif_mutex_lock (obj -> mtx );
122
120
if (!obj -> alive ) {
123
- ret = enacl_error_tuple (env , "finalized" );
121
+ ret = enacl_error_finalized (env );
124
122
goto done ;
125
123
}
126
124
127
125
if (0 != crypto_sign_update (obj -> state , data .data , data .size )) {
128
- ret = enacl_error_tuple (env , "sign_update_error" );
126
+ ret = enacl_internal_error (env ); // This should never be hit
129
127
goto done ;
130
128
}
131
129
@@ -157,19 +155,16 @@ ERL_NIF_TERM enacl_crypto_sign_final_create(ErlNifEnv *env, int argc,
157
155
158
156
enif_mutex_lock (obj -> mtx );
159
157
if (!obj -> alive ) {
160
- ret = enacl_error_tuple (env , "finalized" );
158
+ ret = enacl_error_finalized (env );
161
159
goto done ;
162
160
}
163
161
164
162
if (!enif_alloc_binary (crypto_sign_BYTES , & sig )) {
165
- ret = enacl_error_tuple (env , "alloc_failed" );
163
+ ret = enacl_internal_error (env );
166
164
goto done ;
167
165
}
168
166
169
- if (0 != crypto_sign_final_create (obj -> state , sig .data , & siglen , sk .data )) {
170
- ret = enacl_error_tuple (env , "sign_error" );
171
- goto release ;
172
- }
167
+ crypto_sign_final_create (obj -> state , sig .data , & siglen , sk .data );
173
168
174
169
ERL_NIF_TERM ok = enif_make_atom (env , ATOM_OK );
175
170
ERL_NIF_TERM signature = enif_make_binary (env , & sig );
@@ -179,8 +174,6 @@ ERL_NIF_TERM enacl_crypto_sign_final_create(ErlNifEnv *env, int argc,
179
174
180
175
bad_arg :
181
176
return enif_make_badarg (env );
182
- release :
183
- enif_release_binary (& sig );
184
177
cleanup :
185
178
obj -> alive = 0 ;
186
179
sodium_memzero (obj -> state , crypto_sign_statebytes ());
@@ -210,7 +203,7 @@ ERL_NIF_TERM enacl_crypto_sign_final_verify(ErlNifEnv *env, int argc,
210
203
211
204
enif_mutex_lock (obj -> mtx );
212
205
if (!obj -> alive ) {
213
- ret = enacl_error_tuple (env , "finalized" );
206
+ ret = enacl_error_finalized (env );
214
207
goto done ;
215
208
}
216
209
@@ -246,12 +239,12 @@ enacl_crypto_sign_ed25519_keypair(ErlNifEnv *env, int argc,
246
239
}
247
240
248
241
if (!enif_alloc_binary (crypto_sign_ed25519_PUBLICKEYBYTES , & pk )) {
249
- return enacl_error_tuple (env , "alloc_failed" );
242
+ return enacl_internal_error (env );
250
243
}
251
244
252
245
if (!enif_alloc_binary (crypto_sign_ed25519_SECRETKEYBYTES , & sk )) {
253
246
enif_release_binary (& pk );
254
- return enacl_error_tuple (env , "alloc_failed" );
247
+ return enacl_internal_error (env );
255
248
}
256
249
257
250
crypto_sign_ed25519_keypair (pk .data , sk .data );
@@ -271,13 +264,10 @@ enacl_crypto_sign_ed25519_sk_to_pk(ErlNifEnv *env, int argc,
271
264
}
272
265
273
266
if (!enif_alloc_binary (crypto_sign_ed25519_PUBLICKEYBYTES , & pk )) {
274
- return enacl_error_tuple (env , "alloc_failed" );
267
+ return enacl_internal_error (env );
275
268
}
276
269
277
- if (crypto_sign_ed25519_sk_to_pk (pk .data , sk .data ) != 0 ) {
278
- enif_release_binary (& pk );
279
- return enacl_error_tuple (env , "crypto_sign_ed25519_sk_to_pk_failed" );
280
- }
270
+ crypto_sign_ed25519_sk_to_pk (pk .data , sk .data );
281
271
282
272
return enif_make_binary (env , & pk );
283
273
}
@@ -293,14 +283,10 @@ enacl_crypto_sign_ed25519_public_to_curve25519(ErlNifEnv *env, int argc,
293
283
}
294
284
295
285
if (!enif_alloc_binary (crypto_scalarmult_curve25519_BYTES , & curve25519_pk )) {
296
- return enacl_error_tuple (env , "alloc_failed" );
286
+ return enacl_internal_error (env );
297
287
}
298
288
299
- if (crypto_sign_ed25519_pk_to_curve25519 (curve25519_pk .data ,
300
- ed25519_pk .data ) != 0 ) {
301
- enif_release_binary (& curve25519_pk );
302
- return enacl_error_tuple (env , "ed25519_public_to_curve25519_failed" );
303
- }
289
+ crypto_sign_ed25519_pk_to_curve25519 (curve25519_pk .data , ed25519_pk .data );
304
290
305
291
return enif_make_binary (env , & curve25519_pk );
306
292
}
@@ -316,14 +302,10 @@ enacl_crypto_sign_ed25519_secret_to_curve25519(ErlNifEnv *env, int argc,
316
302
}
317
303
318
304
if (!enif_alloc_binary (crypto_scalarmult_curve25519_BYTES , & curve25519_sk )) {
319
- return enacl_error_tuple (env , "alloc_failed" );
305
+ return enacl_internal_error (env );
320
306
}
321
307
322
- if (crypto_sign_ed25519_sk_to_curve25519 (curve25519_sk .data ,
323
- ed25519_sk .data ) != 0 ) {
324
- enif_release_binary (& curve25519_sk );
325
- return enacl_error_tuple (env , "ed25519_secret_to_curve25519_failed" );
326
- }
308
+ crypto_sign_ed25519_sk_to_curve25519 (curve25519_sk .data , ed25519_sk .data );
327
309
328
310
return enif_make_binary (env , & curve25519_sk );
329
311
}
@@ -364,12 +346,12 @@ ERL_NIF_TERM enacl_crypto_sign_keypair(ErlNifEnv *env, int argc,
364
346
}
365
347
366
348
if (!enif_alloc_binary (crypto_sign_PUBLICKEYBYTES , & pk )) {
367
- return enacl_error_tuple (env , "alloc_failed" );
349
+ return enacl_internal_error (env );
368
350
}
369
351
370
352
if (!enif_alloc_binary (crypto_sign_SECRETKEYBYTES , & sk )) {
371
353
enif_release_binary (& pk );
372
- return enacl_error_tuple (env , "alloc_failed" );
354
+ return enacl_internal_error (env );
373
355
}
374
356
375
357
crypto_sign_keypair (pk .data , sk .data );
@@ -387,12 +369,12 @@ ERL_NIF_TERM enacl_crypto_sign_seed_keypair(ErlNifEnv *env, int argc,
387
369
}
388
370
389
371
if (!enif_alloc_binary (crypto_sign_PUBLICKEYBYTES , & pk )) {
390
- return enacl_error_tuple (env , "alloc_failed" );
372
+ return enacl_internal_error (env );
391
373
}
392
374
393
375
if (!enif_alloc_binary (crypto_sign_SECRETKEYBYTES , & sk )) {
394
376
enif_release_binary (& pk );
395
- return enacl_error_tuple (env , "alloc_failed" );
377
+ return enacl_internal_error (env );
396
378
}
397
379
398
380
crypto_sign_seed_keypair (pk .data , sk .data , seed .data );
@@ -401,11 +383,6 @@ ERL_NIF_TERM enacl_crypto_sign_seed_keypair(ErlNifEnv *env, int argc,
401
383
enif_make_binary (env , & sk ));
402
384
}
403
385
404
- /*
405
- int crypto_sign(unsigned char *sm, unsigned long long *smlen,
406
- const unsigned char *m, unsigned long long mlen,
407
- const unsigned char *sk);
408
- */
409
386
ERL_NIF_TERM enacl_crypto_sign (ErlNifEnv * env , int argc ,
410
387
ERL_NIF_TERM const argv []) {
411
388
ErlNifBinary m , sk , sm ;
@@ -421,19 +398,14 @@ ERL_NIF_TERM enacl_crypto_sign(ErlNifEnv *env, int argc,
421
398
}
422
399
423
400
if (!enif_alloc_binary (m .size + crypto_sign_BYTES , & sm )) {
424
- return enacl_error_tuple (env , "alloc_failed" );
401
+ return enacl_internal_error (env );
425
402
}
426
403
427
404
crypto_sign (sm .data , & smlen , m .data , m .size , sk .data );
428
405
429
406
return enif_make_sub_binary (env , enif_make_binary (env , & sm ), 0 , smlen );
430
407
}
431
408
432
- /*
433
- int crypto_sign_open(unsigned char *m, unsigned long long *mlen,
434
- const unsigned char *sm, unsigned long long smlen,
435
- const unsigned char *pk);
436
- */
437
409
ERL_NIF_TERM enacl_crypto_sign_open (ErlNifEnv * env , int argc ,
438
410
ERL_NIF_TERM const argv []) {
439
411
ErlNifBinary m , sm , pk ;
@@ -449,22 +421,20 @@ ERL_NIF_TERM enacl_crypto_sign_open(ErlNifEnv *env, int argc,
449
421
}
450
422
451
423
if (!enif_alloc_binary (sm .size , & m )) {
452
- return enacl_error_tuple (env , "alloc_failed" );
424
+ return enacl_internal_error (env );
453
425
}
454
426
455
427
if (0 == crypto_sign_open (m .data , & mlen , sm .data , sm .size , pk .data )) {
456
- return enif_make_sub_binary (env , enif_make_binary (env , & m ), 0 , mlen );
428
+ ERL_NIF_TERM ret_ok = enif_make_atom (env , ATOM_OK );
429
+ ERL_NIF_TERM ret_bin =
430
+ enif_make_sub_binary (env , enif_make_binary (env , & m ), 0 , mlen );
431
+ return enif_make_tuple2 (env , ret_ok , ret_bin );
457
432
} else {
458
433
enif_release_binary (& m );
459
434
return enacl_error_tuple (env , "failed_verification" );
460
435
}
461
436
}
462
437
463
- /*
464
- int crypto_sign_detached(unsigned char *sig, unsigned long long *siglen,
465
- const unsigned char *m, unsigned long long mlen,
466
- const unsigned char *sk);
467
- */
468
438
ERL_NIF_TERM enacl_crypto_sign_detached (ErlNifEnv * env , int argc ,
469
439
ERL_NIF_TERM const argv []) {
470
440
ErlNifBinary m , sk , sig ;
@@ -480,20 +450,14 @@ ERL_NIF_TERM enacl_crypto_sign_detached(ErlNifEnv *env, int argc,
480
450
}
481
451
482
452
if (!enif_alloc_binary (crypto_sign_BYTES , & sig )) {
483
- return enacl_error_tuple (env , "alloc_failed" );
453
+ return enacl_internal_error (env );
484
454
}
485
455
486
456
crypto_sign_detached (sig .data , & siglen , m .data , m .size , sk .data );
487
457
488
458
return enif_make_binary (env , & sig );
489
459
}
490
460
491
- /*
492
- int crypto_sign_verify_detached(const unsigned char *sig,
493
- const unsigned char *m,
494
- unsigned long long mlen,
495
- const unsigned char *pk);
496
- */
497
461
ERL_NIF_TERM
498
462
enacl_crypto_sign_verify_detached (ErlNifEnv * env , int argc ,
499
463
ERL_NIF_TERM const argv []) {
0 commit comments