Blame SOURCES/0016-efikeygen-add-modsign.patch

793dd5
From 9b4b12928c0450ac69d83293e179eec439465c03 Mon Sep 17 00:00:00 2001
793dd5
From: Peter Jones <pjones@redhat.com>
793dd5
Date: Mon, 22 Aug 2016 13:43:56 -0400
793dd5
Subject: [PATCH 16/29] efikeygen: add --modsign
793dd5
793dd5
---
793dd5
 src/cms_common.c | 29 ++++++++++++++++++++++++++++
793dd5
 src/cms_common.h |  1 +
793dd5
 src/efikeygen.c  | 59 ++++++++++++++++++++++++++++++++++++++++++++------------
793dd5
 3 files changed, 77 insertions(+), 12 deletions(-)
793dd5
793dd5
diff --git a/src/cms_common.c b/src/cms_common.c
793dd5
index 6a4e6a7..2df2cfe 100644
793dd5
--- a/src/cms_common.c
793dd5
+++ b/src/cms_common.c
793dd5
@@ -715,6 +715,35 @@ make_context_specific(cms_context *cms, int ctxt, SECItem *encoded,
793dd5
 	return 0;
793dd5
 }
793dd5
 
793dd5
+static SEC_ASN1Template EKUOidSequence[] = {
793dd5
+	{
793dd5
+	.kind = SEC_ASN1_OBJECT_ID,
793dd5
+	.offset = 0,
793dd5
+	.sub = &SEC_AnyTemplate,
793dd5
+	.size = sizeof (SECItem),
793dd5
+	},
793dd5
+	{ 0 }
793dd5
+};
793dd5
+
793dd5
+int
793dd5
+make_eku_oid(cms_context *cms, SECItem *encoded, SECOidTag oid_tag)
793dd5
+{
793dd5
+	void *rv;
793dd5
+	SECOidData *oid_data;
793dd5
+
793dd5
+	oid_data = SECOID_FindOIDByTag(oid_tag);
793dd5
+	if (!oid_data)
793dd5
+		cmsreterr(-1, cms, "could not encode eku oid data");
793dd5
+
793dd5
+	rv = SEC_ASN1EncodeItem(cms->arena, encoded, &oid_data->oid,
793dd5
+				EKUOidSequence);
793dd5
+	if (rv == NULL)
793dd5
+		cmsreterr(-1, cms, "could not encode eku oid data");
793dd5
+
793dd5
+	encoded->type = siBuffer;
793dd5
+	return 0;
793dd5
+}
793dd5
+
793dd5
 int
793dd5
 generate_octet_string(cms_context *cms, SECItem *encoded, SECItem *original)
