Close #35: Configurable size of serial number.

Allow to configure the previously fixed serial number length
of 64 bit between 8 and 256 bit
This commit is contained in:
Christian Hohnstaedt 2018-05-19 10:31:42 +02:00
parent efd3bff700
commit f0e6dc1f1b
5 changed files with 49 additions and 7 deletions

View File

@ -313,13 +313,17 @@ void db_x509::writeIndex(const QString &fname, bool hierarchy)
}
}
#define SERIAL_LEN 8
static a1int randomSerial()
{
unsigned char buf[SERIAL_LEN];
RAND_bytes(buf, SERIAL_LEN);
unsigned char buf[SHA512_DIGEST_LENGTH];
unsigned char md[SHA512_DIGEST_LENGTH];
Entropy::seed_rng();
RAND_bytes(buf, SHA512_DIGEST_LENGTH);
SHA512(buf, SHA512_DIGEST_LENGTH, md);
a1int serial;
serial.setRaw(buf, SERIAL_LEN);
serial.setRaw(md, (int)Settings["serial_len"] / 8);
return serial;
}
@ -333,8 +337,12 @@ a1int db_x509::getUniqueSerial(pki_x509 *signer)
signer_serial = signer->getSerial();
revList = signer->getRevList();
}
while (true) {
for (int i=0; ; i++) {
if (i > 100)
throw errorEx(tr("Failed to retrieve unique random serial"));
serial = randomSerial();
if (serial == a1int(0L))
continue;
if (!signer)
break;
if (signer_serial == serial)

View File

@ -33,6 +33,7 @@ settings::settings()
defaul["default_hash"] = hashBox::getDefault();
defaul["ical_expiry"] = "1W";
defaul["cert_expiry"] = "80%";
defaul["serial_len"] = "8";
clear();
}

View File

@ -35,12 +35,12 @@ class svalue
}
int operator = (int val)
{
set(QString(val));
set(QString("%1").arg(val));
return val;
}
unsigned operator = (unsigned val)
{
set(QString(val));
set(QString("%1").arg(val));
return val;
}
bool operator = (bool val)

View File

@ -149,6 +149,36 @@ Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification.</
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Serial number length</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="serial_len">
<property name="suffix">
<string> bit</string>
</property>
<property name="minimum">
<number>8</number>
</property>
<property name="maximum">
<number>256</number>
</property>
<property name="singleStep">
<number>8</number>
</property>
<property name="value">
<number>64</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">

View File

@ -65,6 +65,8 @@ Options::Options(MainWindow *parent)
cert_expiry_unit->addItemsData(units, x.right(1));
x.chop(1);
cert_expiry_num->setText(x);
serial_len->setValue(Settings["serial_len"]);
}
Options::~Options()
@ -147,6 +149,7 @@ int Options::exec()
cert_expiry_unit->currentItemData().toString();
Settings["ical_expiry"] = ical_expiry_num->text() +
ical_expiry_unit->currentItemData().toString();
Settings["serial_len"] = serial_len->value();
return TransCommit() ? QDialog::Accepted : QDialog::Rejected;
}