From 05f3648517ab4ff1e3a76d3b8b710b0bbb6750cd Mon Sep 17 00:00:00 2001 From: Tee Teoh Date: Mon, 4 Jun 2007 14:27:05 -0400 Subject: [PATCH] Adding sha256 and sha512 --- lib/crypto/c_src/crypto_drv.c | 85 ++++++++++++++++++++++++++++++++++++++++- lib/crypto/src/crypto.erl | 44 +++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletions(-) diff --git a/lib/crypto/c_src/crypto_drv.c b/lib/crypto/c_src/crypto_drv.c index bf8d3fc..6499989 100644 --- a/lib/crypto/c_src/crypto_drv.c +++ b/lib/crypto/c_src/crypto_drv.c @@ -113,8 +113,18 @@ static ErlDrvData driver_data = (ErlDrvData) &erlang_port; /* Anything goes */ #define DRV_CBC_AES128_ENCRYPT 24 #define DRV_CBC_AES128_DECRYPT 25 +#define DRV_SHA256 26 +#define DRV_SHA256_INIT 27 +#define DRV_SHA256_UPDATE 28 +#define DRV_SHA256_FINAL 29 -#define NUM_CRYPTO_FUNCS 25 +#define DRV_SHA512 30 +#define DRV_SHA512_INIT 31 +#define DRV_SHA512_UPDATE 32 +#define DRV_SHA512_FINAL 33 + +/* need to increment this to match */ +#define NUM_CRYPTO_FUNCS 29 #define MD5_CTX_LEN (sizeof(MD5_CTX)) #define MD5_LEN 16 @@ -124,6 +134,13 @@ static ErlDrvData driver_data = (ErlDrvData) &erlang_port; /* Anything goes */ #define SHA_LEN_96 12 #define HMAC_INT_LEN 64 +/* Additions for sha256 and sha512 */ +#define SHA256_CTX_LEN (sizeof(SHA256_CTX)) +#define SHA256_LEN 32 + +#define SHA512_CTX_LEN (sizeof(SHA512_CTX)) +#define SHA512_LEN 64 + #define HMAC_IPAD 0x36 #define HMAC_OPAD 0x5c @@ -195,6 +212,10 @@ static int control(ErlDrvData drv_data, unsigned int command, char *buf, DSA_SIG *dsa_sig; AES_KEY aes_key; + /* context for sha256 and sha512 */ + SHA256_CTX sha256_ctx; + SHA512_CTX sha512_ctx; + switch(command) { case DRV_INFO: @@ -267,6 +288,68 @@ static int control(ErlDrvData drv_data, unsigned int command, char *buf, return SHA_LEN; break; + case DRV_SHA256: + *rbuf = (char *)(bin = driver_alloc_binary(SHA256_LEN)); + SHA256(buf, len, bin->orig_bytes); + return SHA256_LEN; + break; + + case DRV_SHA256_INIT: + *rbuf = (char *)(bin = driver_alloc_binary(SHA256_CTX_LEN)); + SHA256_Init((SHA256_CTX *)bin->orig_bytes); + return SHA256_CTX_LEN; + break; + + case DRV_SHA256_UPDATE: + if (len < SHA256_CTX_LEN) + return -1; + *rbuf = (char *)(bin = driver_alloc_binary(SHA256_CTX_LEN)); + memcpy(bin->orig_bytes, buf, SHA256_CTX_LEN); + SHA256_Update((SHA256_CTX *)bin->orig_bytes, buf + SHA256_CTX_LEN, + len - SHA256_CTX_LEN); + return SHA256_CTX_LEN; + break; + + case DRV_SHA256_FINAL: + if (len != SHA256_CTX_LEN) + return -1; + memcpy(&sha_ctx, buf, SHA256_CTX_LEN); /* XXX Use buf only? */ + *rbuf = (char *)(bin = driver_alloc_binary(SHA256_LEN)); + SHA256_Final(bin->orig_bytes, &sha_ctx); + return SHA256_LEN; + break; + + case DRV_SHA512: + *rbuf = (char *)(bin = driver_alloc_binary(SHA512_LEN)); + SHA512(buf, len, bin->orig_bytes); + return SHA512_LEN; + break; + + case DRV_SHA512_INIT: + *rbuf = (char *)(bin = driver_alloc_binary(SHA512_CTX_LEN)); + SHA512_Init((SHA512_CTX *)bin->orig_bytes); + return SHA512_CTX_LEN; + break; + + case DRV_SHA512_UPDATE: + if (len < SHA512_CTX_LEN) + return -1; + *rbuf = (char *)(bin = driver_alloc_binary(SHA512_CTX_LEN)); + memcpy(bin->orig_bytes, buf, SHA512_CTX_LEN); + SHA512_Update((SHA512_CTX *)bin->orig_bytes, buf + SHA512_CTX_LEN, + len - SHA512_CTX_LEN); + return SHA512_CTX_LEN; + break; + + case DRV_SHA512_FINAL: + if (len != SHA512_CTX_LEN) + return -1; + memcpy(&sha_ctx, buf, SHA512_CTX_LEN); /* XXX Use buf only? */ + *rbuf = (char *)(bin = driver_alloc_binary(SHA512_LEN)); + SHA512_Final(bin->orig_bytes, &sha_ctx); + return SHA512_LEN; + break; + case DRV_MD5_MAC: case DRV_MD5_MAC_96: /* buf = klen[4] key data */ diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index 13ea754..b5d4473 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -23,6 +23,8 @@ -export([start/0, stop/0, info/0]). -export([md5/1, md5_init/0, md5_update/2, md5_final/1]). -export([sha/1, sha_init/0, sha_update/2, sha_final/1]). +-export([sha256/1, sha256_init/0, sha256_update/2, sha256_final/1]). +-export([sha512/1, sha512_init/0, sha512_update/2, sha512_final/1]). -export([md5_mac/2, md5_mac_96/2, sha_mac/2, sha_mac_96/2]). -export([des_cbc_encrypt/3, des_cbc_decrypt/3, des_cbc_ivec/1]). -export([des3_cbc_encrypt/5, des3_cbc_decrypt/5]). @@ -66,6 +68,16 @@ -define(AES_CBC_128_ENCRYPT, 24). -define(AES_CBC_128_DECRYPT, 25). +-define(SHA256, 26). +-define(SHA256_INIT, 27). +-define(SHA256_UPDATE, 28). +-define(SHA256_FINAL, 29). + +-define(SHA512, 30). +-define(SHA512_INIT, 31). +-define(SHA512_UPDATE, 32). +-define(SHA512_FINAL, 33). + -define(FUNC_LIST, [md5, md5_init, md5_update, @@ -74,6 +86,14 @@ sha_init, sha_update, sha_final, + sha256, + sha256_init, + sha256_update, + sha256_final, + sha512, + sha512_init, + sha512_update, + sha512_final, md5_mac, md5_mac_96, sha_mac, @@ -139,6 +159,30 @@ sha_update(Context, Data) -> sha_final(Context) -> control(?SHA_FINAL, Context). +sha256(Data) -> + control(?SHA256, Data). + +sha256_init() -> + control(?SHA256_INIT, []). + +sha256_update(Context, Data) -> + control(?SHA256_UPDATE, [Context, Data]). + +sha256_final(Context) -> + control(?SHA256_FINAL, Context). + +sha512(Data) -> + control(?SHA512, Data). + +sha512_init() -> + control(?SHA512_INIT, []). + +sha512_update(Context, Data) -> + control(?SHA512_UPDATE, [Context, Data]). + +sha512_final(Context) -> + control(?SHA512_FINAL, Context). + %% %% MESSAGE AUTHENTICATION CODES %% -- 1.5.2