Skip to content

Commit

Permalink
Add des_ecb_encrypt/2 and des_ecb_decrypt/2 to crypto module
Browse files Browse the repository at this point in the history
  • Loading branch information
wildchild authored and bjorng committed Mar 1, 2010
1 parent d704409 commit 544ed56
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 1 deletion.
20 changes: 19 additions & 1 deletion lib/crypto/c_src/crypto_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
{
Expand Down
27 changes: 27 additions & 0 deletions lib/crypto/doc/src/crypto.xml
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,33 @@ Mpint() = <![CDATA[<<ByteLen:32/integer-big, Bytes:ByteLen/binary>>]]>
</desc>
</func>

<func>
<name>des_ecb_encrypt(Key, Text) -> Cipher</name>
<fsummary>Encrypt <c>Text</c>according to DES in ECB mode</fsummary>
<type>
<v>Key = Text = iolist() | binary()</v>
<v>Cipher = binary()</v>
</type>
<desc>
<p>Encrypts <c>Text</c> according to DES in ECB mode.
<c>Key</c> is the DES key. The lengths of <c>Key</c> and
<c>Text</c> must be 64 bits (8 bytes).</p>
</desc>
</func>
<func>
<name>des_ecb_decrypt(Key, Cipher) -> Text</name>
<fsummary>Decrypt <c>Cipher</c>according to DES in ECB mode</fsummary>
<type>
<v>Key = Cipher = iolist() | binary()</v>
<v>Text = binary()</v>
</type>
<desc>
<p>Decrypts <c>Cipher</c> according to DES in ECB mode.
<c>Key</c> is the DES key. The lengths of <c>Key</c> and
<c>Cipher</c> must be 64 bits (8 bytes).</p>
</desc>
</func>

<func>
<name>blowfish_ecb_encrypt(Key, Text) -> Cipher</name>
<fsummary>Encrypt the first 64 bits of <c>Text</c> using Blowfish in ECB mode</fsummary>
Expand Down
14 changes: 14 additions & 0 deletions lib/crypto/src/crypto.erl
Original file line number Diff line number Diff line change
Expand Up @@ -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]).
Expand Down Expand Up @@ -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).

Expand All @@ -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,
Expand Down Expand Up @@ -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)
%%
Expand Down
24 changes: 24 additions & 0 deletions lib/crypto/test/crypto_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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) ->
Expand Down

0 comments on commit 544ed56

Please sign in to comment.