793dd5
 {
793dd5
diff --git a/src/cms_common.h b/src/cms_common.h
793dd5
index c7d7268..7a31273 100644
793dd5
--- a/src/cms_common.h
793dd5
+++ b/src/cms_common.h
793dd5
@@ -123,6 +123,7 @@ extern int wrap_in_seq(cms_context *cms, SECItem *der,
793dd5
 			SECItem *items, int num_items);
793dd5
 extern int make_context_specific(cms_context *cms, int ctxt, SECItem *encoded,
793dd5
 			SECItem *original);
793dd5
+extern int make_eku_oid(cms_context *cms, SECItem *encoded, SECOidTag oid_tag);
793dd5
 extern int generate_validity(cms_context *cms, SECItem *der, time_t start,
793dd5
 				time_t end);
793dd5
 extern int generate_common_name(cms_context *cms, SECItem *der, char *cn);
793dd5
diff --git a/src/efikeygen.c b/src/efikeygen.c
793dd5
index 8a515a5..9390578 100644
793dd5
--- a/src/efikeygen.c
793dd5
+++ b/src/efikeygen.c
793dd5
@@ -49,6 +49,7 @@
793dd5
 #include <libdpe/libdpe.h>
793dd5
 
793dd5
 #include "cms_common.h"
793dd5
+#include "oid.h"
793dd5
 #include "util.h"
793dd5
 
793dd5
 typedef struct {
793dd5
@@ -249,20 +250,34 @@ add_basic_constraints(cms_context *cms, void *extHandle)
793dd5
 }
793dd5
 
793dd5
 static int
793dd5
-add_extended_key_usage(cms_context *cms, void *extHandle)
793dd5
+add_extended_key_usage(cms_context *cms, int modsign_only, void *extHandle)
793dd5
 {
793dd5
-	SECItem value = {
793dd5
-		.data = (unsigned char *)"\x30\x0a\x06\x08\x2b\x06\x01"
793dd5
-					 "\x05\x05\x07\x03\x03",
793dd5
-		.len = 12,
793dd5
-		.type = siBuffer
793dd5
-	};
793dd5
+	SECItem values[2];
793dd5
+	SECItem wrapped = { 0 };
793dd5
+	SECStatus status;
793dd5
+	SECOidTag tag;
793dd5
+	int rc;
793dd5
+
793dd5
+	if (modsign_only < 1 || modsign_only > 2)
793dd5
+		cmsreterr(-1, cms, "could not encode extended key usage");
793dd5
 
793dd5
+	rc = make_eku_oid(cms, &values[0], SEC_OID_EXT_KEY_USAGE_CODE_SIGN);
793dd5
+	if (rc < 0)
793dd5
+		cmsreterr(-1, cms, "could not encode extended key usage");
793dd5
+
793dd5
+	tag = find_ms_oid_tag(SHIM_EKU_MODULE_SIGNING_ONLY);
793dd5
+	printf("tag: %d\n", tag);
793dd5
+	rc = make_eku_oid(cms, &values[1], tag);
793dd5
+	if (rc < 0)
793dd5
+		cmsreterr(-1, cms, "could not encode extended key usage");
793dd5
+
793dd5
+	rc = wrap_in_seq(cms, &wrapped, values, modsign_only);
793dd5
+	if (rc < 0)
793dd5
+		cmsreterr(-1, cms, "could not encode extended key usage");
793dd5
 
793dd5
-	SECStatus status;
793dd5
 
793dd5
 	status = CERT_AddExtension(extHandle, SEC_OID_X509_EXT_KEY_USAGE,
793dd5
-					&value, PR_FALSE, PR_TRUE);
793dd5
+					&wrapped, PR_FALSE, PR_TRUE);
793dd5
 	if (status != SECSuccess)
793dd5
 		cmsreterr(-1, cms, "could not encode extended key usage");
793dd5
 
793dd5
@@ -294,7 +309,7 @@ static int
793dd5
 add_extensions_to_crq(cms_context *cms, CERTCertificateRequest *crq,
793dd5
 			int is_ca, int is_self_signed, SECKEYPublicKey *pubkey,
793dd5
 			SECKEYPublicKey *spubkey,
793dd5
-			char *url)
793dd5
+			char *url, int modsign_only)
793dd5
 {
793dd5
 	void *mark = PORT_ArenaMark(cms->arena);
793dd5
 
793dd5
@@ -319,7 +334,7 @@ add_extensions_to_crq(cms_context *cms, CERTCertificateRequest *crq,
793dd5
 	if (rc < 0)
793dd5
 		cmsreterr(-1, cms, "could not generate certificate extensions");
793dd5
 
793dd5
-	rc = add_extended_key_usage(cms, extHandle);
793dd5
+	rc = add_extended_key_usage(cms, modsign_only, extHandle);
793dd5
 	if (rc < 0)
793dd5
 		cmsreterr(-1, cms, "could not generate certificate extensions");
793dd5
 
793dd5
@@ -469,6 +484,7 @@ int main(int argc, char *argv[])
793dd5
 {
793dd5
 	int is_ca = 0;
793dd5
 	int is_self_signed = -1;
793dd5
+	int modsign_only = 0;
793dd5
 	char *tokenname = "NSS Certificate DB";
793dd5
 	char *signer = NULL;
793dd5
 	char *nickname = NULL;
793dd5
@@ -522,6 +538,18 @@ int main(int argc, char *argv[])
793dd5
 		 .descrip = "Generate a self-signed certificate" },
793dd5
 
793dd5
 		/* stuff about the generated key */
793dd5
+		{.longName = "kernel",
793dd5
+		 .shortName = 'k',
793dd5
+		 .argInfo = POPT_ARG_VAL|POPT_ARGFLAG_OR,
793dd5
+		 .arg = &modsign_only,
793dd5
+		 .val = 1,
793dd5
+		 .descrip = "Generate a kernel-signing certificate" },
793dd5
+		{.longName = "module",
793dd5
+		 .shortName = 'm',
793dd5
+		 .argInfo = POPT_ARG_VAL|POPT_ARGFLAG_OR,
793dd5
+		 .arg = &modsign_only,
793dd5
+		 .val = 2,
793dd5
+		 .descrip = "Generate a module-signing certificate" },
793dd5
 		{.longName = "nickname",
793dd5
 		 .shortName = 'n',
793dd5
 		 .argInfo = POPT_ARG_STRING,
793dd5
@@ -628,6 +656,9 @@ int main(int argc, char *argv[])
793dd5
 			liberr(1, "could not allocate cms context");
793dd5
 	}
793dd5
 
793dd5
+	if (modsign_only < 1 || modsign_only > 2)
793dd5
+		errx(1, "either --kernel or --module must be used");
793dd5
+
793dd5
 	SECStatus status = NSS_InitReadWrite(dbdir);
793dd5
 	if (status != SECSuccess)
793dd5
 		nsserr(1, "could not initialize NSS");
793dd5
@@ -639,6 +670,10 @@ int main(int argc, char *argv[])
793dd5
 	SECKEYPublicKey *pubkey = NULL;
793dd5
 	SECKEYPrivateKey *privkey = NULL;
793dd5
 
793dd5
+	status = register_oids(cms);
793dd5
+	if (status != SECSuccess)
793dd5
+		nsserr(1, "Could not register OIDs");
793dd5
+
793dd5
 	PK11SlotInfo *slot = NULL;
793dd5
 	if (pubfile) {
793dd5
 		rc = get_pubkey_from_file(pubfile, &pubkey);
793dd5
@@ -713,7 +748,7 @@ int main(int argc, char *argv[])
793dd5
 	crq = CERT_CreateCertificateRequest(name, spki, &attributes);
793dd5
 
793dd5
 	rc = add_extensions_to_crq(cms, crq, is_ca, is_self_signed, pubkey,
793dd5
-					spubkey, url);
793dd5
+					spubkey, url, modsign_only);
793dd5
 	if (rc < 0)
793dd5
 		exit(1);
793dd5
 
793dd5
-- 
793dd5
2.13.4
793dd5