diff --git a/ChangeLog b/ChangeLog index d4d38015325cae27133e35e9318434744d205232..4edad13141b8e890e5ff297a961705cc55aa3a75 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2013-09-17 Niels Möller <nisse@lysator.liu.se> + * src/testsuite/lsh-6-test (ALGORITHMS): Test both 3des-cbc and + 3des-ctr. + + * src/algorithms.c (all_symmetric_algorithms): Added ATOM_3DES_CTR. + (all_crypto_algorithms): Likewise. + (lookup_crypto): For parsng the -c option, make just "3des" mean + "3des-ctr" rather than "3des-cbc". + + * src/crypto.c (des3_ctr_instance): New class. + (do_des3_ctr_crypt): New function. + (make_des3_ctr_instance): New function. + (crypto_des3_ctr_algorithm): New struct. + * src/crypto.h (crypto_des3_ctr_algorithm): Declare. + * src/dsa.c (do_dsa_sign): Fixed failure message. 2013-09-02 Niels Möller <nisse@lysator.liu.se> diff --git a/src/algorithms.c b/src/algorithms.c index 3183901176af75ba209677c68f80e7d2b780f24d..881ff0be5ff78a51c3b16df44e0dba8a3fb28931 100644 --- a/src/algorithms.c +++ b/src/algorithms.c @@ -47,7 +47,7 @@ struct alist * all_symmetric_algorithms() { - return make_alist(12 + return make_alist(13 #if WITH_ZLIB +1 #endif @@ -61,6 +61,7 @@ all_symmetric_algorithms() ATOM_AES256_CTR, &crypto_aes256_ctr_algorithm, ATOM_SERPENT256_CBC, &crypto_serpent256_cbc_algorithm, ATOM_3DES_CBC, &crypto_des3_cbc_algorithm, + ATOM_3DES_CTR, &crypto_des3_ctr_algorithm, ATOM_CAST128_CBC, &crypto_cast128_cbc_algorithm, ATOM_HMAC_SHA1, make_hmac_algorithm(&nettle_sha1), @@ -105,12 +106,13 @@ default_crypto_algorithms(struct alist *algorithms) static struct int_list * all_crypto_algorithms(struct alist *algorithms) { - return filter_algorithms_l(algorithms, 10, + return filter_algorithms_l(algorithms, 11, ATOM_AES128_CBC, ATOM_AES128_CTR, ATOM_AES256_CBC, ATOM_AES256_CTR, ATOM_3DES_CBC, + ATOM_3DES_CTR, ATOM_TWOFISH_CBC, ATOM_CAST128_CBC, ATOM_SERPENT256_CBC, @@ -190,8 +192,10 @@ lookup_crypto(struct alist *algorithms, const char *name, struct crypto_algorith atom = ATOM_TWOFISH_CBC; else if (strcasecmp_list(name, "blowfish-cbc", "blowfish", NULL)) atom = ATOM_BLOWFISH_CBC; - else if (strcasecmp_list(name, "3des-cbc", "3des", NULL)) + else if (strcasecmp_list(name, "3des-cbc", NULL)) atom = ATOM_3DES_CBC; + else if (strcasecmp_list(name, "3des-ctr", "3des", NULL)) + atom = ATOM_3DES_CTR; else if (strcasecmp_list(name, "aes128-cbc", "aes-cbc", NULL)) atom = ATOM_AES128_CBC; else if (strcasecmp_list(name, "aes128-ctr", "aes-ctr", "aes", "aes128", NULL)) diff --git a/src/crypto.c b/src/crypto.c index 00c4a7e5ed32e5aae88335cd39000eb8db6c6587..c9aef660a160f69434177896810811cfcfdc102d 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -276,6 +276,47 @@ struct crypto_algorithm crypto_des3_cbc_algorithm = { STATIC_HEADER, DES3_BLOCK_SIZE, DES3_KEY_SIZE, DES3_BLOCK_SIZE, make_des3_cbc_instance }; +/* GABA: + (class + (name des3_ctr_instance) + (super crypto_instance) + (vars + (ctx . "struct CTR_CTX(struct des3_ctx, DES_BLOCK_SIZE)"))) +*/ + +static void +do_des3_ctr_crypt(struct crypto_instance *s, + uint32_t length, + struct lsh_string *dst, uint32_t di, + const struct lsh_string *src, uint32_t si) +{ + CAST(des3_ctr_instance, self, s); + + lsh_string_ctr_crypt(dst, di, src, si, length, + DES3_BLOCK_SIZE, self->ctx.ctr, + (nettle_crypt_func *) des3_encrypt, + &self->ctx.ctx); +} + +static struct crypto_instance * +make_des3_ctr_instance(struct crypto_algorithm *algorithm UNUSED, int mode UNUSED, + const uint8_t *key, const uint8_t *iv) +{ + NEW(des3_ctr_instance, self); + + self->super.block_size = DES3_BLOCK_SIZE; + + self->super.crypt = do_des3_ctr_crypt; + des3_set_key(&self->ctx.ctx, key); + + CTR_SET_COUNTER(&self->ctx, iv); + + return(&self->super); +} + +struct crypto_algorithm crypto_des3_ctr_algorithm = +{ STATIC_HEADER, + DES3_BLOCK_SIZE, DES3_KEY_SIZE, DES3_BLOCK_SIZE, make_des3_ctr_instance}; /* Cast-128 */ /* GABA: diff --git a/src/crypto.h b/src/crypto.h index 45d6ec03f98f5783af9f54a82821a4ae844e3855..b52cee47ebd43c36bb393ff9d3ee1f6ba6815348 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -85,6 +85,7 @@ extern struct crypto_algorithm crypto_arcfour_algorithm; extern struct crypto_algorithm crypto_blowfish_cbc_algorithm; extern struct crypto_algorithm crypto_cast128_cbc_algorithm; extern struct crypto_algorithm crypto_des3_cbc_algorithm; +extern struct crypto_algorithm crypto_des3_ctr_algorithm; extern struct crypto_algorithm crypto_serpent256_cbc_algorithm; extern struct crypto_algorithm crypto_twofish256_cbc_algorithm; diff --git a/src/testsuite/lsh-6-test b/src/testsuite/lsh-6-test index f0015207b9f8031d2f052c20d3aedb5dd4800e2f..e7a8637cfeb2080e122a12462f79315cd2cd2356 100755 --- a/src/testsuite/lsh-6-test +++ b/src/testsuite/lsh-6-test @@ -10,7 +10,7 @@ fi OLD_FLAGS="$LSH_FLAGS" -ALGORITHMS="arcfour twofish blowfish 3des aes128-cbc aes128-ctr aes256-cbc aes256-ctr cast128 all" +ALGORITHMS="arcfour twofish blowfish 3des-cbc 3des-ctr aes128-cbc aes128-ctr aes256-cbc aes256-ctr cast128 all" LSHD_FLAGS="$LSHD_FLAGS -c all"