diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/credentials/builder.c | 1 | ||||
-rw-r--r-- | src/libstrongswan/credentials/builder.h | 2 | ||||
-rw-r--r-- | src/libstrongswan/credentials/credential_factory.c | 2 | ||||
-rw-r--r-- | src/libstrongswan/plugins/pubkey/pubkey_public_key.c | 20 |
4 files changed, 23 insertions, 2 deletions
diff --git a/src/libstrongswan/credentials/builder.c b/src/libstrongswan/credentials/builder.c index 6a03cbd54..c13a8a860 100644 --- a/src/libstrongswan/credentials/builder.c +++ b/src/libstrongswan/credentials/builder.c @@ -18,6 +18,7 @@ ENUM(builder_part_names, BUILD_BLOB_ASN1_DER, BUILD_END, "BUILD_FROM_FILE", "BUILD_BLOB_ASN1_DER", + "BUILD_BLOB_ASN1_PEM", "BUILD_KEY_SIZE", "BUILD_SIGNING_KEY", "BUILD_SIGNING_CERT", diff --git a/src/libstrongswan/credentials/builder.h b/src/libstrongswan/credentials/builder.h index 54aca33da..22c106b7a 100644 --- a/src/libstrongswan/credentials/builder.h +++ b/src/libstrongswan/credentials/builder.h @@ -42,6 +42,8 @@ enum builder_part_t { BUILD_FROM_FILE, /** DER encoded ASN1 blob, chunk_t */ BUILD_BLOB_ASN1_DER, + /** PEM encoded ASN1 blob, null terminated char* */ + BUILD_BLOB_ASN1_PEM, /** key size in bits, as used for key generation, u_int */ BUILD_KEY_SIZE, /** private key to use for signing, private_key_t* */ diff --git a/src/libstrongswan/credentials/credential_factory.c b/src/libstrongswan/credentials/credential_factory.c index de4c2fb43..951ddb58a 100644 --- a/src/libstrongswan/credentials/credential_factory.c +++ b/src/libstrongswan/credentials/credential_factory.c @@ -165,6 +165,7 @@ static void* create(private_credential_factory_t *this, credential_type_t type, case BUILD_NOT_AFTER_TIME: builder->add(builder, part, va_arg(args, time_t)); continue; + case BUILD_BLOB_ASN1_PEM: case BUILD_FROM_FILE: case BUILD_SIGNING_KEY: case BUILD_PUBLIC_KEY: @@ -261,6 +262,7 @@ static void* create(private_credential_factory_t *this, credential_type_t type, cert->destroy(cert); continue; } + case BUILD_BLOB_ASN1_PEM: case BUILD_FROM_FILE: case BUILD_IETF_GROUP_ATTR: { diff --git a/src/libstrongswan/plugins/pubkey/pubkey_public_key.c b/src/libstrongswan/plugins/pubkey/pubkey_public_key.c index 1291b6ede..5a072c482 100644 --- a/src/libstrongswan/plugins/pubkey/pubkey_public_key.c +++ b/src/libstrongswan/plugins/pubkey/pubkey_public_key.c @@ -20,6 +20,7 @@ #include "pubkey_public_key.h" #include <debug.h> +#include <asn1/pem.h> #include <asn1/oid.h> #include <asn1/asn1.h> #include <asn1/asn1_parser.h> @@ -131,19 +132,34 @@ static void add(private_builder_t *this, builder_part_t part, ...) DBG1("ignoring surplus build part %N", builder_part_names, part); return; } + va_start(args, part); switch (part) { case BUILD_BLOB_ASN1_DER: { - va_start(args, part); this->key = load(va_arg(args, chunk_t)); - va_end(args); + break; + } + case BUILD_BLOB_ASN1_PEM: + { + bool pgp; + char *pem; + chunk_t blob; + + pem = va_arg(args, char *); + blob = chunk_clone(chunk_create(pem, strlen(pem))); + if (pem_to_bin(&blob, &chunk_empty, &pgp)) + { + this->key = load(chunk_clone(blob)); + } + free(blob.ptr); break; } default: DBG1("ignoring unsupported build part %N", builder_part_names, part); break; } + va_end(args); } /** |