summaryrefslogtreecommitdiffstats
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2015-02-16 11:26:37 +1300
committerAndrew Bartlett <abartlet@samba.org>2015-02-25 01:08:12 +0100
commit927ea9791e3d1a91516b1cec6918772da83a7fbb (patch)
tree4cf76ef93a83fd2960f8805801d534f188967fc0 /source4
parent63609eba997d027e7545fe355aa5b26bfc307190 (diff)
downloadsamba-927ea9791e3d1a91516b1cec6918772da83a7fbb.tar.gz
samba-927ea9791e3d1a91516b1cec6918772da83a7fbb.tar.xz
samba-927ea9791e3d1a91516b1cec6918772da83a7fbb.zip
backupkey: Explain more why we use GnuTLS here
Pair-programmed-with: Garming Sam <garming@catalyst.net.nz> Signed-off-by: Garming Sam <garming@catalyst.net.nz> Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'source4')
-rw-r--r--source4/rpc_server/backupkey/dcesrv_backupkey.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/source4/rpc_server/backupkey/dcesrv_backupkey.c b/source4/rpc_server/backupkey/dcesrv_backupkey.c
index ae4c871d9d..bef4c93d10 100644
--- a/source4/rpc_server/backupkey/dcesrv_backupkey.c
+++ b/source4/rpc_server/backupkey/dcesrv_backupkey.c
@@ -816,6 +816,13 @@ static WERROR create_heimdal_rsa_key(TALLOC_CTX *ctx, hx509_context *hctx,
return WERR_INTERNAL_ERROR;
}
+ /*
+ * Unlike Heimdal's RSA_generate_key_ex(), this generates a
+ * 2048 bit key 100% of the time. The heimdal code had a ~1/8
+ * chance of doing so, chewing vast quantities of computation
+ * and entropy in the process.
+ */
+
ret = gnutls_x509_privkey_generate(gtls_key, GNUTLS_PK_RSA, bits, 0);
if (ret != 0) {
werr = WERR_INTERNAL_ERROR;
@@ -837,6 +844,19 @@ static WERROR create_heimdal_rsa_key(TALLOC_CTX *ctx, hx509_context *hctx,
}
p = p0;
+ /*
+ * Only this GnuTLS export function correctly exports the key,
+ * we can't use gnutls_rsa_params_export_raw() because while
+ * it appears to be fixed in more recent versions, in the
+ * Ubuntu 14.04 version 2.12.23 (at least) it incorrectly
+ * exports one of the key parameters (qInv). Additionally, we
+ * would have to work around subtle differences in big number
+ * representations.
+ *
+ * We need access to the RSA parameters directly (in the
+ * parameter RSA **rsa) as the caller has to manually encode
+ * them in a non-standard data structure.
+ */
ret = gnutls_x509_privkey_export(gtls_key, GNUTLS_X509_FMT_DER, p0, &len);
if (ret != 0) {