aboutsummaryrefslogtreecommitdiff
path: root/src/test/test_crypto_ope.c
blob: 119ebc114a6c87ed7877310045bcb0e399149a43 (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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* Copyright (c) 2001-2004, Roger Dingledine.
 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
 * Copyright (c) 2007-2020, The Tor Project, Inc. */
/* See LICENSE for licensing information */

#include "orconfig.h"

#define CRYPTO_OPE_PRIVATE

#include "lib/cc/compat_compiler.h"
#include "lib/crypt_ops/crypto_ope.h"
#include "lib/crypt_ops/crypto_cipher.h"
#include "lib/encoding/binascii.h"
#include "lib/malloc/malloc.h"
#include "test/test.h"
#include "tinytest.h"

#include <stddef.h>
#include <string.h>

static void
test_crypto_ope_consistency(void *arg)
{
  (void)arg;

  crypto_ope_t *ope = NULL;
  crypto_cipher_t *aes = NULL;
  const int TEST_VALS[] = { 5, 500, 1023, 1024, 1025, 2046, 2047, 2048, 2049,
                            10000, OPE_INPUT_MAX };
  unsigned i;
  const uint8_t key[32] = "A fixed key, chosen arbitrarily.";

  ope = crypto_ope_new(key);
  tt_assert(ope);

  uint64_t last_val = 0;
  for (i = 0; i < ARRAY_LENGTH(TEST_VALS); ++i) {
    aes = ope_get_cipher(ope, 0);
    int val = TEST_VALS[i];
    uint64_t v1 = crypto_ope_encrypt(ope, val);
    uint64_t v2 = sum_values_from_cipher(aes, val);
    tt_u64_op(v1, OP_EQ, v2);
    tt_u64_op(v2, OP_GT, last_val);
    last_val = v2;
    crypto_cipher_free(aes);
  }

 done:
  crypto_cipher_free(aes);
  crypto_ope_free(ope);
}

static void
test_crypto_ope_oob(void *arg)
{
  (void)arg;

  crypto_ope_t *ope = NULL;
  const uint8_t key[32] = "A fixed key, chosen arbitrarily.";
  ope = crypto_ope_new(key);

  tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,INT_MIN));
  tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,-100));
  tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,0));
  tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,1));
  tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,7000));
  tt_u64_op(UINT64_MAX, OP_NE, crypto_ope_encrypt(ope,OPE_INPUT_MAX));
  tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,OPE_INPUT_MAX+1));
  tt_u64_op(UINT64_MAX, OP_EQ, crypto_ope_encrypt(ope,INT_MAX));
 done:
  crypto_ope_free(ope);
}

static const char OPE_TEST_KEY[] =
  "19e05891d55232c08c2cad91d612fdb9cbd6691949a0742434a76c80bc6992fe";

/* generated by a separate python implementation. */
static const struct {
  int v;
  uint64_t r;
} OPE_TEST_VECTORS[] = {
  { 121132, UINT64_C(3971694514) },
  { 82283, UINT64_C(2695743564) },
  { 72661, UINT64_C(2381548866) },
  { 72941, UINT64_C(2390408421) },
  { 123122, UINT64_C(4036781069) },
  { 12154, UINT64_C(402067100) },
  { 121574, UINT64_C(3986197593) },
  { 11391, UINT64_C(376696838) },
  { 65845, UINT64_C(2161801517) },
  { 86301, UINT64_C(2828270975) },
  { 61284, UINT64_C(2013616892) },
  { 70505, UINT64_C(2313368870) },
  { 30438, UINT64_C(1001394664) },
  { 60150, UINT64_C(1977329668) },
  { 114800, UINT64_C(3764946628) },
  { 109403, UINT64_C(3585352477) },
  { 21893, UINT64_C(721388468) },
  { 123569, UINT64_C(4051780471) },
  { 95617, UINT64_C(3134921876) },
  { 48561, UINT64_C(1597596985) },
  { 53334, UINT64_C(1753691710) },
  { 92746, UINT64_C(3040874493) },
  { 7110, UINT64_C(234966492) },
  { 9612, UINT64_C(318326551) },
  { 106958, UINT64_C(3506124249) },
  { 46889, UINT64_C(1542219146) },
  { 87790, UINT64_C(2877361609) },
  { 68878, UINT64_C(2260369112) },
  { 47917, UINT64_C(1576681737) },
  { 121128, UINT64_C(3971553290) },
  { 108602, UINT64_C(3559176081) },
  { 28217, UINT64_C(929692460) },
  { 69498, UINT64_C(2280554161) },
  { 63870, UINT64_C(2098322675) },
  { 57542, UINT64_C(1891698992) },
  { 122148, UINT64_C(4004515805) },
  { 46254, UINT64_C(1521227949) },
  { 42850, UINT64_C(1408996941) },
  { 92661, UINT64_C(3037901517) },
  { 57720, UINT64_C(1897369989) },
};

static void
test_crypto_ope_vectors(void *arg)
{
  (void)arg;
  uint8_t key[32];
  crypto_ope_t *ope = NULL, *ope2 = NULL;

  base16_decode((char*)key, 32, OPE_TEST_KEY, strlen(OPE_TEST_KEY));

  ope = crypto_ope_new(key);
  key[8] += 1;
  ope2 = crypto_ope_new(key);
  unsigned i;
  for (i = 0; i < ARRAY_LENGTH(OPE_TEST_VECTORS); ++i) {
    int val = OPE_TEST_VECTORS[i].v;
    uint64_t res = OPE_TEST_VECTORS[i].r;

    tt_u64_op(crypto_ope_encrypt(ope, val), OP_EQ, res);
    tt_u64_op(crypto_ope_encrypt(ope2, val), OP_NE, res);
  }
 done:
  crypto_ope_free(ope);
  crypto_ope_free(ope2);
}

struct testcase_t crypto_ope_tests[] = {
  { "consistency", test_crypto_ope_consistency, 0, NULL, NULL },
  { "oob", test_crypto_ope_oob, 0, NULL, NULL },
  { "vectors", test_crypto_ope_vectors, 0, NULL, NULL },
  END_OF_TESTCASES
};