openssl: move shared AES-CTR code into misc
Этот коммит содержится в:
родитель
b3f9557f52
Коммит
e378d2e30a
28
src/misc.c
28
src/misc.c
@ -643,3 +643,31 @@ void *_libssh2_calloc(LIBSSH2_SESSION* session, size_t size)
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/* XOR operation on buffers input1 and input2, result in output.
|
||||
It is safe to use an input buffer as the output buffer. */
|
||||
void _libssh2_xor_data(unsigned char *output,
|
||||
const unsigned char *input1,
|
||||
const unsigned char *input2,
|
||||
size_t length)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < length; i++)
|
||||
*output++ = *input1++ ^ *input2++;
|
||||
}
|
||||
|
||||
/* Increments an AES CTR buffer to prepare it for use with the
|
||||
next AES block. */
|
||||
void _libssh2_aes_ctr_increment(unsigned char *ctr,
|
||||
size_t length)
|
||||
{
|
||||
if (length == 0)
|
||||
return;
|
||||
size_t i = (length - 1);
|
||||
while (ctr[i]++ == 0xFF) {
|
||||
if (i == 0)
|
||||
break;
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
@ -93,4 +93,11 @@ int __cdecl _libssh2_gettimeofday(struct timeval *tp, void *tzp);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void _libssh2_xor_data(unsigned char *output,
|
||||
const unsigned char *input1,
|
||||
const unsigned char *input2,
|
||||
size_t length);
|
||||
|
||||
void _libssh2_aes_ctr_increment(unsigned char *ctr, size_t length);
|
||||
|
||||
#endif /* _LIBSSH2_MISC_H */
|
||||
|
@ -43,6 +43,7 @@
|
||||
#ifdef LIBSSH2_OPENSSL /* compile only if we build with openssl */
|
||||
|
||||
#include <string.h>
|
||||
#include "misc.h"
|
||||
|
||||
#ifndef EVP_MAX_BLOCK_LENGTH
|
||||
#define EVP_MAX_BLOCK_LENGTH 32
|
||||
@ -364,15 +365,8 @@ aes_ctr_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
*out++ = *in++ ^ b1[i];
|
||||
|
||||
i = 15;
|
||||
while (c->ctr[i]++ == 0xFF) {
|
||||
if (i == 0)
|
||||
break;
|
||||
i--;
|
||||
}
|
||||
_libssh2_xor_data(out, in, b1, AES_BLOCK_SIZE);
|
||||
_libssh2_aes_ctr_increment(c->ctr, AES_BLOCK_SIZE);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user