1 /*!
2  * \brief Unit tests for \ref PACEInfo
3  *
4  * \copyright Copyright (c) 2014-2021 Governikus GmbH & Co. KG, Germany
5  */
6 
7 #include <QtCore>
8 #include <QtTest>
9 
10 #include "asn1/KnownOIDs.h"
11 #include "asn1/PaceInfo.h"
12 
13 
14 using namespace governikus;
15 
16 class test_PaceInfo
17 	: public QObject
18 {
19 	Q_OBJECT
20 
21 	private Q_SLOTS:
parseCrap()22 		void parseCrap()
23 		{
24 			QVERIFY(PaceInfo::decode("3003020101") == nullptr);
25 		}
26 
27 
parseChipAuthenticationInfo()28 		void parseChipAuthenticationInfo()
29 		{
30 			QByteArray bytes = QByteArray::fromHex("30 12"
31 												   "            06 0A 04007F00070202030202"
32 												   "            02 01 02"
33 												   "            02 01 08");
34 
35 			QVERIFY(PaceInfo::decode(bytes) == nullptr);
36 		}
37 
38 
parsePaceInfoWithWrongContent()39 		void parsePaceInfoWithWrongContent()
40 		{
41 			QByteArray bytes = QByteArray::fromHex("30 12"
42 												   "            06 0A 04007F00070202040202"
43 												   "            04 01 02"
44 												   "            04 01 08");
45 
46 			auto paceInfo = PaceInfo::decode(bytes);
47 
48 			QVERIFY(paceInfo == nullptr);
49 		}
50 
51 
missingOid()52 		void missingOid()
53 		{
54 			QByteArray bytes = QByteArray::fromHex("30 06"
55 												   "            02 01 02"
56 												   "            02 01 08");
57 
58 			QVERIFY(PaceInfo::decode(bytes) == nullptr);
59 		}
60 
61 
missingVersion()62 		void missingVersion()
63 		{
64 			QByteArray bytes = QByteArray::fromHex("30 0C"
65 												   "            06 0A 04007F00070202040202");
66 
67 			QVERIFY(PaceInfo::decode(bytes) == nullptr);
68 		}
69 
70 
withoutOptionalParameter()71 		void withoutOptionalParameter()
72 		{
73 			QByteArray bytes = QByteArray::fromHex("30 0F"
74 												   "            06 0A 04007F00070202040202"
75 												   "            02 01 02");
76 
77 			auto paceInfo = PaceInfo::decode(bytes);
78 
79 			QVERIFY(paceInfo != nullptr);
80 			QCOMPARE(paceInfo->getParameterIdAsInt(), -1);
81 		}
82 
83 
getParameterId()84 		void getParameterId()
85 		{
86 			QByteArray bytes = QByteArray::fromHex("30 12"
87 												   "            06 0A 04007F00070202040202"
88 												   "            02 01 02"
89 												   "            02 01 08");
90 
91 			auto paceInfo = PaceInfo::decode(bytes);
92 
93 			QVERIFY(paceInfo != nullptr);
94 			QCOMPARE(paceInfo->getParameterId(), QByteArray::fromHex("08"));
95 			QCOMPARE(paceInfo->getParameterIdAsInt(), 8);
96 		}
97 
98 
getVersion()99 		void getVersion()
100 		{
101 			QByteArray bytes;
102 			QSharedPointer<PaceInfo> paceInfo;
103 
104 			bytes = QByteArray::fromHex("30 12"
105 										"            06 0A 04007F00070202040202"
106 										"            02 01 01"
107 										"            02 01 08");
108 
109 			paceInfo = PaceInfo::decode(bytes);
110 
111 			QVERIFY(paceInfo != nullptr);
112 			QCOMPARE(paceInfo->getVersion(), 1);
113 
114 			bytes = QByteArray::fromHex("30 12"
115 										"            06 0A 04007F00070202040202"
116 										"            02 01 02"
117 										"            02 01 08");
118 
119 			paceInfo = PaceInfo::decode(bytes);
120 
121 			QVERIFY(paceInfo != nullptr);
122 			QCOMPARE(paceInfo->getVersion(), 2);
123 		}
124 
125 
getEnumString()126 		void getEnumString()
127 		{
128 			QCOMPARE(getEnumName(KeyAgreementType::DH), QStringLiteral("DH"));
129 			QCOMPARE(getEnumName(MappingType::IM), QStringLiteral("IM"));
130 		}
131 
132 
getKeyAgreementType()133 		void getKeyAgreementType()
134 		{
135 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040101 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
136 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040102 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
137 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040103 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
138 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040104 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
139 
140 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040201 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
141 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040202 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
142 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040203 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
143 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040204 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
144 
145 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040301 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
146 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040302 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
147 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040303 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
148 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040304 020102"))->getKeyAgreementType(), KeyAgreementType::DH);
149 
150 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040401 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
151 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040402 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
152 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040403 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
153 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040404 020102"))->getKeyAgreementType(), KeyAgreementType::ECDH);
154 		}
155 
156 
getMappingType()157 		void getMappingType()
158 		{
159 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040101 020102"))->getMappingType(), MappingType::GM);
160 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040102 020102"))->getMappingType(), MappingType::GM);
161 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040103 020102"))->getMappingType(), MappingType::GM);
162 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040104 020102"))->getMappingType(), MappingType::GM);
163 
164 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040201 020102"))->getMappingType(), MappingType::GM);
165 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040202 020102"))->getMappingType(), MappingType::GM);
166 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040203 020102"))->getMappingType(), MappingType::GM);
167 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040204 020102"))->getMappingType(), MappingType::GM);
168 
169 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040301 020102"))->getMappingType(), MappingType::IM);
170 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040302 020102"))->getMappingType(), MappingType::IM);
171 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040303 020102"))->getMappingType(), MappingType::IM);
172 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040304 020102"))->getMappingType(), MappingType::IM);
173 
174 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040401 020102"))->getMappingType(), MappingType::IM);
175 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040402 020102"))->getMappingType(), MappingType::IM);
176 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040403 020102"))->getMappingType(), MappingType::IM);
177 			QCOMPARE(PaceInfo::decode(QByteArray::fromHex("300F 060A04007F00070202040404 020102"))->getMappingType(), MappingType::IM);
178 		}
179 
180 
isStandardizedECDH_GM()181 		void isStandardizedECDH_GM()
182 		{
183 			// version = 2, parameterId = 8
184 			QByteArray bytes = QByteArray::fromHex("30 12"
185 												   "            06 0A 04007F00070202040202"
186 												   "            02 01 02"
187 												   "            02 01 08");
188 
189 			auto paceInfo = PaceInfo::decode(bytes);
190 
191 			QVERIFY(paceInfo != nullptr);
192 			QVERIFY(paceInfo->isStandardizedDomainParameters());
193 		}
194 
195 
isNotStandardizedECDH_GM()196 		void isNotStandardizedECDH_GM()
197 		{
198 			// version = 2, parameterId = 7
199 			QByteArray bytes = QByteArray::fromHex("30 12"
200 												   "            06 0A 04007F00070202040202"
201 												   "            02 01 02"
202 												   "            02 01 07");
203 
204 			auto paceInfo = PaceInfo::decode(bytes);
205 
206 			QVERIFY(paceInfo != nullptr);
207 			QVERIFY(!paceInfo->isStandardizedDomainParameters());
208 		}
209 
210 
isStandardizedECDH_IM()211 		void isStandardizedECDH_IM()
212 		{
213 			// version = 2, parameterId = 8
214 			QByteArray bytes = QByteArray::fromHex("30 12"
215 												   "            06 0A 04007F00070202040402"
216 												   "            02 01 02"
217 												   "            02 01 08");
218 
219 			auto paceInfo = PaceInfo::decode(bytes);
220 
221 			QVERIFY(paceInfo != nullptr);
222 			QVERIFY(paceInfo->isStandardizedDomainParameters());
223 		}
224 
225 
isNotStandardizedECDH_IM()226 		void isNotStandardizedECDH_IM()
227 		{
228 			// version = 2, parameterId = 10
229 			QByteArray bytes = QByteArray::fromHex("30 12"
230 												   "            06 0A 04007F00070202040402"
231 												   "            02 01 02"
232 												   "            02 01 0A");
233 
234 			auto paceInfo = PaceInfo::decode(bytes);
235 
236 			QVERIFY(paceInfo != nullptr);
237 			QVERIFY(!paceInfo->isStandardizedDomainParameters());
238 		}
239 
240 
isStandardizedDH_GM()241 		void isStandardizedDH_GM()
242 		{
243 			// version = 2, parameterId = 0
244 			QByteArray bytes = QByteArray::fromHex("30 12"
245 												   "            06 0A 04007F00070202040102"
246 												   "            02 01 02"
247 												   "            02 01 00");
248 
249 			auto paceInfo = PaceInfo::decode(bytes);
250 
251 			QVERIFY(paceInfo != nullptr);
252 			QVERIFY(paceInfo->isStandardizedDomainParameters());
253 		}
254 
255 
isNotStandardizedDH_GM()256 		void isNotStandardizedDH_GM()
257 		{
258 			// version = 2, parameterId = 7
259 			QByteArray bytes = QByteArray::fromHex("30 12"
260 												   "            06 0A 04007F00070202040102"
261 												   "            02 01 02"
262 												   "            02 01 07");
263 
264 			auto paceInfo = PaceInfo::decode(bytes);
265 
266 			QVERIFY(paceInfo != nullptr);
267 			QVERIFY(!paceInfo->isStandardizedDomainParameters());
268 		}
269 
270 
isStandardizedDH_IM()271 		void isStandardizedDH_IM()
272 		{
273 			// version = 2, parameterId = 0
274 			QByteArray bytes = QByteArray::fromHex("30 12"
275 												   "            06 0A 04007F00070202040302"
276 												   "            02 01 02"
277 												   "            02 01 00");
278 
279 			auto paceInfo = PaceInfo::decode(bytes);
280 
281 			QVERIFY(paceInfo != nullptr);
282 			QVERIFY(paceInfo->isStandardizedDomainParameters());
283 		}
284 
285 
isNotStandardizedDH_IM()286 		void isNotStandardizedDH_IM()
287 		{
288 			// version = 2, parameterId = 8
289 			QByteArray bytes = QByteArray::fromHex("30 12"
290 												   "            06 0A 04007F00070202040302"
291 												   "            02 01 02"
292 												   "            02 01 08");
293 
294 			auto paceInfo = PaceInfo::decode(bytes);
295 
296 			QVERIFY(paceInfo != nullptr);
297 			QVERIFY(!paceInfo->isStandardizedDomainParameters());
298 		}
299 
300 
301 };
302 
303 QTEST_GUILESS_MAIN(test_PaceInfo)
304 #include "test_PaceInfo.moc"
305