Welcome to mirror list, hosted at ThFree Co, Russian Federation.

memxor.c « utils - github.com/mRemoteNG/PuTTYNG.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 4fd41f415d3ef875578f92368608062f6510dddf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
 * XOR two pieces of memory, copying the result into a third, which
 * may precisely alias one of the input pair (but no guarantees if it
 * partially overlaps).
 */

#include "defs.h"
#include "misc.h"

void memxor(uint8_t *out, const uint8_t *in1, const uint8_t *in2, size_t size)
{
    switch (size & 15) {
      case 0:
        while (size >= 16) {
            size -= 16;
                   *out++ = *in1++ ^ *in2++;
          case 15: *out++ = *in1++ ^ *in2++;
          case 14: *out++ = *in1++ ^ *in2++;
          case 13: *out++ = *in1++ ^ *in2++;
          case 12: *out++ = *in1++ ^ *in2++;
          case 11: *out++ = *in1++ ^ *in2++;
          case 10: *out++ = *in1++ ^ *in2++;
          case 9:  *out++ = *in1++ ^ *in2++;
          case 8:  *out++ = *in1++ ^ *in2++;
          case 7:  *out++ = *in1++ ^ *in2++;
          case 6:  *out++ = *in1++ ^ *in2++;
          case 5:  *out++ = *in1++ ^ *in2++;
          case 4:  *out++ = *in1++ ^ *in2++;
          case 3:  *out++ = *in1++ ^ *in2++;
          case 2:  *out++ = *in1++ ^ *in2++;
          case 1:  *out++ = *in1++ ^ *in2++;
        }
    }
}