1
1

aes128-ctr aes192-ctr aes256-ctr for libgcrypt

Этот коммит содержится в:
Aris Adamantiadis 2010-02-09 22:24:04 +01:00
родитель dc0d945f28
Коммит fdfd12716e
2 изменённых файлов: 51 добавлений и 8 удалений

Просмотреть файл

@ -44,7 +44,7 @@
#ifdef HAVE_LIBGCRYPT #ifdef HAVE_LIBGCRYPT
#define BLOWFISH "blowfish-cbc," #define BLOWFISH "blowfish-cbc,"
#define AES "aes256-cbc,aes192-cbc,aes128-cbc," #define AES "aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,"
#define DES "3des-cbc" #define DES "3des-cbc"
#elif defined HAVE_LIBCRYPTO #elif defined HAVE_LIBCRYPTO
#ifdef HAVE_OPENSSL_BLOWFISH_H #ifdef HAVE_OPENSSL_BLOWFISH_H

Просмотреть файл

@ -157,29 +157,31 @@ static void blowfish_decrypt(struct crypto_struct *cipher, void *in,
} }
static int aes_set_key(struct crypto_struct *cipher, void *key, void *IV) { static int aes_set_key(struct crypto_struct *cipher, void *key, void *IV) {
int mode=GCRY_CIPHER_MODE_CBC;
if (cipher->key == NULL) { if (cipher->key == NULL) {
if (alloc_key(cipher) < 0) { if (alloc_key(cipher) < 0) {
return -1; return -1;
} }
if(strstr(cipher->name,"-ctr"))
mode=GCRY_CIPHER_MODE_CTR;
switch (cipher->keysize) { switch (cipher->keysize) {
case 128: case 128:
if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES128, if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES128,
GCRY_CIPHER_MODE_CBC, 0)) { mode, 0)) {
SAFE_FREE(cipher->key); SAFE_FREE(cipher->key);
return -1; return -1;
} }
break; break;
case 192: case 192:
if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES192, if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES192,
GCRY_CIPHER_MODE_CBC, 0)) { mode, 0)) {
SAFE_FREE(cipher->key); SAFE_FREE(cipher->key);
return -1; return -1;
} }
break; break;
case 256: case 256:
if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES256, if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES256,
GCRY_CIPHER_MODE_CBC, 0)) { mode, 0)) {
SAFE_FREE(cipher->key); SAFE_FREE(cipher->key);
return -1; return -1;
} }
@ -189,10 +191,18 @@ static int aes_set_key(struct crypto_struct *cipher, void *key, void *IV) {
SAFE_FREE(cipher->key); SAFE_FREE(cipher->key);
return -1; return -1;
} }
if(mode == GCRY_CIPHER_MODE_CBC){
if (gcry_cipher_setiv(cipher->key[0], IV, 16)) { if (gcry_cipher_setiv(cipher->key[0], IV, 16)) {
SAFE_FREE(cipher->key); SAFE_FREE(cipher->key);
return -1; return -1;
} }
} else {
if(gcry_cipher_setctr(cipher->key[0],IV,16)){
SAFE_FREE(cipher->key);
return -1;
}
}
} }
return 0; return 0;
@ -319,6 +329,39 @@ static struct crypto_struct ssh_ciphertab[] = {
.cbc_encrypt = blowfish_encrypt, .cbc_encrypt = blowfish_encrypt,
.cbc_decrypt = blowfish_decrypt .cbc_decrypt = blowfish_decrypt
}, },
{
.name = "aes128-ctr",
.blocksize = 16,
.keylen = sizeof(gcry_cipher_hd_t),
.key = NULL,
.keysize = 128,
.set_encrypt_key = aes_set_key,
.set_decrypt_key = aes_set_key,
.cbc_encrypt = aes_encrypt,
.cbc_decrypt = aes_encrypt
},
{
.name = "aes192-ctr",
.blocksize = 16,
.keylen = sizeof(gcry_cipher_hd_t),
.key = NULL,
.keysize = 192,
.set_encrypt_key = aes_set_key,
.set_decrypt_key = aes_set_key,
.cbc_encrypt = aes_encrypt,
.cbc_decrypt = aes_encrypt
},
{
.name = "aes256-ctr",
.blocksize = 16,
.keylen = sizeof(gcry_cipher_hd_t),
.key = NULL,
.keysize = 256,
.set_encrypt_key = aes_set_key,
.set_decrypt_key = aes_set_key,
.cbc_encrypt = aes_encrypt,
.cbc_decrypt = aes_encrypt
},
{ {
.name = "aes128-cbc", .name = "aes128-cbc",
.blocksize = 16, .blocksize = 16,