File: renewal.cpp

package info (click to toggle)
xca 2.9.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,328 kB
  • sloc: cpp: 30,584; sh: 341; xml: 74; makefile: 56; python: 34
file content (156 lines) | stat: -rw-r--r-- 3,834 bytes parent folder | download | duplicates (2)
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
155
156
/* vi: set sw=4 ts=4:
 *
 * Copyright (C) 2024 Christian Hohnstaedt.
 *
 * All rights reserved.
 */

#include <QTest>
#include <QThread>
#include <QDialog>
#include <QCheckBox>

#include "widgets/MainWindow.h"
#include "ui_MainWindow.h"
#include "widgets/ImportMulti.h"
#include "ui_ImportMulti.h"
#include "widgets/CertExtend.h"
#include "ui_CertExtend.h"
#include "widgets/RevocationList.h"
#include "ui_RevocationList.h"
#include "ui_Revoke.h"

#include "lib/pki_multi.h"

#include "main.h"

#define ZERO_SECS "yyyyMMddHHmm'00Z'"
a1time not_after = a1time::now(3*356*24*60*60);

void revoke_and_renew()
{
	CertExtend *dlg = test_main::findWindow<CertExtend>("CertExtend");
	if (!dlg)
		return;
	dlg->replace->setCheckState(Qt::Checked);
	dlg->revoke->setCheckState(Qt::Checked);
	dlg->notAfter->setDate(not_after);
	dlg->buttonBox->button(QDialogButtonBox::Ok)->click();
	Revocation *rev = test_main::findWindow<Revocation>("Revoke");
	rev->buttonBox->button(QDialogButtonBox::Ok)->click();
}

void renew()
{
	CertExtend *dlg = test_main::findWindow<CertExtend>("CertExtend");
	if (!dlg)
		return;
	dlg->validNumber->setText("1");
	dlg->validRange->setCurrentIndex(1);
	dlg->applyTime->click();
	not_after = dlg->notAfter->getDate();
	dlg->replace->setCheckState(Qt::Unchecked);
	dlg->revoke->setCheckState(Qt::Unchecked);
	dlg->buttonBox->button(QDialogButtonBox::Ok)->click();
}

void renew_del_keep_serial()
{
	CertExtend *dlg = test_main::findWindow<CertExtend>("CertExtend");
	if (!dlg)
		return;
	dlg->replace->setCheckState(Qt::Checked);
	dlg->revoke->setCheckState(Qt::Unchecked);
	dlg->noWellDefinedExpDate->setCheckState(Qt::Checked);
	dlg->keepSerial->setCheckState(Qt::Checked);
	dlg->buttonBox->button(QDialogButtonBox::Ok)->click();
}

QList<pki_x509*> getcerts(const QString &name)
{
	QList<pki_x509*> l;
	foreach(pki_x509 *pki, Store.getAll<pki_x509>()) {
        if (pki->getIntName() == name)
			l << pki;
	}
	return l;
}

void test_main::revoke()
{
	try {

	ign_openssl_error();
	openDB();
	dbstatus();
	pki_multi *pem = new pki_multi();
	pem->fromPEMbyteArray(pemdata["Inter CA 1"].toUtf8(), QString());
	pem->fromPEMbyteArray(pemdata["Root CA"].toUtf8(), QString());
	pem->fromPEMbyteArray(pemdata["Root CA Key"].toUtf8(), QString());
	Database.insert(pem);
	dbstatus();

	QThread *job;
	QList<pki_x509*> l;
	db_x509 *certs = Database.model<db_x509>();
	pki_x509 *cert;
	a1int serial;

	// Revoke and renew
	cert = dynamic_cast<pki_x509*>(certs->getByName("Inter CA 1"));
	serial = cert->getSerial();
	job = QThread::create(revoke_and_renew);
	job->start();
	certs->certRenewal({ certs->index(cert) });
	job->wait();

	delete job;
	dbstatus();
	l = getcerts("Inter CA 1");
	QCOMPARE(1, l.size());

	bool found = false;
	x509revList revs = dynamic_cast<pki_x509*>(certs->getByName("Root CA"))->getRevList();
	for (x509rev r : revs) {
		if (r.getSerial() == serial)
			found = true;
	}
	QVERIFY2(found, "Revoked serial not found");

	// renew
	job = QThread::create(renew);
	job->start();
	certs->certRenewal({ certs->index(certs->getByName("Inter CA 1")) });
	job->wait();

	delete job;
	dbstatus();
	l = getcerts("Inter CA 1");
	QCOMPARE(2, l.size());
	// Delete one of the certs
	if (l.size() > 0)
		certs->deletePKI(certs->index(l[0]));
	l = getcerts("Inter CA 1");
	QCOMPARE(1, l.size());

	// renew, keep serial
	cert = dynamic_cast<pki_x509*>(certs->getByName("Inter CA 1"));
	serial = cert->getSerial();

	job = QThread::create(renew_del_keep_serial);
	job->start();
	certs->certRenewal({ certs->index(certs->getByName("Inter CA 1")) });
	job->wait();

	delete job;
	dbstatus();
	l = getcerts("Inter CA 1");
	QCOMPARE(1, l.size());
	not_after.setUndefined();
	if (l.size() > 0)
		QCOMPARE(l[0]->getNotAfter().toPlain(), not_after.toPlain());

	} catch (...) {
		QVERIFY2(false, "Exception thrown");
	}
}