return fd;
}
+static struct bt_crypto *singleton;
+
struct bt_crypto *bt_crypto_new(void)
{
- struct bt_crypto *crypto;
+ if (singleton)
+ return bt_crypto_ref(singleton);
- crypto = new0(struct bt_crypto, 1);
+ singleton = new0(struct bt_crypto, 1);
- crypto->ecb_aes = ecb_aes_setup();
- if (crypto->ecb_aes < 0) {
- free(crypto);
+ singleton->ecb_aes = ecb_aes_setup();
+ if (singleton->ecb_aes < 0) {
+ free(singleton);
+ singleton = NULL;
return NULL;
}
- crypto->urandom = urandom_setup();
- if (crypto->urandom < 0) {
- close(crypto->ecb_aes);
- free(crypto);
+ singleton->urandom = urandom_setup();
+ if (singleton->urandom < 0) {
+ close(singleton->ecb_aes);
+ free(singleton);
+ singleton = NULL;
return NULL;
}
- crypto->cmac_aes = cmac_aes_setup();
- if (crypto->cmac_aes < 0) {
- close(crypto->urandom);
- close(crypto->ecb_aes);
- free(crypto);
+ singleton->cmac_aes = cmac_aes_setup();
+ if (singleton->cmac_aes < 0) {
+ close(singleton->urandom);
+ close(singleton->ecb_aes);
+ free(singleton);
+ singleton = NULL;
return NULL;
}
- return bt_crypto_ref(crypto);
+ return bt_crypto_ref(singleton);
}
struct bt_crypto *bt_crypto_ref(struct bt_crypto *crypto)
close(crypto->cmac_aes);
free(crypto);
+ singleton = NULL;
}
bool bt_crypto_random_bytes(struct bt_crypto *crypto,