ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Crypt-Ed25519/Ed25519.xs
Revision: 1.2
Committed: Sat Mar 28 19:42:35 2015 UTC (9 years, 1 month ago) by root
Branch: MAIN
CVS Tags: rel-1_0, rel-1_01, rel-0_9
Changes since 1.1: +26 -1 lines
Log Message:
0.2

File Contents

# Content
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 /* work around unportable mess in fixedint.h */
6 /* taken from libecb */
7 #ifdef _WIN32
8 typedef signed char int8_t;
9 typedef unsigned char uint8_t;
10 typedef signed short int16_t;
11 typedef unsigned short uint16_t;
12 typedef signed int int32_t;
13 typedef unsigned int uint32_t;
14 #if __GNUC__
15 typedef signed long long int64_t;
16 typedef unsigned long long uint64_t;
17 #else /* _MSC_VER || __BORLANDC__ */
18 typedef signed __int64 int64_t;
19 typedef unsigned __int64 uint64_t;
20 #endif
21 #define UINT64_C(v) v
22 #else
23 #include <inttypes.h>
24 #endif
25 #define FIXEDINT_H_INCLUDED
26 #include "ed25519/src/fixedint.h"
27
28 #include "ed25519/src/ed25519.h"
29
30 #include "ed25519/src/add_scalar.c"
31 #include "ed25519/src/fixedint.h"
32 #include "ed25519/src/keypair.c"
33 #include "ed25519/src/key_exchange.c"
34 #include "ed25519/src/seed.c"
35 #include "ed25519/src/sha512.c"
36 #include "ed25519/src/sha512.h"
37 #include "ed25519/src/sign.c"
38 #include "ed25519/src/verify.c"
39
40 #define select(a,b,c) ed25519_select (a, b, c)
41 #include "ed25519/src/ge.c"
42
43 #include "ed25519/src/fe.c"
44 #define load_3(x) sc_load_3(x)
45 #define load_4(x) sc_load_4(x)
46 #include "ed25519/src/sc.c"
47
48 MODULE = Crypt::Ed25519 PACKAGE = Crypt::Ed25519
49
50 PROTOTYPES: ENABLE
51
52 SV *
53 eddsa_secret_key ()
54 CODE:
55 {
56 unsigned char seed[32];
57
58 if (ed25519_create_seed (seed))
59 croak ("Crypt::Ed25519::eddsa_secret_key: ed25519_create_seed failed");
60
61 RETVAL = newSVpvn (seed, sizeof seed);
62 }
63 OUTPUT:
64 RETVAL
65
66 void
67 generate_keypair (SV *secret = 0)
68 ALIAS:
69 eddsa_public_key = 1
70 PPCODE:
71 {
72 STRLEN secret_l; char *secret_p;
73
74 unsigned char seed[32];
75 unsigned char public_key[32];
76 unsigned char private_key[64];
77
78 if (secret)
79 {
80 secret_p = SvPVbyte (secret, secret_l);
81
82 if (secret_l != 32)
83 croak ("Crypt::Ed25519::eddsa_public_key: secret has wrong length (!= 32)");
84 }
85 else
86 {
87 if (ed25519_create_seed (seed))
88 croak ("Crypt::Ed25519::generate_keypair: ed25519_create_seed failed");
89
90 secret_p = seed;
91 }
92
93 ed25519_create_keypair (public_key, private_key, secret_p);
94
95 EXTEND (SP, 2);
96 PUSHs (sv_2mortal (newSVpvn (public_key, sizeof public_key)));
97
98 if (!ix)
99 PUSHs (sv_2mortal (newSVpvn (private_key, sizeof private_key)));
100 }
101
102 SV *
103 sign (SV *message, SV *public_key, SV *private_key)
104 ALIAS:
105 eddsa_sign = 1
106 CODE:
107 {
108 unsigned char hash[64]; /* result of sha512 */
109 unsigned char signature[64];
110
111 STRLEN message_l ; char *message_p = SvPVbyte (message , message_l );
112 STRLEN public_key_l ; char *public_key_p = SvPVbyte (public_key , public_key_l );
113 STRLEN private_key_l; char *private_key_p = SvPVbyte (private_key, private_key_l);
114
115 if (public_key_l != 32)
116 croak ("Crypt::Ed25519::sign: public key has wrong length (!= 32)");
117
118 if (ix)
119 {
120 if (private_key_l != 32)
121 croak ("Crypt::Ed25519::eddsa_sign: secret key has wrong length (!= 32)");
122
123 sha512 (private_key_p, 32, hash);
124
125 hash[ 0] &= 248;
126 hash[31] &= 63;
127 hash[31] |= 64;
128
129 private_key_p = hash;
130 }
131 else
132 {
133 if (private_key_l != 64)
134 croak ("Crypt::Ed25519::sign: private key has wrong length (!= 64)");
135 }
136
137 ed25519_sign (signature, message_p, message_l, public_key_p, private_key_p);
138
139 RETVAL = newSVpvn (signature, sizeof signature);
140 }
141 OUTPUT:
142 RETVAL
143
144 bool
145 verify (SV *message, SV *public_key, SV *signature)
146 ALIAS:
147 eddsa_verify = 0
148 verify_croak = 1
149 eddsa_verify_croak = 1
150 CODE:
151 {
152 STRLEN signature_l ; char *signature_p = SvPVbyte (signature , signature_l );
153 STRLEN message_l ; char *message_p = SvPVbyte (message , message_l );
154 STRLEN public_key_l; char *public_key_p = SvPVbyte (public_key, public_key_l);
155
156 if (public_key_l != 32)
157 croak ("Crypt::Ed25519::verify: public key has wrong length (!= 32)");
158
159 RETVAL = ed25519_verify (signature_p, message_p, message_l, public_key_p);
160
161 if (!RETVAL && ix)
162 croak ("Crypt::Ed25519::verify_croak: signature verification failed");
163 }
164 OUTPUT:
165 RETVAL
166
167