[ Avaa Bypassed ]




Upload:

Command:

www-data@3.16.89.150: ~ $
/* Sign a module file using the given key.
 *
 * Copyright © 2014-2016 Red Hat, Inc. All Rights Reserved.
 * Copyright © 2015      Intel Corporation.
 * Copyright © 2016      Hewlett Packard Enterprise Development LP
 *
 * Authors: David Howells <dhowells@redhat.com>
 *          David Woodhouse <dwmw2@infradead.org>
 *          Juerg Haefliger <juerg.haefliger@hpe.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the licence, or (at your option) any later version.
 */
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <getopt.h>
#include <err.h>
#include <arpa/inet.h>
#include <openssl/opensslv.h>
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <openssl/engine.h>

/*
 * OpenSSL 3.0 deprecates the OpenSSL's ENGINE API.
 *
 * Remove this if/when that API is no longer used
 */
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

/*
 * Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to
 * assume that it's not available and its header file is missing and that we
 * should use PKCS#7 instead.  Switching to the older PKCS#7 format restricts
 * the options we have on specifying the X.509 certificate we want.
 *
 * Further, older versions of OpenSSL don't support manually adding signers to
 * the PKCS#7 message so have to accept that we get a certificate included in
 * the signature message.  Nor do such older versions of OpenSSL support
 * signing with anything other than SHA1 - so we're stuck with that if such is
 * the case.
 */
#if defined(LIBRESSL_VERSION_NUMBER) || \
	OPENSSL_VERSION_NUMBER < 0x10000000L || \
	defined(OPENSSL_NO_CMS)
#define USE_PKCS7
#endif
#ifndef USE_PKCS7
#include <openssl/cms.h>
#else
#include <openssl/pkcs7.h>
#endif

struct module_signature {
	uint8_t		algo;		/* Public-key crypto algorithm [0] */
	uint8_t		hash;		/* Digest algorithm [0] */
	uint8_t		id_type;	/* Key identifier type [PKEY_ID_PKCS7] */
	uint8_t		signer_len;	/* Length of signer's name [0] */
	uint8_t		key_id_len;	/* Length of key identifier [0] */
	uint8_t		__pad[3];
	uint32_t	sig_len;	/* Length of signature data */
};

#define PKEY_ID_PKCS7 2

static char magic_number[] = "~Module signature appended~\n";

static __attribute__((noreturn))
void format(void)
{
	fprintf(stderr,
		"Usage: scripts/sign-file [-dp] <hash algo> <key> <x509> <module> [<dest>]\n");
	fprintf(stderr,
		"       scripts/sign-file -s <raw sig> <hash algo> <x509> <module> [<dest>]\n");
	exit(2);
}

static void display_openssl_errors(int l)
{
	const char *file;
	char buf[120];
	int e, line;

	if (ERR_peek_error() == 0)
		return;
	fprintf(stderr, "At main.c:%d:\n", l);

	while ((e = ERR_get_error_line(&file, &line))) {
		ERR_error_string(e, buf);
		fprintf(stderr, "- SSL %s: %s:%d\n", buf, file, line);
	}
}

static void drain_openssl_errors(void)
{
	const char *file;
	int line;

	if (ERR_peek_error() == 0)
		return;
	while (ERR_get_error_line(&file, &line)) {}
}

