diff --git a/lib/db_x509.cpp b/lib/db_x509.cpp index 3160c450..3e6c4b43 100644 --- a/lib/db_x509.cpp +++ b/lib/db_x509.cpp @@ -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) diff --git a/lib/settings.cpp b/lib/settings.cpp index 699ae14c..d8122088 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -33,6 +33,7 @@ settings::settings() defaul["default_hash"] = hashBox::getDefault(); defaul["ical_expiry"] = "1W"; defaul["cert_expiry"] = "80%"; + defaul["serial_len"] = "8"; clear(); } diff --git a/lib/settings.h b/lib/settings.h index 8e6cd2cb..199b0be8 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -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) diff --git a/ui/Options.ui b/ui/Options.ui index 39da6b3c..a08e91b2 100644 --- a/ui/Options.ui +++ b/ui/Options.ui @@ -149,6 +149,36 @@ Especially EC and DSA are only defined with SHA1 in the PKCS#11 specification. + + + + + + Serial number length + + + + + + + bit + + + 8 + + + 256 + + + 8 + + + 64 + + + + + diff --git a/widgets/Options.cpp b/widgets/Options.cpp index 0ec0bdbf..a289bbd3 100644 --- a/widgets/Options.cpp +++ b/widgets/Options.cpp @@ -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; }