summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStef Walter <stefw@gnome.org>2014-04-18 13:33:28 +0200
committerStef Walter <stefw@redhat.com>2014-04-19 22:29:49 +0200
commitf6173cd11ba0b8f07687ffd575ac9b7488f47e46 (patch)
treea269be9cfd80e0d7c80e463511d37e7e62ed9372
parent85363fa6107d7a7485e2c42b1fdce7e552bf4479 (diff)
gcr: GcrParser support or PEM 'PUBLIC KEY' files
These contain SubjectPublicKeyInfo
-rw-r--r--gcr/fixtures/cert-ecc521.pub7
-rw-r--r--gcr/gcr-parser.c14
-rw-r--r--gcr/gcr-types.h1
3 files changed, 22 insertions, 0 deletions
diff --git a/gcr/fixtures/cert-ecc521.pub b/gcr/fixtures/cert-ecc521.pub
new file mode 100644
index 0000000..3357575
--- /dev/null
+++ b/gcr/fixtures/cert-ecc521.pub
@@ -0,0 +1,7 @@
+-----BEGIN PUBLIC KEY-----
+MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAoapA9bLQHQiI8V2mIzs9sq80VR4F
+BB0TBOSxGqBOE3FSzHAejQkIKc/1pW0v0wKvapYMq/RrfhPJxPkjTPtztUsAkU//
+9E0/aoEWVC6Rqf+VX3wIhe7+RS8JXdBh9SM0+Z9MCRUiM8K9qPMtpNgB2ks7T5BG
+FHSMlNKmuLW1agWPy5A=
+-----END PUBLIC KEY-----
+
diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c
index 5bb4b99..d0ad6db 100644
--- a/gcr/gcr-parser.c
+++ b/gcr/gcr-parser.c
@@ -178,6 +178,7 @@ static GQuark PEM_PRIVATE_KEY;
static GQuark PEM_PKCS7;
static GQuark PEM_PKCS12;
static GQuark PEM_CERTIFICATE_REQUEST;
+static GQuark PEM_PUBLIC_KEY;
static GQuark ARMOR_PGP_PUBLIC_KEY_BLOCK;
static GQuark ARMOR_PGP_PRIVATE_KEY_BLOCK;
@@ -202,6 +203,7 @@ init_quarks (void)
QUARK (PEM_PKCS7, "PKCS7");
QUARK (PEM_PKCS12, "PKCS12");
QUARK (PEM_CERTIFICATE_REQUEST, "CERTIFICATE REQUEST");
+ QUARK (PEM_PUBLIC_KEY, "PUBLIC KEY");
QUARK (ARMOR_PGP_PRIVATE_KEY_BLOCK, "PGP PRIVATE KEY BLOCK");
QUARK (ARMOR_PGP_PUBLIC_KEY_BLOCK, "PGP PUBLIC KEY BLOCK");
@@ -1843,6 +1845,9 @@ formats_for_armor_type (GQuark armor_type,
} else if (armor_type == PEM_PKCS12) {
*inner_format = GCR_FORMAT_DER_PKCS12;
*outer_format = GCR_FORMAT_PEM_PKCS12;
+ } else if (armor_type == PEM_PUBLIC_KEY) {
+ *inner_format = GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY;
+ *outer_format = GCR_FORMAT_PEM_PUBLIC_KEY;
} else if (armor_type == ARMOR_PGP_PRIVATE_KEY_BLOCK) {
*inner_format = GCR_FORMAT_OPENPGP_PACKET;
*outer_format = GCR_FORMAT_OPENPGP_ARMOR;
@@ -2040,6 +2045,13 @@ parse_pem_private_key_ec (GcrParser *self,
}
static gint
+parse_pem_public_key (GcrParser *self,
+ GBytes *data)
+{
+ return handle_pem_format (self, GCR_FORMAT_DER_SUBJECT_PUBLIC_KEY, data);
+}
+
+static gint
parse_pem_certificate (GcrParser *self,
GBytes *data)
{
@@ -2157,6 +2169,7 @@ parse_openssh_public (GcrParser *self,
* @GCR_FORMAT_PEM_PKCS8_ENCRYPTED: Encrypted OpenSSL style PEM file containing PKCS\#8
* @GCR_FORMAT_PEM_PKCS10: An OpenSSL style PEM file containing PKCS\#10
* @GCR_FORMAT_PEM_PKCS12: An OpenSSL style PEM file containing PKCS\#12
+ * @GCR_FORMAT_PEM_PUBLIC_KEY: An OpenSSL style PEM file containing a SubjectPublicKeyInfo
* @GCR_FORMAT_DER_SPKAC: DER encoded SPKAC as generated by HTML5 keygen element
* @GCR_FORMAT_BASE64_SPKAC: OpenSSL style SPKAC data
*
@@ -2216,6 +2229,7 @@ static const ParserFormat parser_formats[] = {
{ GCR_FORMAT_PEM_PKCS12, parse_pem_pkcs12 },
{ GCR_FORMAT_PEM_PKCS10, parse_pem_pkcs10 },
{ GCR_FORMAT_PEM_PRIVATE_KEY_EC, parse_pem_private_key_ec },
+ { GCR_FORMAT_PEM_PUBLIC_KEY, parse_pem_public_key },
};
static int
diff --git a/gcr/gcr-types.h b/gcr/gcr-types.h
index 3711380..095615a 100644
--- a/gcr/gcr-types.h
+++ b/gcr/gcr-types.h
@@ -97,6 +97,7 @@ typedef enum {
GCR_FORMAT_PEM_PRIVATE_KEY,
GCR_FORMAT_PEM_PKCS10,
GCR_FORMAT_PEM_PRIVATE_KEY_EC,
+ GCR_FORMAT_PEM_PUBLIC_KEY,
} GcrDataFormat;
/*