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(-)
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
From b869aef371836879f0dd1c306a90acb5f93f3ad0 Mon Sep 17 00:00:00 2001
From: Alexander Uvarov
Date: Mon, 1 Mar 2010 03:56:07 +0500
Subject: Add missing docs for crypto:md4/1
---
lib/crypto/doc/src/crypto.xml | 49 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index 763c198638..a6b5cee822 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -34,6 +34,9 @@
References:
+ -
+
md4: The MD4 Message Digest Algorithm (RFC 1320)
+
-
md5: The MD5 Message Digest Algorithm (RFC 1321)
@@ -114,6 +117,52 @@ Mpint() = >]]>
+
+ md4(Data) -> Digest
+ Compute an MD4message digest from Data
+
+ Data = iolist() | binary()
+ Digest = binary()
+
+
+ Computes an MD4 message digest from Data, where
+ the length of the digest is 128 bits (16 bytes).
+
+
+
+ md4_init() -> Context
+ Creates an MD4 context
+
+ Context = binary()
+
+
+ Creates an MD4 context, to be used in subsequent calls to
+ md4_update/2.
+
+
+
+ md4_update(Context, Data) -> NewContext
+ Update an MD4 Contextwith Data, and return a NewContext
+
+ Data = iolist() | binary()
+ Context = NewContext = binary()
+
+
+ Updates an MD4 Context with Data, and returns
+ a NewContext.
+
+
+
+ md4_final(Context) -> Digest
+ Finish the update of an MD4 Contextand return the computed MD4message digest
+
+ Context = Digest = binary()
+
+
+ Finishes the update of an MD4 Context and returns
+ the computed MD4 message digest.
+
+
md5(Data) -> Digest
Compute an MD5message digest from Data
--
cgit v1.2.3