X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=tfdef.h;h=539ed42da8c9a9cfd646ef93233d3fe29c5e8f1e;hb=HEAD;hp=5bc29cdf35ec08fc8e12b7647f879ef33ad31ea0;hpb=efa545d64b910923248233618e774ca3b87efebb;p=tfcrypt.git diff --git a/tfdef.h b/tfdef.h index 5bc29cd..539ed42 100644 --- a/tfdef.h +++ b/tfdef.h @@ -1,6 +1,10 @@ #ifndef _THREEFISH_CIPHER_DEFINITIONS_HEADER #define _THREEFISH_CIPHER_DEFINITIONS_HEADER +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif @@ -55,6 +59,11 @@ #define TF_BLOCK_SIZE (TF_SIZE_UNIT * TF_NR_BLOCK_UNITS) #define TF_KEY_SIZE (TF_SIZE_UNIT * TF_NR_KEY_UNITS) +#define TF_NR_TWEAK_UNITS 2 +#define TF_NR_TWEAK_BITS 128 +#define TF_TWEAK_SIZE (TF_SIZE_UNIT * TF_NR_TWEAK_UNITS) +#define TF_TWEAKEY_SIZE (TF_KEY_SIZE - (2 * TF_TWEAK_SIZE)) +#define TF_NR_TWEAKEY_BITS (TF_NR_KEY_BITS - (2 * TF_NR_TWEAK_BITS)) #define TF_TWEAK_WORD1 (TF_NR_KEY_UNITS-3) #define TF_TWEAK_WORD2 (TF_NR_KEY_UNITS-2) #define TF_TWEAK_WORD3 (TF_NR_KEY_UNITS-1) @@ -83,31 +92,38 @@ static inline void data_to_words(void *p, size_t l) #endif } -static inline void ctr_inc(TF_UNIT_TYPE *x, size_t l) +static inline void xor_block(void *dst, const void *src, size_t sz) { - size_t i; + const size_t *sx = (const size_t *)src; + const TF_BYTE_TYPE *usx = (const TF_BYTE_TYPE *)src; + size_t *dx = (size_t *)dst; + TF_BYTE_TYPE *udx = (TF_BYTE_TYPE *)dst; + size_t sl = sz; + + for (sl = 0; sl < (sz / sizeof(size_t)); sl++) dx[sl] ^= sx[sl]; + if (sz - (sl * sizeof(size_t))) for (sl *= sizeof(size_t); sl < sz; sl++) udx[sl] ^= usx[sl]; +} - for (i = 0; i < l; i++) { - x[i] = ((x[i] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0)); - if (x[i]) break; +static inline void ctr_inc(TF_UNIT_TYPE *x, size_t xl) +{ + size_t z; + + for (z = 0; z < xl; z++) { + x[z] = ((x[z] + (TF_UNIT_TYPE)1) & ((TF_UNIT_TYPE)~0)); + if (x[z]) break; } } -static inline void ctr_add(TF_UNIT_TYPE *x, const TF_UNIT_TYPE *y, size_t l) +static inline void ctr_add(TF_UNIT_TYPE *x, size_t xl, const TF_UNIT_TYPE *y, size_t yl) { - size_t i, f = 0; + size_t z, cf; TF_UNIT_TYPE t; - for (i = 0; i < l; i++) { - t = x[i]; - x[i] += y[i]; x[i] &= ((TF_UNIT_TYPE)~0); - if (x[i] < t) { -_again: f++; - t = x[f-i]; - x[f-i]++; - if (x[f-i] < t) goto _again; - else f = 0; - } + for (z = 0, cf = 0; z < xl; z++) { + t = x[z] + (z >= yl ? (TF_UNIT_TYPE)0 : y[z]) + cf; + if (cf) cf = (x[z] >= t ? 1 : 0); + else cf = (x[z] > t ? 1 : 0); + x[z] = t; } } @@ -123,14 +139,17 @@ void tf_decrypt_block(const void *key, void *out, const void *in); void tf_ctr_set(void *ctr, const void *sctr, size_t sctrsz); void tf_ctr_crypt(const void *key, void *ctr, void *out, const void *in, size_t sz); + +void tf_tweak_set(void *key, const void *tweak); + void tf_stream_crypt(struct tfe_stream *tfe, void *out, const void *in, size_t sz); void tf_ecb_encrypt(const void *key, void *out, const void *in, size_t sz); void tf_ecb_decrypt(const void *key, void *out, const void *in, size_t sz); void tf_cbc_encrypt(const void *key, void *iv, void *out, const void *in, size_t sz); void tf_cbc_decrypt(const void *key, void *iv, void *out, const void *in, size_t sz); +void tf_pcbc_encrypt(const void *key, void *iv, void *out, const void *in, size_t sz); +void tf_pcbc_decrypt(const void *key, void *iv, void *out, const void *in, size_t sz); void tf_xts_encrypt(const void *keyx, const void *keyz, void *ctr, void *out, const void *in, size_t sz, size_t bpi); void tf_xts_decrypt(const void *keyx, const void *keyz, void *ctr, void *out, const void *in, size_t sz, size_t bpi); -void tf_ocb_encrypt(const void *key, void *ctr, void *out, void *tag, const void *in, size_t sz, size_t bpi); -void tf_ocb_decrypt(const void *key, void *ctr, void *out, void *tag, const void *in, size_t sz, size_t bpi); #endif