1 #define PERL_NO_GET_CONTEXT
2 #include "EXTERN.h"
3 #include "perl.h"
4 #include "XSUB.h"
5 
6 #if USE_X64
7 #include "curve25519-donna-c64.c"
8 #else
9 #include "curve25519-donna.c"
10 #endif
11 
S_get_buffer(pTHX_ SV * variable,const char * name)12 static u8* S_get_buffer(pTHX_ SV* variable, const char* name) {
13 	STRLEN len;
14 	u8* ret = (u8*) SvPV(variable, len);
15 	if (len != 32)
16 		Perl_croak(aTHX_ "%s requires 32 bytes", name);
17 	return ret;
18 }
19 #define get_buffer(variable, name) S_get_buffer(aTHX_ variable, name)
20 
21 typedef u8 keybuffer[32];
22 typedef const u8* keyptr;
23 
24 static const keybuffer basepoint = {9};
25 
26 MODULE = Crypt::Curve25519		PACKAGE = Crypt::Curve25519
27 
28 PROTOTYPES: DISABLED
29 
30 keybuffer
31 curve25519_public_key(secret, base = 9)
32     keyptr secret = get_buffer(ST(0), "Secret key");
33     keyptr base = items > 1 ? get_buffer(ST(1), "Basepoint") : basepoint;
34     CODE:
35     curve25519_donna(RETVAL, secret, base);
36     OUTPUT:
37     RETVAL
38 
39 keybuffer
40 curve25519_shared_secret(secret, public)
41     keyptr secret = get_buffer(ST(0), "Secret key");
42     keyptr public = get_buffer(ST(1), "Public key");
43     ALIAS:
44         curve25519 = 1
45     CODE:
46     curve25519_donna(RETVAL, secret, public);
47     OUTPUT:
48     RETVAL
49