diff options
| -rw-r--r-- | xs_openssl.h | 41 |
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); | |||
| 11 | d_char *xs_rsa_genkey(int bits); | 11 | d_char *xs_rsa_genkey(int bits); |
| 12 | d_char *xs_rsa_sign(char *secret, char *mem, int size); | 12 | d_char *xs_rsa_sign(char *secret, char *mem, int size); |
| 13 | int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig); | 13 | int xs_rsa_verify(char *pubkey, char *mem, int size, char *b64sig); |
| 14 | d_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 | ||
| 23 | d_char *xs_md5_hex(const void *input, int size) | 25 | d_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 | |||
| 180 | d_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 */ |