#define ERR(cond, fmt, ...)				\
	do {						\
		bool __cond = (cond);			\
		display_openssl_errors(__LINE__);	\
		if (__cond) {				\
			err(1, fmt, ## __VA_ARGS__);	\
		}					\
	} while(0)

static const char *key_pass;

static int pem_pw_cb(char *buf, int len, int w, void *v)
{
	int pwlen;

	if (!key_pass)
		return -1;

	pwlen = strlen(key_pass);
	if (pwlen >= len)
		return -1;

	strcpy(buf, key_pass);

	/* If it's wrong, don't keep trying it. */
	key_pass = NULL;

	return pwlen;
}

static EVP_PKEY *read_private_key(const char *private_key_name)
{
	EVP_PKEY *private_key;

	if (!strncmp(private_key_name, "pkcs11:", 7)) {
		ENGINE *e;

		ENGINE_load_builtin_engines();
		drain_openssl_errors();
		e = ENGINE_by_id("pkcs11");
		ERR(!e, "Load PKCS#11 ENGINE");
		if (ENGINE_init(e))
			drain_openssl_errors();
		else
			ERR(1, "ENGINE_init");
		if (key_pass)
			ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0),
			    "Set PKCS#11 PIN");
		private_key = ENGINE_load_private_key(e, private_key_name,
						      NULL, NULL);
		ERR(!private_key, "%s", private_key_name);
	} else {
		BIO *b;

		b = BIO_new_file(private_key_name, "rb");
		ERR(!b, "%s", private_key_name);
		private_key = PEM_read_bio_PrivateKey(b, NULL, pem_pw_cb,
						      NULL);
		ERR(!private_key, "%s", private_key_name);
		BIO_free(b);
	}

	return private_key;
}

static X509 *read_x509(const char *x509_name)
{
	unsigned char buf[2];
	X509 *x509;
	BIO *b;
	int n;

	b = BIO_new_file(x509_name, "rb");
	ERR(!b, "%s", x509_name);

	/* Look at the first two bytes of the file to determine the encoding */
	n = BIO_read(b, buf, 2);
	if (n != 2) {
		if (BIO_should_retry(b)) {
			fprintf(stderr, "%s: Read wanted retry\n", x509_name);
			exit(1);
		}
		if (n >= 0) {
			fprintf(stderr, "%s: Short read\n", x509_name);
			exit(1);
		}
		ERR(1, "%s", x509_name);
	}

	ERR(BIO_reset(b) != 0, "%s", x509_name);

	if (buf[0] == 0x30 && buf[1] >= 0x81 && buf[1] <= 0x84)
		/* Assume raw DER encoded X.509 */
		x509 = d2i_X509_bio(b, NULL);
	else
		/* Assume PEM encoded X.509 */
		x509 = PEM_read_bio_X509(b, NULL, NULL, NULL);

	BIO_free(b);
	ERR(!x509, "%s", x509_name);

	return x509;
}

