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 */