wmem: allow wmem_destroy_list to ignore a NULL list.
[metze/wireshark/wip.git] / wsutil / xtea.c
1 /* xtea.c
2  * Implementation of XTEA cipher
3  * By Ahmad Fatoum <ahmad[AT]a3f.at>
4  * Copyright 2017 Ahmad Fatoum
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * SPDX-License-Identifier: GPL-2.0-or-later
11  */
12
13 #include <glib.h>
14 #include <string.h>
15
16 #include "pint.h"
17 #include "xtea.h"
18
19 void decrypt_xtea_ecb(guint8 plaintext[8], const guint8 ciphertext[8], const guint32 key[4], guint num_rounds)
20 {
21     guint i;
22     guint32 v[2], delta = 0x9E3779B9, sum = delta * num_rounds;
23
24     v[0] = pntoh32(&ciphertext[0]);
25     v[1] = pntoh32(&ciphertext[4]);
26
27     for (i = 0; i < num_rounds; i++) {
28         v[1] -= (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + key[(sum >> 11) & 3]);
29         sum -= delta;
30         v[0] -= (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + key[sum & 3]);
31     }
32
33     v[0] = GUINT32_TO_BE(v[0]);
34     v[1] = GUINT32_TO_BE(v[1]);
35
36     memcpy(plaintext, v, sizeof v);
37 }
38
39 void decrypt_xtea_le_ecb(guint8 plaintext[8], const guint8 ciphertext[8], const guint32 key[4], guint num_rounds)
40 {
41     guint i;
42     guint32 v[2], delta = 0x9E3779B9, sum = delta * num_rounds;
43
44     v[0] = pletoh32(&ciphertext[0]);
45     v[1] = pletoh32(&ciphertext[4]);
46
47     for (i = 0; i < num_rounds; i++) {
48         v[1] -= (((v[0] << 4) ^ (v[0] >> 5)) + v[0]) ^ (sum + key[(sum >> 11) & 3]);
49         sum -= delta;
50         v[0] -= (((v[1] << 4) ^ (v[1] >> 5)) + v[1]) ^ (sum + key[sum & 3]);
51     }
52
53     v[0] = GUINT32_TO_LE(v[0]);
54     v[1] = GUINT32_TO_LE(v[1]);
55
56     memcpy(plaintext, v, sizeof v);
57 }
58
59 /*
60  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
61  *
62  * Local variables:
63  * c-basic-offset: 4
64  * tab-width: 8
65  * indent-tabs-mode: nil
66  * End:
67  *
68  * vi: set shiftwidth=4 tabstop=8 expandtab:
69  * :indentSize=4:tabSize=8:noTabs=true:
70  */