int main(int argc, char **argv)
{
	struct module_signature sig_info = { .id_type = PKEY_ID_PKCS7 };
	char *hash_algo = NULL;
	char *private_key_name = NULL, *raw_sig_name = NULL;
	char *x509_name, *module_name, *dest_name;
	bool save_sig = false, replace_orig;
	bool sign_only = false;
	bool raw_sig = false;
	unsigned char buf[4096];
	unsigned long module_size, sig_size;
	unsigned int use_signed_attrs;
	const EVP_MD *digest_algo;
	EVP_PKEY *private_key;
#ifndef USE_PKCS7
	CMS_ContentInfo *cms = NULL;
	unsigned int use_keyid = 0;
#else
	PKCS7 *pkcs7 = NULL;
#endif
	X509 *x509;
	BIO *bd, *bm;
	int opt, n;
	OpenSSL_add_all_algorithms();
	ERR_load_crypto_strings();
	ERR_clear_error();

	key_pass = getenv("KBUILD_SIGN_PIN");

#ifndef USE_PKCS7
	use_signed_attrs = CMS_NOATTR;
#else
	use_signed_attrs = PKCS7_NOATTR;
#endif

	do {
		opt = getopt(argc, argv, "sdpk");
		switch (opt) {
		case 's': raw_sig = true; break;
		case 'p': save_sig = true; break;
		case 'd': sign_only = true; save_sig = true; break;
#ifndef USE_PKCS7
		case 'k': use_keyid = CMS_USE_KEYID; break;
#endif
		case -1: break;
		default: format();
		}
	} while (opt != -1);

	argc -= optind;
	argv += optind;
	if (argc < 4 || argc > 5)
		format();

	if (raw_sig) {
		raw_sig_name = argv[0];
		hash_algo = argv[1];
	} else {
		hash_algo = argv[0];
		private_key_name = argv[1];
	}
	x509_name = argv[2];
	module_name = argv[3];
	if (argc == 5 && strcmp(argv[3], argv[4]) != 0) {
		dest_name = argv[4];
		replace_orig = false;
	} else {
		ERR(asprintf(&dest_name, "%s.~signed~", module_name) < 0,
		    "asprintf");
		replace_orig = true;
	}

#ifdef USE_PKCS7
	if (strcmp(hash_algo, "sha1") != 0) {
		fprintf(stderr, "sign-file: %s only supports SHA1 signing\n",
			OPENSSL_VERSION_TEXT);
		exit(3);
	}
#endif

	/* Open the module file */
	bm = BIO_new_file(module_name, "rb");
	ERR(!bm, "%s", module_name);

	if (!raw_sig) {
		/* Read the private key and the X.509 cert the PKCS#7 message
		 * will point to.
		 */
		private_key = read_private_key(private_key_name);
		x509 = read_x509(x509_name);

		/* Digest the module data. */
		OpenSSL_add_all_digests();
		display_openssl_errors(__LINE__);
		digest_algo = EVP_get_digestbyname(hash_algo);
		ERR(!digest_algo, "EVP_get_digestbyname");

#ifndef USE_PKCS7
		/* Load the signature message from the digest buffer. */
		cms = CMS_sign(NULL, NULL, NULL, NULL,
			       CMS_NOCERTS | CMS_PARTIAL | CMS_BINARY |
			       CMS_DETACHED | CMS_STREAM);
		ERR(!cms, "CMS_sign");

		ERR(!CMS_add1_signer(cms, x509, private_key, digest_algo,
				     CMS_NOCERTS | CMS_BINARY |
				     CMS_NOSMIMECAP | use_keyid |
				     use_signed_attrs),
		    "CMS_add1_signer");
		ERR(CMS_final(cms, bm, NULL, CMS_NOCERTS | CMS_BINARY) != 1,
		    "CMS_final");

#else
		pkcs7 = PKCS7_sign(x509, private_key, NULL, bm,
				   PKCS7_NOCERTS | PKCS7_BINARY |
				   PKCS7_DETACHED | use_signed_attrs);
		ERR(!pkcs7, "PKCS7_sign");
#endif

		if (save_sig) {
			char *sig_file_name;
			BIO *b;

			ERR(asprintf(&sig_file_name, "%s.p7s", module_name) < 0,
			    "asprintf");
			b = BIO_new_file(sig_file_name, "wb");
			ERR(!b, "%s", sig_file_name);
#ifndef USE_PKCS7
			ERR(i2d_CMS_bio_stream(b, cms, NULL, 0) != 1,
			    "%s", sig_file_name);
#else
			ERR(i2d_PKCS7_bio(b, pkcs7) != 1,
			    "%s", sig_file_name);
#endif
			BIO_free(b);
		}

		if (sign_only) {
			BIO_free(bm);
			return 0;
		}
	}

	/* Open the destination file now so that we can shovel the module data
	 * across as we read it.
	 */
	bd = BIO_new_file(dest_name, "wb");
	ERR(!bd, "%s", dest_name);

	/* Append the marker and the PKCS#7 message to the destination file */
	ERR(BIO_reset(bm) < 0, "%s", module_name);
	while ((n = BIO_read(bm, buf, sizeof(buf))),
	       n > 0) {
		ERR(BIO_write(bd, buf, n) < 0, "%s", dest_name);
	}
	BIO_free(bm);
	ERR(n < 0, "%s", module_name);
	module_size = BIO_number_written(bd);

	if (!raw_sig) {
#ifndef USE_PKCS7
		ERR(i2d_CMS_bio_stream(bd, cms, NULL, 0) != 1, "%s", dest_name);
#else
		ERR(i2d_PKCS7_bio(bd, pkcs7) != 1, "%s", dest_name);
#endif
	} else {
		BIO *b;

		/* Read the raw signature file and write the data to the
		 * destination file
		 */
		b = BIO_new_file(raw_sig_name, "rb");
		ERR(!b, "%s", raw_sig_name);
		while ((n = BIO_read(b, buf, sizeof(buf))), n > 0)
			ERR(BIO_write(bd, buf, n) < 0, "%s", dest_name);
		BIO_free(b);
	}

	sig_size = BIO_number_written(bd) - module_size;
	sig_info.sig_len = htonl(sig_size);
	ERR(BIO_write(bd, &sig_info, sizeof(sig_info)) < 0, "%s", dest_name);
	ERR(BIO_write(bd, magic_number, sizeof(magic_number) - 1) < 0, "%s", dest_name);

	ERR(BIO_free(bd) != 1, "%s", dest_name);

	/* Finally, if we're signing in place, replace the original. */
	if (replace_orig)
		ERR(rename(dest_name, module_name) < 0, "%s", dest_name);

	return 0;
}

