Browse Source

Backported from xs.

default 2 years ago
parent
commit
e3cea55770
1 changed files with 41 additions and 0 deletions
  1. 41 0
      xs_openssl.h

+ 41 - 0
xs_openssl.h

@@ -11,6 +11,7 @@ d_char *xs_sha256_base64(const void *input, int size);
 d_char *xs_rsa_genkey(int bits);
 d_char *xs_rsa_sign(char *secret, char *mem, int size);
 int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig);
+d_char *xs_evp_sign(char *secret, char *mem, int size);
 
 
 #ifdef XS_IMPLEMENTATION
@@ -19,6 +20,7 @@ int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig);
 #include "openssl/sha.h"
 #include "openssl/rsa.h"
 #include "openssl/pem.h"
+#include "openssl/evp.h"
 
 d_char *xs_md5_hex(const void *input, int size)
 {
@@ -174,6 +176,45 @@ int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig)
     return r;
 }
 
+
+d_char *xs_evp_sign(char *secret, char *mem, int size)
+/* signs a memory block (secret is in PEM format) */
+{
+    d_char *signature = NULL;
+    BIO *b;
+    unsigned char *sig;
+    unsigned int sig_len;
+    EVP_PKEY *pkey;
+
+    EVP_MD_CTX *mdctx;
+    const EVP_MD *md;
+
+    /* un-PEM the key */
+    b = BIO_new_mem_buf(secret, strlen(secret));
+    pkey = PEM_read_bio_PrivateKey(b, NULL, NULL, NULL);
+
+    md = EVP_get_digestbyname("sha256");
+
+    mdctx = EVP_MD_CTX_new();
+
+    sig_len = EVP_PKEY_size(pkey);
+    sig = malloc(sig_len);
+
+    EVP_SignInit(mdctx, md);
+    EVP_SignUpdate(mdctx, mem, size);
+
+    if (EVP_SignFinal(mdctx, sig, &sig_len, pkey) == 1)
+        signature = xs_base64_enc((char *)sig, sig_len);
+
+    EVP_MD_CTX_free(mdctx);
+
+    BIO_free(b);
+    free(sig);
+
+    return signature;
+}
+
+
 #endif /* XS_IMPLEMENTATION */
 
 #endif /* _XS_OPENSSL_H */