commit 6ee71cd

default  ·  2023-03-30 09:17:27 +0000 UTC
parent 1b22dbb
Backport from xs.
2 files changed,  +23, -57
+22, -56
  1@@ -4,10 +4,13 @@
  2 
  3 #define _XS_OPENSSL_H
  4 
  5-xs_str *xs_md5_hex(const xs_val *input, int size);
  6-xs_str *xs_sha1_hex(const xs_val *input, int size);
  7-xs_str *xs_sha256_hex(const xs_val *input, int size);
  8-xs_str *xs_sha256_base64(const xs_val *input, int size);
  9+xs_str *_xs_digest(const xs_val *input, int size, const char *digest, int as_hex);
 10+
 11+#define xs_md5_hex(input, size)       _xs_digest(input, size, "md5",    1)
 12+#define xs_sha1_hex(input, size)      _xs_digest(input, size, "sha1",   1)
 13+#define xs_sha256_hex(input, size)    _xs_digest(input, size, "sha256", 1)
 14+#define xs_sha256_base64(input, size) _xs_digest(input, size, "sha256", 0)
 15+
 16 xs_dict *xs_rsa_genkey(int bits);
 17 xs_str *xs_rsa_sign(const char *secret, const char *mem, int size);
 18 int xs_rsa_verify(const char *pubkey, const char *mem, int size, const char *b64sig);
 19@@ -17,67 +20,30 @@ int xs_evp_verify(const char *pubkey, const char *mem, int size, const char *b64
 20 
 21 #ifdef XS_IMPLEMENTATION
 22 
 23-#include "openssl/md5.h"
 24-#include "openssl/sha.h"
 25 #include "openssl/rsa.h"
 26 #include "openssl/pem.h"
 27 #include "openssl/evp.h"
 28 
 29-xs_str *xs_md5_hex(const xs_val *input, int size)
 30-{
 31-    unsigned char md5[16];
 32-    MD5_CTX ctx;
 33-
 34-    MD5_Init(&ctx);
 35-    MD5_Update(&ctx, input, size);
 36-    MD5_Final(md5, &ctx);
 37-
 38-    return xs_hex_enc((char *)md5, sizeof(md5));
 39-}
 40-
 41-
 42-xs_str *xs_sha1_hex(const xs_val *input, int size)
 43-{
 44-    unsigned char sha1[20];
 45-    SHA_CTX ctx;
 46-
 47-    SHA1_Init(&ctx);
 48-    SHA1_Update(&ctx, input, size);
 49-    SHA1_Final(sha1, &ctx);
 50-
 51-    return xs_hex_enc((char *)sha1, sizeof(sha1));
 52-}
 53-
 54-
 55-unsigned char *_xs_sha256(const void *input, int size, unsigned char *sha256)
 56+xs_str *_xs_digest(const xs_val *input, int size, const char *digest, int as_hex)
 57+/* generic function for generating and encoding digests */
 58 {
 59-    SHA256_CTX ctx;
 60-
 61-    SHA256_Init(&ctx);
 62-    SHA256_Update(&ctx, input, size);
 63-    SHA256_Final(sha256, &ctx);
 64-
 65-    return sha256;
 66-}
 67-
 68-
 69-xs_str *xs_sha256_hex(const xs_val *input, int size)
 70-{
 71-    unsigned char sha256[32];
 72-
 73-    _xs_sha256(input, size, sha256);
 74-
 75-    return xs_hex_enc((char *)sha256, sizeof(sha256));
 76-}
 77+    const EVP_MD *md;
 78 
 79+    if ((md = EVP_get_digestbyname(digest)) == NULL)
 80+        return NULL;
 81 
 82-xs_str *xs_sha256_base64(const xs_val *input, int size)
 83-{
 84-    unsigned char sha256[32];
 85+    unsigned char output[1024];
 86+    unsigned int out_size;
 87+    EVP_MD_CTX *mdctx;
 88 
 89-    _xs_sha256(input, size, sha256);
 90+    mdctx = EVP_MD_CTX_new();
 91+    EVP_DigestInit_ex(mdctx, md, NULL);
 92+    EVP_DigestUpdate(mdctx, input, size);
 93+    EVP_DigestFinal_ex(mdctx, output, &out_size);
 94+    EVP_MD_CTX_free(mdctx);
 95 
 96-    return xs_base64_enc((char *)sha256, sizeof(sha256));
 97+    return as_hex ? xs_hex_enc   ((char *)output, out_size) :
 98+                    xs_base64_enc((char *)output, out_size);
 99 }
100 
101 
+1, -1
1@@ -1 +1 @@
2-/* a4c157da387d94c849d85371ab7773b5f1446dc1 */
3+/* fe95bda22e514fa188c50438cce0eee0c6919911 */