Filemanager

Name Type Size Permission Actions
atomic Folder 0755
basic Folder 0755
clang-tools Folder 0755
coccinelle Folder 0755
dtc Folder 0755
dummy-tools Folder 0755
gcc-plugins Folder 0755
gdb Folder 0755
genksyms Folder 0755
kconfig Folder 0755
ksymoops Folder 0755
mod Folder 0755
package Folder 0755
selinux Folder 0755
tracing Folder 0755
.asn1_compiler.cmd File 726 B 0644
.bin2c.cmd File 421 B 0644
.extract-cert.cmd File 499 B 0644
.insert-sys-cert.cmd File 521 B 0644
.kallsyms.cmd File 451 B 0644
.sign-file.cmd File 469 B 0644
.sorttable.cmd File 782 B 0644
Kbuild.include File 10.15 KB 0644
Kconfig.include File 2.56 KB 0644
Lindent File 502 B 0755
Makefile File 1.64 KB 0644
Makefile.asm-generic File 1.82 KB 0644
Makefile.build File 19.66 KB 0644
Makefile.clang File 1.59 KB 0644
Makefile.clean File 2.2 KB 0644
Makefile.compiler File 2.54 KB 0644
Makefile.dtbinst File 1007 B 0644
Makefile.extrawarn File 2.99 KB 0644
Makefile.gcc-plugins File 2.71 KB 0644
Makefile.headersinst File 2.88 KB 0644
Makefile.host File 4.63 KB 0644
Makefile.kasan File 1.67 KB 0644
Makefile.kcov File 333 B 0644
Makefile.kcsan File 739 B 0644
Makefile.lib File 18.02 KB 0644
Makefile.modfinal File 2.73 KB 0644
Makefile.modinst File 2.51 KB 0644
Makefile.modpost File 4.37 KB 0644
Makefile.package File 6.61 KB 0644
Makefile.ubsan File 770 B 0644
Makefile.userprogs File 1.57 KB 0644
adjust_autoksyms.sh File 2.07 KB 0755
as-version.sh File 2.02 KB 0755
asn1_compiler File 35.11 KB 0755
asn1_compiler.c File 35.33 KB 0644
bin2c File 16.44 KB 0755
bin2c.c File 743 B 0644
bloat-o-meter File 3.36 KB 0755
bootgraph.pl File 5.64 KB 0755
bpf_doc.py File 24.98 KB 0755
cc-can-link.sh File 166 B 0755
cc-version.sh File 1.51 KB 0755
check-sysctl-docs File 4.37 KB 0755
check_extable.sh File 4.93 KB 0755
checkdeclares.pl File 1.1 KB 0755
checkincludes.pl File 1.94 KB 0755
checkkconfigsymbols.py File 15.75 KB 0755
checkpatch.pl File 223.75 KB 0755
checkstack.pl File 5.86 KB 0755
checksyscalls.sh File 7.42 KB 0755
checkversion.pl File 2.16 KB 0755
cleanfile File 3.46 KB 0755
cleanpatch File 5.06 KB 0755
coccicheck File 7.89 KB 0755
config File 4.67 KB 0755
const_structs.checkpatch File 1009 B 0644
decode_stacktrace.sh File 7.51 KB 0755
decodecode File 2.88 KB 0755
depmod.sh File 1.41 KB 0755
dev-needs.sh File 6.07 KB 0755
diffconfig File 4.12 KB 0755
documentation-file-ref-check File 5.55 KB 0755
export_report.pl File 4.5 KB 0755
extract-cert File 17.89 KB 0755
extract-cert.c File 3.63 KB 0644
extract-ikconfig File 1.69 KB 0755
extract-module-sig.pl File 3.66 KB 0755
extract-sys-certs.pl File 3.75 KB 0755
extract-vmlinux File 1.66 KB 0755
extract_xc3028.pl File 44.62 KB 0755
faddr2line File 8.17 KB 0755
file-size.sh File 86 B 0755
find-unused-docs.sh File 1.27 KB 0755
gcc-goto.sh File 511 B 0755
gcc-ld File 711 B 0755
gcc-x86_32-has-stack-protector.sh File 405 B 0755
gcc-x86_64-has-stack-protector.sh File 195 B 0755
gen_autoksyms.sh File 1.47 KB 0755
gen_ksymdeps.sh File 556 B 0755
generate_initcall_order.pl File 5.95 KB 0755
get_abi.pl File 15.1 KB 0755
get_dvb_firmware File 24.54 KB 0755
get_feat.pl File 14.34 KB 0755
get_maintainer.pl File 67.13 KB 0755
gfp-translate File 1.69 KB 0755
headerdep.pl File 3.5 KB 0755
headers_check.pl File 3.73 KB 0755
headers_install.sh File 3.35 KB 0755
insert-sys-cert File 22.21 KB 0755
insert-sys-cert.c File 13.08 KB 0644
jobserver-exec File 2.16 KB 0755
kallsyms File 22.47 KB 0755
kallsyms.c File 18.06 KB 0644
kernel-doc File 68.74 KB 0755
ld-version.sh File 1.82 KB 0755
leaking_addresses.pl File 12.8 KB 0755
link-vmlinux.sh File 10.92 KB 0755
makelst File 808 B 0755
markup_oops.pl File 7.92 KB 0755
min-tool-version.sh File 558 B 0755
mkcompile_h File 2.48 KB 0755
mksysmap File 1.34 KB 0755
mkuboot.sh File 414 B 0755
module.lds File 597 B 0644
module.lds.S File 1.65 KB 0644
modules-check.sh File 427 B 0755
nsdeps File 1.72 KB 0644
objdiff File 2.84 KB 0755
pahole-flags.sh File 749 B 0755
pahole-version.sh File 269 B 0755
parse-maintainers.pl File 4.54 KB 0755
patch-kernel File 9.95 KB 0755
profile2linkerlist.pl File 414 B 0755
prune-kernel File 708 B 0755
recordmcount.c File 16.75 KB 0644
recordmcount.h File 19.37 KB 0644
recordmcount.pl File 17.63 KB 0755
remove-stale-files File 1.3 KB 0755
setlocalversion File 3.5 KB 0755
show_delta File 3.01 KB 0755
sign-file File 26.52 KB 0755
sign-file.c File 9.93 KB 0644
sorttable File 21.51 KB 0755
sorttable.c File 8.74 KB 0644
sorttable.h File 9.65 KB 0644
spdxcheck-test.sh File 277 B 0644
spdxcheck.py File 10.09 KB 0755
spelling.txt File 31.88 KB 0644
sphinx-pre-install File 24.45 KB 0755
split-man.pl File 604 B 0755
stackdelta File 1.84 KB 0755
stackusage File 794 B 0755
subarch.include File 619 B 0644
syscallhdr.sh File 1.89 KB 0755
syscallnr.sh File 1.45 KB 0755
syscalltbl.sh File 1.45 KB 0755
tags.sh File 9.87 KB 0755
tools-support-relr.sh File 546 B 0755
ubuntu-retpoline-extract-one File 7.26 KB 0644
unifdef.c File 34.8 KB 0644
ver_linux File 2.59 KB 0755
xen-hypercalls.sh File 386 B 0755
xz_wrap.sh File 563 B 0755