summaryrefslogtreecommitdiffstats
path: root/src/crypto/privkey.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/privkey.c')
-rw-r--r--src/crypto/privkey.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/crypto/privkey.c b/src/crypto/privkey.c
index 7ef04880f..c15edf130 100644
--- a/src/crypto/privkey.c
+++ b/src/crypto/privkey.c
@@ -64,9 +64,12 @@ __asm__ ( ".section \".rodata\", \"a\", " PROGBITS "\n\t"
".previous\n\t" );
/** Private key */
-struct asn1_cursor private_key = {
- .data = private_key_data,
- .len = ( ( size_t ) private_key_len ),
+struct private_key private_key = {
+ .refcnt = REF_INIT ( ref_no_free ),
+ .builder = {
+ .data = private_key_data,
+ .len = ( ( size_t ) private_key_len ),
+ },
};
/** Default private key */
@@ -84,6 +87,19 @@ static struct setting privkey_setting __setting ( SETTING_CRYPTO, privkey ) = {
};
/**
+ * Free private key
+ *
+ * @v refcnt Reference counter
+ */
+void privkey_free ( struct refcnt *refcnt ) {
+ struct private_key *key =
+ container_of ( refcnt, struct private_key, refcnt );
+
+ free ( key->builder.data );
+ free ( key );
+}
+
+/**
* Apply private key configuration settings
*
* @ret rc Return status code
@@ -98,23 +114,24 @@ static int privkey_apply_settings ( void ) {
if ( ALLOW_KEY_OVERRIDE ) {
/* Restore default private key */
- memcpy ( &private_key, &default_private_key,
- sizeof ( private_key ) );
+ memcpy ( &private_key.builder, &default_private_key,
+ sizeof ( private_key.builder ) );
/* Fetch new private key, if any */
free ( key_data );
if ( ( len = fetch_raw_setting_copy ( NULL, &privkey_setting,
&key_data ) ) >= 0 ) {
- private_key.data = key_data;
- private_key.len = len;
+ private_key.builder.data = key_data;
+ private_key.builder.len = len;
}
}
/* Debug */
- if ( private_key.len ) {
+ if ( private_key.builder.len ) {
DBGC ( &private_key, "PRIVKEY using %s private key:\n",
( key_data ? "external" : "built-in" ) );
- DBGC_HDA ( &private_key, 0, private_key.data, private_key.len );
+ DBGC_HDA ( &private_key, 0, private_key.builder.data,
+ private_key.builder.len );
} else {
DBGC ( &private_key, "PRIVKEY has no private key\n" );
}