[Bug 1599550] Fix included in openstack/barbican 3.0.0.0b3
OpenStack Infra
1599550 at bugs.launchpad.net
Wed Aug 31 23:08:01 UTC 2016
This issue was fixed in the openstack/barbican 3.0.0.0b3 development
milestone.
--
You received this bug notification because you are a member of Ubuntu
OpenStack, which is subscribed to barbican in Ubuntu.
https://bugs.launchpad.net/bugs/1599550
Title:
barbican + softhsm2 + libssl1.0.0: pkcs11:_generate_random() fails
Status in Barbican:
Fix Released
Status in barbican package in Ubuntu:
New
Bug description:
barbican + softhsm2 + libssl1.0.0 — P11CryptoPluginException: HSM
returned response code: 0x5L CKR_GENERAL_ERROR - possible random_seed
not initialised?
Background:
barbican 2.0.0 (from xenial 16.04 packages)
softhsm2 2.0.0 (from xenial 16.04 packages)
libssl1.0.0 (also from xenial 16.04 packages)
When attempting to do:
secret = barbican.secrets.create(name='Self destruction sequence',
payload='the magic words are squeamish ossifrage’,
payload_content_type='text/plain')
secret.store()
The ‘secret.store()’ blows up with a:
"barbicanclient.exceptions.HTTPServerError: Internal Server Error"
Digging into the barbican-api.log reveals the following log (cleaned
up a little):
Problem seen creating plugin: 'p11_crypto'
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-package.py", line 42, in instantiate_plugins
plugin_instance = ext.plugin(*invoke_args, **invoke_kwargs)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/p11_crypto.py", line 87, in __init__
self.pkcs11 = pkcs11 or self._create_pkcs11(plugin_conf, ffi)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/p11_crypto.py", line 237, in _create_pkcs11
algorithm=plugin_conf.algorithm
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/pkcs11.py", line 356, in __init__
self._rng_self_test(session)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/pkcs11.py", line 636, in _rng_self_test
test_random = self.generate_random(100, session)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/pkcs11.py", line 373, in generate_random
buf = self._generate_random(length, session)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/pkcs11.py", line 581, in _generate_random
self._check_error(rv)
File "/usr/lib/python2.7/dist-packages/barbican/plugin/crypto/pkcs11.py", line 576, in _check_error
code=ERROR_CODES.get(value, 'CKR_????')))
P11CryptoPluginException: HSM returned response code: 0x5L CKR_GENERAL_ERROR
What I think may be wrong:
This is just based on me looking at the code, but I’m wondering if it
isn’t a feature of the new libssl library (>= 0.9.5) which bails out
if the random number generator isn’t seeded: (from
https://www.openssl.org/docs/faq.html#USER1):
“On other systems, applications have to call the RAND_add() or
RAND_seed() function with appropriate data before generating keys or
performing public key encryption. (These functions initialize the
pseudo-random number generator, PRNG.) Some broken applications do not
do this. As of version 0.9.5, the OpenSSL functions that need
randomness report an error if the random number generator has not been
seeded with at least 128 bits of randomness. If this error occurs and
is not discussed in the documentation of the application you are
using, please contact the author of that application; it is likely
that it never worked correctly. OpenSSL 0.9.5 and later make the error
visible by refusing to perform potentially insecure encryption."
Digging through the code:
In SoftHSMv2/src/lib/SoftHSM.cpp:
(https://github.com/opendnssec/SoftHSMv2/blob/04df677ce750d3486867b4f853c9648696c0db1c/src/lib/SoftHSM.cpp#L6283)
// Get the RNG
RNG* rng = CryptoFactory::i()->getRNG();
if (rng == NULL) return CKR_GENERAL_ERROR;
Seems to be the most likely culprit, and digging further (with the
Openssl library part):
In SoftHSMv2/src/lib/crypto/OSSLRNG.cpp
(https://github.com/opendnssec/SoftHSMv2/blob/a4799c41cdcdd31d503d8f4eba9003b8e5571d73/src/lib/crypto/OSSLRNG.cpp#L38):
bool OSSLRNG::generateRandom(ByteString& data, const size_t len)
{
data.wipe(len);
if (len == 0)
return true;
return RAND_bytes(&data[0], len) == 1;
}
Reading the doc above, it would appear that RAND_bytes(..) returns 0
if there isn’t sufficient entropy for versions of OpenSSL >= 0.9.5
I can also confirm that Softhsm2 has a seed function:
CK_RV SoftHSM::C_SeedRandom(CK_SESSION_HANDLE hSession, CK_BYTE_PTR
pSeed, CK_ULONG ulSeedLen)
and that it’s not called from Barbican
(https://github.com/openstack/barbican/search?utf8=%E2%9C%93&q=C_SeedRandom).
I’m not sure where the relevant call to C_SeedRandom() would need to
be in Barbican, plus where the seed file should come from.
To manage notifications about this bug go to:
https://bugs.launchpad.net/barbican/+bug/1599550/+subscriptions
More information about the Ubuntu-openstack-bugs
mailing list