51 broke -E logic completely, rewise it
[tfcrypt.git] / tfe.c
diff --git a/tfe.c b/tfe.c
index 127d063cd26d71fe0f96055ae30839ed0a80d603..b25fc7da777ae97ebee751f640df92f416537893 100644 (file)
--- a/tfe.c
+++ b/tfe.c
@@ -7,7 +7,7 @@ void tfe_init_iv(struct tfe_stream *tfe, const void *key, const void *iv)
        memset(tfe, 0, sizeof(struct tfe_stream));
        memcpy(tfe->key, key, TF_KEY_SIZE);
        if (iv) memcpy(tfe->iv, iv, TF_BLOCK_SIZE);
-       tfe->carry_bytes = 0;
+       tfe->tidx = 0;
 }
 
 void tfe_init(struct tfe_stream *tfe, const void *key)
@@ -18,25 +18,27 @@ void tfe_init(struct tfe_stream *tfe, const void *key)
 void tfe_emit(void *dst, size_t szdst, struct tfe_stream *tfe)
 {
        TF_BYTE_TYPE *udst = dst;
-       size_t sz = szdst;
+       size_t sz = szdst, trem;
 
        if (!dst && szdst == 0) {
                memset(tfe, 0, sizeof(struct tfe_stream));
                return;
        }
 
-       if (tfe->carry_bytes > 0) {
-               if (tfe->carry_bytes > szdst) {
-                       memcpy(udst, tfe->carry_block, szdst);
-                       memmove(tfe->carry_block, tfe->carry_block+szdst, tfe->carry_bytes-szdst);
-                       tfe->carry_bytes -= szdst;
+       if (tfe->tidx > 0) {
+               trem = TF_BLOCK_SIZE-tfe->tidx;
+
+               if (szdst <= trem) {
+                       memcpy(udst, &tfe->tmp[tfe->tidx], szdst);
+                       tfe->tidx += szdst;
+                       if (tfe->tidx >= TF_BLOCK_SIZE) tfe->tidx = 0;
                        return;
                }
 
-               memcpy(udst, tfe->carry_block, tfe->carry_bytes);
-               udst += tfe->carry_bytes;
-               sz -= tfe->carry_bytes;
-               tfe->carry_bytes = 0;
+               memcpy(udst, &tfe->tmp[tfe->tidx], trem);
+               udst += trem;
+               sz -= trem;
+               tfe->tidx = 0;
        }
 
        if (sz >= TF_BLOCK_SIZE) {
@@ -50,10 +52,9 @@ void tfe_emit(void *dst, size_t szdst, struct tfe_stream *tfe)
 
        if (sz) {
                tf_encrypt_rawblk(tfe->iv, tfe->iv, tfe->key);
-               memcpy(udst, tfe->iv, sz);
-               data_to_words(udst, TF_BLOCK_SIZE);
-               udst = (TF_BYTE_TYPE *)tfe->iv;
-               tfe->carry_bytes = TF_BLOCK_SIZE-sz;
-               memcpy(tfe->carry_block, udst+sz, tfe->carry_bytes);
+               memcpy(tfe->tmp, tfe->iv, TF_BLOCK_SIZE);
+               data_to_words(tfe->tmp, TF_BLOCK_SIZE);
+               memcpy(udst, tfe->tmp, sz);
+               tfe->tidx = sz;
        }
 }