|
@ -89,7 +89,8 @@ static int enc_method; |
|
|
static struct cache *iv_cache; |
|
|
static struct cache *iv_cache; |
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
#ifdef DEBUG |
|
|
static void dump(char *tag, char *text, int len) |
|
|
|
|
|
|
|
|
static void |
|
|
|
|
|
dump(char *tag, char *text, int len) |
|
|
{ |
|
|
{ |
|
|
int i; |
|
|
int i; |
|
|
printf("%s: ", tag); |
|
|
printf("%s: ", tag); |
|
@ -234,7 +235,8 @@ static const int supported_ciphers_key_size[CIPHER_NUM] = { |
|
|
0, 16, 16, 16, 24, 32, 16, 24, 32, 16, 16, 24, 32, 16, 8, 16, 16, 16, 32, 32, 32 |
|
|
0, 16, 16, 16, 24, 32, 16, 24, 32, 16, 16, 24, 32, 16, 8, 16, 16, 16, 32, 32, 32 |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
static int safe_memcmp(const void *s1, const void *s2, size_t n) |
|
|
|
|
|
|
|
|
static int |
|
|
|
|
|
safe_memcmp(const void *s1, const void *s2, size_t n) |
|
|
{ |
|
|
{ |
|
|
const unsigned char *_s1 = (const unsigned char *)s1; |
|
|
const unsigned char *_s1 = (const unsigned char *)s1; |
|
|
const unsigned char *_s2 = (const unsigned char *)s2; |
|
|
const unsigned char *_s2 = (const unsigned char *)s2; |
|
@ -245,7 +247,8 @@ static int safe_memcmp(const void *s1, const void *s2, size_t n) |
|
|
return !!ret; |
|
|
return !!ret; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int balloc(buffer_t *ptr, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
balloc(buffer_t *ptr, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
sodium_memzero(ptr, sizeof(buffer_t)); |
|
|
sodium_memzero(ptr, sizeof(buffer_t)); |
|
|
ptr->array = ss_malloc(capacity); |
|
|
ptr->array = ss_malloc(capacity); |
|
@ -253,7 +256,8 @@ int balloc(buffer_t *ptr, size_t capacity) |
|
|
return capacity; |
|
|
return capacity; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int brealloc(buffer_t *ptr, size_t len, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
brealloc(buffer_t *ptr, size_t len, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
if (ptr == NULL) |
|
|
if (ptr == NULL) |
|
|
return -1; |
|
|
return -1; |
|
@ -265,7 +269,8 @@ int brealloc(buffer_t *ptr, size_t len, size_t capacity) |
|
|
return real_capacity; |
|
|
return real_capacity; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void bfree(buffer_t *ptr) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
bfree(buffer_t *ptr) |
|
|
{ |
|
|
{ |
|
|
if (ptr == NULL) |
|
|
if (ptr == NULL) |
|
|
return; |
|
|
return; |
|
@ -277,9 +282,10 @@ void bfree(buffer_t *ptr) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int crypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen, |
|
|
|
|
|
const uint8_t *n, uint64_t ic, const uint8_t *k, |
|
|
|
|
|
int method) |
|
|
|
|
|
|
|
|
static int |
|
|
|
|
|
crypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen, |
|
|
|
|
|
const uint8_t *n, uint64_t ic, const uint8_t *k, |
|
|
|
|
|
int method) |
|
|
{ |
|
|
{ |
|
|
switch (method) { |
|
|
switch (method) { |
|
|
case SALSA20: |
|
|
case SALSA20: |
|
@ -293,16 +299,18 @@ static int crypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen, |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int random_compare(const void *_x, const void *_y, uint32_t i, |
|
|
|
|
|
uint64_t a) |
|
|
|
|
|
|
|
|
static int |
|
|
|
|
|
random_compare(const void *_x, const void *_y, uint32_t i, |
|
|
|
|
|
uint64_t a) |
|
|
{ |
|
|
{ |
|
|
uint8_t x = *((uint8_t *)_x); |
|
|
uint8_t x = *((uint8_t *)_x); |
|
|
uint8_t y = *((uint8_t *)_y); |
|
|
uint8_t y = *((uint8_t *)_y); |
|
|
return a % (x + i) - a % (y + i); |
|
|
return a % (x + i) - a % (y + i); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void merge(uint8_t *left, int llength, uint8_t *right, |
|
|
|
|
|
int rlength, uint32_t salt, uint64_t key) |
|
|
|
|
|
|
|
|
static void |
|
|
|
|
|
merge(uint8_t *left, int llength, uint8_t *right, |
|
|
|
|
|
int rlength, uint32_t salt, uint64_t key) |
|
|
{ |
|
|
{ |
|
|
uint8_t *ltmp = (uint8_t *)malloc(llength * sizeof(uint8_t)); |
|
|
uint8_t *ltmp = (uint8_t *)malloc(llength * sizeof(uint8_t)); |
|
|
uint8_t *rtmp = (uint8_t *)malloc(rlength * sizeof(uint8_t)); |
|
|
uint8_t *rtmp = (uint8_t *)malloc(rlength * sizeof(uint8_t)); |
|
@ -348,8 +356,9 @@ static void merge(uint8_t *left, int llength, uint8_t *right, |
|
|
ss_free(rtmp); |
|
|
ss_free(rtmp); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void merge_sort(uint8_t array[], int length, |
|
|
|
|
|
uint32_t salt, uint64_t key) |
|
|
|
|
|
|
|
|
static void |
|
|
|
|
|
merge_sort(uint8_t array[], int length, |
|
|
|
|
|
uint32_t salt, uint64_t key) |
|
|
{ |
|
|
{ |
|
|
uint8_t middle; |
|
|
uint8_t middle; |
|
|
uint8_t *left, *right; |
|
|
uint8_t *left, *right; |
|
@ -371,12 +380,14 @@ static void merge_sort(uint8_t array[], int length, |
|
|
merge(left, llength, right, middle, salt, key); |
|
|
merge(left, llength, right, middle, salt, key); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int enc_get_iv_len() |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
enc_get_iv_len() |
|
|
{ |
|
|
{ |
|
|
return enc_iv_len; |
|
|
return enc_iv_len; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
unsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md) |
|
|
|
|
|
|
|
|
unsigned char * |
|
|
|
|
|
enc_md5(const unsigned char *d, size_t n, unsigned char *md) |
|
|
{ |
|
|
{ |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
return MD5(d, n, md); |
|
|
return MD5(d, n, md); |
|
@ -397,7 +408,8 @@ unsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void enc_table_init(const char *pass) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
enc_table_init(const char *pass) |
|
|
{ |
|
|
{ |
|
|
uint32_t i; |
|
|
uint32_t i; |
|
|
uint64_t key = 0; |
|
|
uint64_t key = 0; |
|
@ -420,7 +432,8 @@ void enc_table_init(const char *pass) |
|
|
dec_table[enc_table[i]] = i; |
|
|
dec_table[enc_table[i]] = i; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int cipher_iv_size(const cipher_kt_t *cipher) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
cipher_iv_size(const cipher_kt_t *cipher) |
|
|
{ |
|
|
{ |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
return EVP_CIPHER_iv_length(cipher); |
|
|
return EVP_CIPHER_iv_length(cipher); |
|
@ -432,7 +445,8 @@ int cipher_iv_size(const cipher_kt_t *cipher) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int cipher_key_size(const cipher_kt_t *cipher) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
cipher_key_size(const cipher_kt_t *cipher) |
|
|
{ |
|
|
{ |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
return EVP_CIPHER_key_length(cipher); |
|
|
return EVP_CIPHER_key_length(cipher); |
|
@ -463,8 +477,9 @@ int cipher_key_size(const cipher_kt_t *cipher) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int bytes_to_key(const cipher_kt_t *cipher, const digest_type_t *md, |
|
|
|
|
|
const uint8_t *pass, uint8_t *key, uint8_t *iv) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
bytes_to_key(const cipher_kt_t *cipher, const digest_type_t *md, |
|
|
|
|
|
const uint8_t *pass, uint8_t *key, uint8_t *iv) |
|
|
{ |
|
|
{ |
|
|
size_t datal; |
|
|
size_t datal; |
|
|
datal = strlen((const char *)pass); |
|
|
datal = strlen((const char *)pass); |
|
@ -679,7 +694,8 @@ int bytes_to_key(const cipher_kt_t *cipher, const digest_type_t *md, |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int rand_bytes(uint8_t *output, int len) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
rand_bytes(uint8_t *output, int len) |
|
|
{ |
|
|
{ |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
#if defined(USE_CRYPTO_OPENSSL) |
|
|
return RAND_bytes(output, len); |
|
|
return RAND_bytes(output, len); |
|
@ -805,7 +821,8 @@ int rand_bytes(uint8_t *output, int len) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const cipher_kt_t *get_cipher_type(int method) |
|
|
|
|
|
|
|
|
const cipher_kt_t * |
|
|
|
|
|
get_cipher_type(int method) |
|
|
{ |
|
|
{ |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
LOGE("get_cipher_type(): Illegal method"); |
|
|
LOGE("get_cipher_type(): Illegal method"); |
|
@ -842,7 +859,8 @@ const cipher_kt_t *get_cipher_type(int method) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const digest_type_t *get_digest_type(const char *digest) |
|
|
|
|
|
|
|
|
const digest_type_t * |
|
|
|
|
|
get_digest_type(const char *digest) |
|
|
{ |
|
|
{ |
|
|
if (digest == NULL) { |
|
|
if (digest == NULL) { |
|
|
LOGE("get_digest_type(): Digest name is null"); |
|
|
LOGE("get_digest_type(): Digest name is null"); |
|
@ -858,7 +876,8 @@ const digest_type_t *get_digest_type(const char *digest) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void cipher_context_init(cipher_ctx_t *ctx, int method, int enc) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
cipher_context_init(cipher_ctx_t *ctx, int method, int enc) |
|
|
{ |
|
|
{ |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
LOGE("cipher_context_init(): Illegal method"); |
|
|
LOGE("cipher_context_init(): Illegal method"); |
|
@ -883,7 +902,7 @@ void cipher_context_init(cipher_ctx_t *ctx, int method, int enc) |
|
|
cc->mode = supported_modes_applecc[method]; |
|
|
cc->mode = supported_modes_applecc[method]; |
|
|
cc->padding = ccNoPadding; |
|
|
cc->padding = ccNoPadding; |
|
|
} else { |
|
|
} else { |
|
|
cc->mode = supported_modes_applecc[method]; |
|
|
|
|
|
|
|
|
cc->mode = supported_modes_applecc[method]; |
|
|
if (cc->mode == kCCModeCTR) { |
|
|
if (cc->mode == kCCModeCTR) { |
|
|
cc->padding = ccNoPadding; |
|
|
cc->padding = ccNoPadding; |
|
|
} else { |
|
|
} else { |
|
@ -938,8 +957,9 @@ void cipher_context_init(cipher_ctx_t *ctx, int method, int enc) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void cipher_context_set_iv(cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len, |
|
|
|
|
|
int enc) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
cipher_context_set_iv(cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len, |
|
|
|
|
|
int enc) |
|
|
{ |
|
|
{ |
|
|
const unsigned char *true_key; |
|
|
const unsigned char *true_key; |
|
|
|
|
|
|
|
@ -1051,7 +1071,8 @@ void cipher_context_set_iv(cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len, |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void cipher_context_release(cipher_ctx_t *ctx) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
cipher_context_release(cipher_ctx_t *ctx) |
|
|
{ |
|
|
{ |
|
|
if (enc_method >= SALSA20) { |
|
|
if (enc_method >= SALSA20) { |
|
|
return; |
|
|
return; |
|
@ -1080,8 +1101,9 @@ void cipher_context_release(cipher_ctx_t *ctx) |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static int cipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *olen, |
|
|
|
|
|
const uint8_t *input, size_t ilen) |
|
|
|
|
|
|
|
|
static int |
|
|
|
|
|
cipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *olen, |
|
|
|
|
|
const uint8_t *input, size_t ilen) |
|
|
{ |
|
|
{ |
|
|
#ifdef USE_CRYPTO_APPLECC |
|
|
#ifdef USE_CRYPTO_APPLECC |
|
|
cipher_cc_t *cc = &ctx->cc; |
|
|
cipher_cc_t *cc = &ctx->cc; |
|
@ -1108,7 +1130,8 @@ static int cipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *ole |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
uint8_t hash[ONETIMEAUTH_BYTES * 2]; |
|
|
uint8_t hash[ONETIMEAUTH_BYTES * 2]; |
|
|
uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; |
|
|
uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; |
|
@ -1133,7 +1156,8 @@ int ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity) |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv) |
|
|
{ |
|
|
{ |
|
|
uint8_t hash[ONETIMEAUTH_BYTES * 2]; |
|
|
uint8_t hash[ONETIMEAUTH_BYTES * 2]; |
|
|
uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; |
|
|
uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH]; |
|
@ -1153,7 +1177,8 @@ int ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv) |
|
|
return safe_memcmp(buf->array + len, hash, ONETIMEAUTH_BYTES); |
|
|
return safe_memcmp(buf->array + len, hash, ONETIMEAUTH_BYTES); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_encrypt_all(buffer_t *plain, int method, int auth, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_encrypt_all(buffer_t *plain, int method, int auth, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
if (method > TABLE) { |
|
|
if (method > TABLE) { |
|
|
cipher_ctx_t evp; |
|
|
cipher_ctx_t evp; |
|
@ -1218,7 +1243,8 @@ int ss_encrypt_all(buffer_t *plain, int method, int auth, size_t capacity) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_encrypt(buffer_t *plain, enc_ctx_t *ctx, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_encrypt(buffer_t *plain, enc_ctx_t *ctx, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
if (ctx != NULL) { |
|
|
if (ctx != NULL) { |
|
|
static buffer_t tmp = { 0, 0, 0, NULL }; |
|
|
static buffer_t tmp = { 0, 0, 0, NULL }; |
|
@ -1291,7 +1317,8 @@ int ss_encrypt(buffer_t *plain, enc_ctx_t *ctx, size_t capacity) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_decrypt_all(buffer_t *cipher, int method, int auth, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_decrypt_all(buffer_t *cipher, int method, int auth, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
if (method > TABLE) { |
|
|
if (method > TABLE) { |
|
|
size_t iv_len = enc_iv_len; |
|
|
size_t iv_len = enc_iv_len; |
|
@ -1364,7 +1391,8 @@ int ss_decrypt_all(buffer_t *cipher, int method, int auth, size_t capacity) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_decrypt(buffer_t *cipher, enc_ctx_t *ctx, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_decrypt(buffer_t *cipher, enc_ctx_t *ctx, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
if (ctx != NULL) { |
|
|
if (ctx != NULL) { |
|
|
static buffer_t tmp = { 0, 0, 0, NULL }; |
|
|
static buffer_t tmp = { 0, 0, 0, NULL }; |
|
@ -1448,7 +1476,8 @@ int ss_decrypt(buffer_t *cipher, enc_ctx_t *ctx, size_t capacity) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void enc_ctx_init(int method, enc_ctx_t *ctx, int enc) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
enc_ctx_init(int method, enc_ctx_t *ctx, int enc) |
|
|
{ |
|
|
{ |
|
|
sodium_memzero(ctx, sizeof(enc_ctx_t)); |
|
|
sodium_memzero(ctx, sizeof(enc_ctx_t)); |
|
|
cipher_context_init(&ctx->evp, method, enc); |
|
|
cipher_context_init(&ctx->evp, method, enc); |
|
@ -1458,7 +1487,8 @@ void enc_ctx_init(int method, enc_ctx_t *ctx, int enc) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void enc_key_init(int method, const char *pass) |
|
|
|
|
|
|
|
|
void |
|
|
|
|
|
enc_key_init(int method, const char *pass) |
|
|
{ |
|
|
{ |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
if (method <= TABLE || method >= CIPHER_NUM) { |
|
|
LOGE("enc_key_init(): Illegal method"); |
|
|
LOGE("enc_key_init(): Illegal method"); |
|
@ -1546,7 +1576,8 @@ void enc_key_init(int method, const char *pass) |
|
|
enc_method = method; |
|
|
enc_method = method; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int enc_init(const char *pass, const char *method) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
enc_init(const char *pass, const char *method) |
|
|
{ |
|
|
{ |
|
|
int m = TABLE; |
|
|
int m = TABLE; |
|
|
if (method != NULL) { |
|
|
if (method != NULL) { |
|
@ -1567,7 +1598,8 @@ int enc_init(const char *pass, const char *method) |
|
|
return m; |
|
|
return m; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
int i, j, k; |
|
|
int i, j, k; |
|
|
ssize_t blen = buf->len; |
|
|
ssize_t blen = buf->len; |
|
@ -1625,7 +1657,8 @@ int ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity |
|
|
return 1; |
|
|
return 1; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int ss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity) |
|
|
|
|
|
|
|
|
int |
|
|
|
|
|
ss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity) |
|
|
{ |
|
|
{ |
|
|
ssize_t blen = buf->len; |
|
|
ssize_t blen = buf->len; |
|
|
uint16_t chunk_len = htons((uint16_t)blen); |
|
|
uint16_t chunk_len = htons((uint16_t)blen); |
|
|