我开始使用 botan 加密库,我遇到了一个奇怪的函数签名:
/**
* Load an encrypted key from a data source.
* @param source the data source providing the encoded key
* @param rng ignored for compatability
* @param get_passphrase a function that returns passphrases
* @return loaded private key object
*/
BOTAN_DLL Private_Key* load_key(DataSource& source,
RandomNumberGenerator& rng,
std::function<std::string ()> get_passphrase);
我想知道为什么要将RandomNumberGenerator
传递给承诺忽略它的函数?
文档说这是为了兼容性,但我无法想象他们在谈论什么类型的兼容性?如果它是向后/向前兼容性,则意味着在过去/未来,该函数已经/将接受随机数生成器来执行确定性操作。
拜托,我在这里缺少什么?
答案 0 :(得分:3)
它看起来是为了向后兼容,不为用户更改API,也可能不破坏应用程序。
让我们开始看看主分支:
https://github.com/randombit/botan/blob/master/src/lib/pubkey/pkcs8.cpp
/*
* Extract an encrypted private key and return it
*/
Private_Key* load_key(DataSource& source,
RandomNumberGenerator& rng,
std::function<std::string ()> get_pass)
{
return load_key(source, rng, get_pass, true);
}
呼叫
/*
* Extract a private key (encrypted/unencrypted) and return it
*/
Private_Key* load_key(DataSource& source,
RandomNumberGenerator& /*rng*/,
std::function<std::string ()> get_pass,
bool is_encrypted)
{
AlgorithmIdentifier alg_id;
secure_vector<uint8_t> pkcs8_key = PKCS8_decode(source, get_pass, alg_id, is_encrypted);
const std::string alg_name = OIDS::lookup(alg_id.oid);
if(alg_name.empty() || alg_name == alg_id.oid.as_string())
throw PKCS8_Exception("Unknown algorithm OID: " +
alg_id.oid.as_string());
return load_private_key(alg_id, pkcs8_key).release();
}
}
完成工作,而工作又不使用rng
现在,让我们看看该库的先前版本。 2.0.0版(https://github.com/randombit/botan/blob/master/src/lib/pubkey/pkcs8.cpp)的情况也是如此
在版本(GitHub中的标签)1.11.33(https://github.com/randombit/botan/blob/1.11.33/src/lib/pubkey/pkcs8.cpp)中,可以看到rng
被使用,它看起来在此版本之后删除了它:
/*
* Extract a private key (encrypted/unencrypted) and return it
*/
Private_Key* load_key(DataSource& source,
RandomNumberGenerator& rng,
std::function<std::string ()> get_pass,
bool is_encrypted)
{
AlgorithmIdentifier alg_id;
secure_vector<byte> pkcs8_key = PKCS8_decode(source, get_pass, alg_id, is_encrypted);
const std::string alg_name = OIDS::lookup(alg_id.oid);
if(alg_name.empty() || alg_name == alg_id.oid.as_string())
throw PKCS8_Exception("Unknown algorithm OID: " +
alg_id.oid.as_string());
return load_private_key(alg_id, pkcs8_key, rng).release();
}
}
in
load_private_key(alg_id, pkcs8_key, rng).release();
似乎在https://github.com/randombit/botan/blob/1.11.33/src/lib/pubkey/pk_algs.cpp中定义,以
开头std::unique_ptr<Private_Key>
load_private_key(const AlgorithmIdentifier& alg_id,
const secure_vector<byte>& key_bits,
RandomNumberGenerator& rng)
{
const std::string alg_name = OIDS::lookup(alg_id.oid);
if(alg_name == "")
throw Decoding_Error("Unknown algorithm OID: " + alg_id.oid.as_string());
#if defined(BOTAN_HAS_RSA)
if(alg_name == "RSA")
return std::unique_ptr<Private_Key>(new RSA_PrivateKey(alg_id, key_bits, rng));
#endif
#if defined(BOTAN_HAS_CURVE_25519)
if(alg_name == "Curve25519")
return std::unique_ptr<Private_Key>(new Curve25519_PrivateKey(alg_id, key_bits, rng));
#endif
现在,如果您将它与主分支或版本2.0.0进行比较,您可以看到rng
已从相同的调用中删除
https://github.com/randombit/botan/blob/master/src/lib/pubkey/pk_algs.cpp
std::unique_ptr<Private_Key>
load_private_key(const AlgorithmIdentifier& alg_id,
const secure_vector<uint8_t>& key_bits)
{
const std::string alg_name = OIDS::lookup(alg_id.oid);
if(alg_name == "")
throw Decoding_Error("Unknown algorithm OID: " + alg_id.oid.as_string());
#if defined(BOTAN_HAS_RSA)
if(alg_name == "RSA")
return std::unique_ptr<Private_Key>(new RSA_PrivateKey(alg_id, key_bits));
#endif
在你使用它的版本中,它们看起来也掉了,你和master中的那个类似:
std::unique_ptr<Private_Key>
load_private_key(const AlgorithmIdentifier& alg_id,
const secure_vector<uint8_t>& key_bits)
{
const std::string alg_name = OIDS::lookup(alg_id.oid);
if(alg_name == "")
throw Decoding_Error("Unknown algorithm OID: " + alg_id.oid.as_string());
#if defined(BOTAN_HAS_RSA)
if(alg_name == "RSA")
return std::unique_ptr<Private_Key>(new RSA_PrivateKey(alg_id, key_bits));
#endif
因此,为用户维护相同的API,他们没有更改签名,但他们更改了实现。