1
1

crypt: use hard-wired cipher block sizes consistently

Этот коммит содержится в:
Kamil Dudka 2012-09-11 09:33:34 +02:00
родитель bfbb5a4dc7
Коммит 5d567faecc
6 изменённых файлов: 11 добавлений и 19 удалений

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

@ -96,11 +96,12 @@ crypt_init(LIBSSH2_SESSION * session,
static int static int
crypt_encrypt(LIBSSH2_SESSION * session, unsigned char *block, crypt_encrypt(LIBSSH2_SESSION * session, unsigned char *block,
void **abstract) size_t blocksize, void **abstract)
{ {
struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract; struct crypt_ctx *cctx = *(struct crypt_ctx **) abstract;
(void) session; (void) session;
return _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block); return _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,
blocksize);
} }
static int static int
@ -248,7 +249,8 @@ crypt_init_arcfour128(LIBSSH2_SESSION * session,
unsigned char block[8]; unsigned char block[8];
size_t discard = 1536; size_t discard = 1536;
for (; discard; discard -= 8) for (; discard; discard -= 8)
_libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block); _libssh2_cipher_crypt(&cctx->h, cctx->algo, cctx->encrypt, block,
method->blocksize);
} }
return rc; return rc;

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

@ -103,7 +103,7 @@ int _libssh2_cipher_init(_libssh2_cipher_ctx * h,
int _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, int _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,
_libssh2_cipher_type(algo), _libssh2_cipher_type(algo),
int encrypt, unsigned char *block); int encrypt, unsigned char *block, size_t blocksize);
int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session, int _libssh2_pub_priv_keyfile(LIBSSH2_SESSION *session,
unsigned char **method, unsigned char **method,

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

@ -553,17 +553,11 @@ _libssh2_cipher_init(_libssh2_cipher_ctx * h,
int int
_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,
_libssh2_cipher_type(algo), _libssh2_cipher_type(algo),
int encrypt, unsigned char *block) int encrypt, unsigned char *block, size_t blklen)
{ {
int cipher = _libssh2_gcry_cipher (algo); int cipher = _libssh2_gcry_cipher (algo);
size_t blklen = gcry_cipher_get_algo_blklen(cipher);
int ret; int ret;
if (blklen == 1) {
/* Hack for arcfour. */
blklen = 8;
}
if (encrypt) { if (encrypt) {
ret = gcry_cipher_encrypt(*ctx, block, blklen, block, blklen); ret = gcry_cipher_encrypt(*ctx, block, blklen, block, blklen);
} else { } else {

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

@ -883,7 +883,7 @@ struct _LIBSSH2_CRYPT_METHOD
int *free_iv, unsigned char *secret, int *free_secret, int *free_iv, unsigned char *secret, int *free_secret,
int encrypt, void **abstract); int encrypt, void **abstract);
int (*crypt) (LIBSSH2_SESSION * session, unsigned char *block, int (*crypt) (LIBSSH2_SESSION * session, unsigned char *block,
void **abstract); size_t blocksize, void **abstract);
int (*dtor) (LIBSSH2_SESSION * session, void **abstract); int (*dtor) (LIBSSH2_SESSION * session, void **abstract);
_libssh2_cipher_type(algo); _libssh2_cipher_type(algo);

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

@ -181,18 +181,13 @@ _libssh2_cipher_init(_libssh2_cipher_ctx * h,
int int
_libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx, _libssh2_cipher_crypt(_libssh2_cipher_ctx * ctx,
_libssh2_cipher_type(algo), _libssh2_cipher_type(algo),
int encrypt, unsigned char *block) int encrypt, unsigned char *block, size_t blocksize)
{ {
int blocksize = ctx->cipher->block_size;
unsigned char buf[EVP_MAX_BLOCK_LENGTH]; unsigned char buf[EVP_MAX_BLOCK_LENGTH];
int ret; int ret;
(void) algo; (void) algo;
(void) encrypt; (void) encrypt;
if (blocksize == 1) {
/* Hack for arcfour. */
blocksize = 8;
}
ret = EVP_Cipher(ctx, buf, block, blocksize); ret = EVP_Cipher(ctx, buf, block, blocksize);
if (ret == 1) { if (ret == 1) {
memcpy(block, buf, blocksize); memcpy(block, buf, blocksize);

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

@ -139,7 +139,7 @@ decrypt(LIBSSH2_SESSION * session, unsigned char *source,
assert((len % blocksize) == 0); assert((len % blocksize) == 0);
while (len >= blocksize) { while (len >= blocksize) {
if (session->remote.crypt->crypt(session, source, if (session->remote.crypt->crypt(session, source, blocksize,
&session->remote.crypt_abstract)) { &session->remote.crypt_abstract)) {
LIBSSH2_FREE(session, p->payload); LIBSSH2_FREE(session, p->payload);
return LIBSSH2_ERROR_DECRYPT; return LIBSSH2_ERROR_DECRYPT;
@ -846,6 +846,7 @@ int _libssh2_transport_send(LIBSSH2_SESSION *session,
for(i = 0; i < packet_length; i += session->local.crypt->blocksize) { for(i = 0; i < packet_length; i += session->local.crypt->blocksize) {
unsigned char *ptr = &p->outbuf[i]; unsigned char *ptr = &p->outbuf[i];
if (session->local.crypt->crypt(session, ptr, if (session->local.crypt->crypt(session, ptr,
session->local.crypt->blocksize,
&session->local.crypt_abstract)) &session->local.crypt_abstract))
return LIBSSH2_ERROR_ENCRYPT; /* encryption failure */ return LIBSSH2_ERROR_ENCRYPT; /* encryption failure */
} }