OpenVPN 3 Core Library
Loading...
Searching...
No Matches
test_session_id.cpp
Go to the documentation of this file.
1#include "test_common.hpp"
2
5#include <unordered_map>
7
8using namespace openvpn;
9
10TEST(sessid, test1)
11{
12 SSLLib::RandomAPI rng;
13
14 // test 1
15 {
16 const SessionID64 sid1(rng);
17 // std::cout << "SID1: " << sid1 << std::endl;
18
19 const SessionID64 sid2(sid1.to_string());
20 ASSERT_TRUE(sid1.defined() && sid2.defined()) << "FAIL sid1 or sid2 is undefined";
21 ASSERT_EQ(sid1, sid2);
22
23 const SessionID128 sid3(rng);
24 ASSERT_FALSE(sid1.eq_weak(sid3)) << "FAIL sid1 ~== sid3";
25 ASSERT_FALSE(sid3.eq_weak(sid1)) << "FAIL sid3 ~== sid1";
26
27 for (int i = 1; i <= 4; ++i)
28 {
29 // std::cout << "---- " << i << " ----" << std::endl;
30 const TokenEncrypt::Key key(rng);
31 TokenEncryptDecrypt ted(key);
32 const SessionID128 sid3_enc(sid3, ted.encrypt);
33 // std::cout << "SID3 (enc): " << sid3_enc << std::endl;
34 const SessionID128 sid3_dec(sid3_enc, ted.decrypt);
35 // std::cout << "SID3 (dec): " << sid3_dec << std::endl;
36 }
37 }
38}
39TEST(sessid, test2)
40{
41 SSLLib::RandomAPI rng;
42 {
43 const SessionID64 sid1(rng);
44 // std::cout << "SID1: " << sid1 << std::endl;
45 const SessionID128 sid2(rng);
46 // std::cout << "SID2: " << sid2 << std::endl;
47
48 const SessionID128 sid1_exp(sid1);
49 // std::cout << "SID1_EXP: " << sid1_exp << std::endl;
50 const SessionID64 sid2_trunc(sid2);
51 // std::cout << "SID2_TRUNC: " << sid2_trunc << std::endl;
52 }
53}
54
55TEST(sessid, test3)
56{
57 const SessionID64 ns;
58 ASSERT_FALSE(ns.defined()) << "FAIL default constructed SessionID is defined";
59}
60
61TEST(sessid, test4)
62{
63 SSLLib::RandomAPI rng;
64 const SessionID128 x;
65 const SessionID128 a("YmtN7B2edrDRlefk3vQ_YQ..");
66 const SessionID128 b("YmtN7B2edrDRlefk3vQ_YA..");
67 const SessionID64 c("YmtN7B2edrA.");
68 const SessionID128 d(c);
69 /*std::cout << "a: " << a <<
70 std::endl;
71 std::cout << "b: " << b <<
72 std::endl;
73 std::cout << "c: " << c <<
74 std::endl;
75 std::cout << "d: " << d <<
76 std::endl; */
77 ASSERT_FALSE(a == b) << "test4: wrong, not equal";
78 ASSERT_TRUE(a.eq_weak(b)) << "test4/1: wrong, weakly equal";
79 ASSERT_TRUE(a.eq_weak(c)) << "test4/2: wrong, weakly equal";
80 ASSERT_TRUE(b.eq_weak(c)) << "test4/3: wrong, weakly equal";
81
82 std::unordered_map<SessionID128, std::string> map;
83 const std::unordered_map<SessionID128, std::string> &cmap = map;
84 map[a] = "hello";
85 ASSERT_TRUE(b.find_weak(map, true)) << "test4/1: wrong, weak exists";
86 ASSERT_TRUE(d.find_weak(map, true)) << "test4/2: wrong, weak exists";
87 ASSERT_FALSE(a.find_weak(map, true)) << "test4/3: wrong, weak doesn't exist";
88 ASSERT_TRUE(a.find_weak(map, false)) << "test4/4: wrong, weak exists";
89 ASSERT_FALSE(x.find_weak(map, true)) << "test4: wrong, weak doesn't exist";
90 const SessionID128 *s1 = d.find_weak(cmap, true);
91 ASSERT_TRUE(s1) << "test4: can't find s1";
92 // std::cout << "lookup: " << *s1 << ' ' <<
93 // std::endl;
94 const SessionID128 *s2 = x.find_weak(cmap, true);
95 ASSERT_FALSE(s2) << "test4: shouldn't have found s2";
96}
97
98TEST(sessid, speed)
99{
100 SSLLib::RandomAPI rng;
101
102 const SessionID128 sid(rng);
103 const TokenEncrypt::Key key(rng);
104 TokenEncryptDecrypt ted(key);
105 for (size_t i = 0; i < 1000; ++i)
106 {
107 const SessionID128 sid_enc(sid, ted.encrypt);
108 const SessionID128 sid_dec(sid_enc, ted.decrypt);
109 ASSERT_EQ(sid, sid_dec);
110 }
111}
112
113struct SessionID : public SessionID128
114{
116 {
117 // dump("default");
118 }
119
121 : SessionID128(rng)
122 {
123 // dump("rng");
124 }
125
127 {
128 // dump("destruct");
129 }
130
131 void dump(const char *prefix) const
132 {
133 std::cout << prefix << " : " << to_string() << std::endl;
134 }
135};
136
138{
139 public:
141 : sid(rng)
142 {
143 }
144
145 const SessionID &get_token() const
146 {
147 return sid;
148 }
149
150 private:
152};
153
154std::string test(Session *session)
155{
156 const std::string &nam = "myname";
157 const SessionID &sid = session ? session->get_token() : SessionID();
158 return "Name: " + nam + " SessID: " + sid.to_string();
159}
160
161TEST(sessid, refscope1)
162{
163 FakeSecureRand fake_rng(0x42);
164 Session sess(fake_rng);
165 EXPECT_EQ("Name: myname SessID: QkNERUZHSElKS0xNTk9QUQ..", test(&sess));
166 EXPECT_EQ("Name: myname SessID: AAAAAAAAAAAAAAAAAAAAAA..", test(nullptr));
167}
168
169#ifndef ITER
170#define ITER 1000
171#endif
172
173static void tryit(RandomAPI &rng, TokenEncryptDecrypt &encdec)
174{
175 std::uint8_t data1[TokenEncrypt::Key::SIZE];
176 std::uint8_t data2[TokenEncrypt::Key::SIZE];
177 std::uint8_t data3[TokenEncrypt::Key::SIZE];
178
179 rng.rand_bytes(data1, sizeof(data1));
180 encdec.encrypt(data2, data1, TokenEncrypt::Key::SIZE);
181 encdec.decrypt(data3, data2, TokenEncrypt::Key::SIZE);
182 ASSERT_TRUE(::memcmp(data1, data3, TokenEncrypt::Key::SIZE) == 0);
183}
184
185TEST(sessid, tokenEncrypt)
186{
187 StrongRandomAPI::Ptr rng(new SSLLib::RandomAPI());
188 const TokenEncrypt::Key key(*rng);
189 TokenEncryptDecrypt encdec(key);
190
191 for (size_t i = 0; i < ITER; ++i)
192 tryit(*rng, encdec);
193}
const SessionID & get_token() const
Session(StrongRandomAPI &rng)
SessionID sid
Abstract base class for random number generators.
Definition randapi.hpp:39
virtual void rand_bytes(unsigned char *buf, size_t size)=0
Fill a buffer with random bytes.
std::string to_string() const
Definition sess_id.hpp:115
bool defined() const
Definition sess_id.hpp:94
bool eq_weak(const SessionIDType< S > &other) const
Definition sess_id.hpp:137
const SessionIDType * find_weak(const UNORDERED_MAP &m, const bool conflict) const
Definition sess_id.hpp:163
Abstract base class for cryptographically strong random number generators.
Definition randapi.hpp:228
static constexpr size_t SIZE
SessionID(StrongRandomAPI &rng)
void dump(const char *prefix) const
void test()
Definition test_rc.cpp:80
TEST(sessid, test1)
#define ITER
static void tryit(RandomAPI &rng, TokenEncryptDecrypt &encdec)