summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xs_openssl.h41
1 files changed, 41 insertions, 0 deletions
diff --git a/xs_openssl.h b/xs_openssl.h
index 43a18e1..d31442a 100644
--- a/xs_openssl.h
+++ b/xs_openssl.h
@@ -11,6 +11,7 @@ d_char *xs_sha256_base64(const void *input, int size);
11d_char *xs_rsa_genkey(int bits); 11d_char *xs_rsa_genkey(int bits);
12d_char *xs_rsa_sign(char *secret, char *mem, int size); 12d_char *xs_rsa_sign(char *secret, char *mem, int size);
13int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig); 13int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig);
14d_char *xs_evp_sign(char *secret, char *mem, int size);
14 15
15 16
16#ifdef XS_IMPLEMENTATION 17#ifdef XS_IMPLEMENTATION
@@ -19,6 +20,7 @@ int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig);
19#include "openssl/sha.h" 20#include "openssl/sha.h"
20#include "openssl/rsa.h" 21#include "openssl/rsa.h"
21#include "openssl/pem.h" 22#include "openssl/pem.h"
23#include "openssl/evp.h"
22 24
23d_char *xs_md5_hex(const void *input, int size) 25d_char *xs_md5_hex(const void *input, int size)
24{ 26{
@@ -174,6 +176,45 @@ int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig)
174 return r; 176 return r;
175} 177}
176 178
179
180d_char *xs_evp_sign(char *secret, char *mem, int size)
181/* signs a memory block (secret is in PEM format) */
182{
183 d_char *signature = NULL;
184 BIO *b;
185 unsigned char *sig;
186 unsigned int sig_len;
187 EVP_PKEY *pkey;
188
189 EVP_MD_CTX *mdctx;
190 const EVP_MD *md;
191
192 /* un-PEM the key */
193 b = BIO_new_mem_buf(secret, strlen(secret));
194 pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL);
195
196 md = EVP_get_digestbyname("sha256");
197
198 mdctx = EVP_MD_CTX_new();
199
200 sig_len = EVP_PKEY_size(pkey);
201 sig = malloc(sig_len);
202
203 EVP_SignInit(mdctx, md);
204 EVP_SignUpdate(mdctx, mem, size);
205
206 if (EVP_SignFinal(mdctx, sig, &sig_len, pkey) == 1)
207 signature = xs_base64_enc((char *)sig, sig_len);
208
209 EVP_MD_CTX_free(mdctx);
210
211 BIO_free(b);
212 free(sig);
213
214 return signature;
215}
216
217
177#endif /* XS_IMPLEMENTATION */ 218#endif /* XS_IMPLEMENTATION */
178 219
179#endif /* _XS_OPENSSL_H */ 220#endif /* _XS_OPENSSL_H */