From 544ed5647d9a89fd2dbd62d56964fa37539bfa11 Mon Sep 17 00:00:00 2001 From: Alexander Uvarov Date: Mon, 1 Mar 2010 02:46:23 +0500 Subject: Add des_ecb_encrypt/2 and des_ecb_decrypt/2 to crypto module --- lib/crypto/c_src/crypto_drv.c | 20 +++++++++++++++++++- lib/crypto/doc/src/crypto.xml | 27 +++++++++++++++++++++++++++ lib/crypto/src/crypto.erl | 14 ++++++++++++++ lib/crypto/test/crypto_SUITE.erl | 24 ++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) (limited to 'lib/crypto') diff --git a/lib/crypto/c_src/crypto_drv.c b/lib/crypto/c_src/crypto_drv.c index 5b6d750dde..20b99a245b 100644 --- a/lib/crypto/c_src/crypto_drv.c +++ b/lib/crypto/c_src/crypto_drv.c @@ -239,12 +239,15 @@ static ErlDrvEntry crypto_driver_entry = { #define DRV_BF_CBC_ENCRYPT 64 #define DRV_BF_CBC_DECRYPT 65 +#define DRV_ECB_DES_ENCRYPT 66 +#define DRV_ECB_DES_DECRYPT 67 + /* #define DRV_CBC_IDEA_ENCRYPT 34 */ /* #define DRV_CBC_IDEA_DECRYPT 35 */ /* Not DRV_DH_GENERATE_PARAMS DRV_DH_CHECK * Calc RSA_VERIFY_* and RSA_SIGN once */ -#define NUM_CRYPTO_FUNCS 46 +#define NUM_CRYPTO_FUNCS 48 #define MD5_CTX_LEN (sizeof(MD5_CTX)) #define MD5_LEN 16 @@ -538,6 +541,21 @@ static int crypto_control(ErlDrvData drv_data, unsigned int command, char *buf, (command == DRV_CBC_DES_ENCRYPT)); return dlen; + case DRV_ECB_DES_ENCRYPT: + case DRV_ECB_DES_DECRYPT: + /* buf = key[8] data */ + dlen = len - 8; + if (dlen != 8) + return -1; + des_key = (const_DES_cblock*) buf; + des_dbuf = (unsigned char *) (buf + 8); + bin = return_binary(rbuf,rlen,dlen); + if (bin==NULL) return -1; + DES_set_key(des_key, &schedule); + DES_ecb_encrypt((const_DES_cblock*) des_dbuf, (DES_cblock*) bin, &schedule, + (command == DRV_ECB_DES_ENCRYPT)); + return dlen; + case DRV_BF_ECB_ENCRYPT: case DRV_BF_ECB_DECRYPT: { diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml index cfc6996332..763c198638 100644 --- a/lib/crypto/doc/src/crypto.xml +++ b/lib/crypto/doc/src/crypto.xml @@ -338,6 +338,33 @@ Mpint() = >]]> + + des_ecb_encrypt(Key, Text) -> Cipher + Encrypt Textaccording to DES in ECB mode + + Key = Text = iolist() | binary() + Cipher = binary() + + +

Encrypts Text according to DES in ECB mode. + Key is the DES key. The lengths of Key and + Text must be 64 bits (8 bytes).

+
+
+ + des_ecb_decrypt(Key, Cipher) -> Text + Decrypt Cipheraccording to DES in ECB mode + + Key = Cipher = iolist() | binary() + Text = binary() + + +

Decrypts Cipher according to DES in ECB mode. + Key is the DES key. The lengths of Key and + Cipher must be 64 bits (8 bytes).

+
+
+ blowfish_ecb_encrypt(Key, Text) -> Cipher Encrypt the first 64 bits of Text using Blowfish in ECB mode diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl index fa33bad2e0..16798bd33e 100644 --- a/lib/crypto/src/crypto.erl +++ b/lib/crypto/src/crypto.erl @@ -29,6 +29,7 @@ %-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([des_ecb_encrypt/2, des_ecb_decrypt/2]). -export([des3_cbc_encrypt/5, des3_cbc_decrypt/5]). -export([blowfish_ecb_encrypt/2, blowfish_ecb_decrypt/2]). -export([blowfish_cbc_encrypt/3, blowfish_cbc_decrypt/3]). @@ -124,6 +125,9 @@ -define(BF_CBC_ENCRYPT, 64). -define(BF_CBC_DECRYPT, 65). +-define(DES_ECB_ENCRYPT, 66). +-define(DES_ECB_DECRYPT, 67). + %% -define(IDEA_CBC_ENCRYPT, 34). %% -define(IDEA_CBC_DECRYPT, 35). @@ -135,6 +139,7 @@ md5_mac, md5_mac_96, sha_mac, sha_mac_96, des_cbc_encrypt, des_cbc_decrypt, + des_ecb_encrypt, des_ecb_decrypt, des_ede3_cbc_encrypt, des_ede3_cbc_decrypt, aes_cfb_128_encrypt, aes_cfb_128_decrypt, rand_bytes, @@ -294,6 +299,15 @@ des_cbc_ivec(Data) when is_binary(Data) -> des_cbc_ivec(Data) when is_list(Data) -> des_cbc_ivec(list_to_binary(Data)). +%% +%% DES - in electronic codebook mode (ECB) +%% +des_ecb_encrypt(Key, Data) -> + control(?DES_ECB_ENCRYPT, [Key, Data]). + +des_ecb_decrypt(Key, Data) -> + control(?DES_ECB_DECRYPT, [Key, Data]). + %% %% DES3 - in cipher block chaining mode (CBC) %% diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl index 290ef19160..636b7f4594 100644 --- a/lib/crypto/test/crypto_SUITE.erl +++ b/lib/crypto/test/crypto_SUITE.erl @@ -40,6 +40,7 @@ md5_mac_io/1, des_cbc/1, des_cbc_iter/1, + des_ecb/1, aes_cfb/1, aes_cbc/1, aes_cbc_iter/1, @@ -78,6 +79,7 @@ all(suite) -> aes_cbc, aes_cbc_iter, des_cbc_iter, + des_ecb, rand_uniform_test, rsa_verify_test, dsa_verify_test, @@ -443,6 +445,28 @@ des_cbc_iter(Config) when is_list(Config) -> ?line m(Cipher, hexstr2bin("e5c7cdde872bf27c43e934008c389c" "0f683788499a7c05f6")). +%% +%% +des_ecb(doc) -> + "Encrypt and decrypt according to ECB DES and check the result. " + "Example are from FIPS-81."; +des_ecb(suite) -> + []; +des_ecb(Config) when is_list(Config) -> + ?line Key = hexstr2bin("0123456789abcdef"), + ?line Cipher1 = crypto:des_ecb_encrypt(Key, "Now is t"), + ?line m(Cipher1, hexstr2bin("3fa40e8a984d4815")), + ?line Cipher2 = crypto:des_ecb_encrypt(Key, "he time "), + ?line m(Cipher2, hexstr2bin("6a271787ab8883f9")), + ?line Cipher3 = crypto:des_ecb_encrypt(Key, "for all "), + ?line m(Cipher3, hexstr2bin("893d51ec4b563b53")), + ?line Cipher4 = crypto:des_ecb_decrypt(Key, hexstr2bin("3fa40e8a984d4815")), + ?line m(Cipher4, <<"Now is t">>), + ?line Cipher5 = crypto:des_ecb_decrypt(Key, hexstr2bin("6a271787ab8883f9")), + ?line m(Cipher5, <<"he time ">>), + ?line Cipher6 = crypto:des_ecb_decrypt(Key, hexstr2bin("893d51ec4b563b53")), + ?line m(Cipher6, <<"for all ">>). + %% %% aes_cfb(doc) -> -- cgit v1.2.3