security/integrity/platform_certs/load_powerpc.c

Source file repositories/reference/linux-study-clean/security/integrity/platform_certs/load_powerpc.c

File Facts

System
Linux kernel
Corpus path
security/integrity/platform_certs/load_powerpc.c
Extension
.c
Size
4122 bytes
Lines
161
Domain
Core OS
Bucket
Security And Isolation
Inferred role
Core OS: implementation source
Status
source implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

strcmp("ibm,plpks-sb-v0", buf)) {
		pr_err("Unsupported secvar implementation \"%s\", not loading certs\n", buf);
		return -ENODEV;
	}

	if (strcmp("ibm,plpks-sb-v1", buf) == 0 || strcmp("ibm,plpks-sb-v0", buf) == 0)
		/* PLPKS authenticated variables ESL data is prefixed with 8 bytes of timestamp */
		offset = 8;

	/*
	 * Get db, and dbx. They might not exist, so it isn't an error if we
	 * can't get them.
	 */
	data = get_cert_list("db", 3, &dsize);
	if (!data) {
		pr_info("Couldn't get db list from firmware\n");
	} else if (IS_ERR(data)) {
		rc = PTR_ERR(data);
		pr_err("Error reading db from firmware: %d\n", rc);
		return rc;
	} else {
		extract_esl(db, data, dsize, offset);

		rc = parse_efi_signature_list("powerpc:db", db, dsize,
					      get_handler_for_db);
		if (rc)
			pr_err("Couldn't parse db signatures: %d\n", rc);
		kfree(data);
	}

	data = get_cert_list("dbx", 4,  &dsize);
	if (!data) {
		pr_info("Couldn't get dbx list from firmware\n");
	} else if (IS_ERR(data)) {
		rc = PTR_ERR(data);
		pr_err("Error reading dbx from firmware: %d\n", rc);
		return rc;
	} else {
		extract_esl(dbx, data, dsize, offset);

		rc = parse_efi_signature_list("powerpc:dbx", dbx, dsize,
					      get_handler_for_dbx);
		if (rc)
			pr_err("Couldn't parse dbx signatures: %d\n", rc);
		kfree(data);
	}

	data = get_cert_list("trustedcadb", 12,  &dsize);
	if (!data) {
		pr_info("Couldn't get trustedcadb list from firmware\n");
	} else if (IS_ERR(data)) {
		rc = PTR_ERR(data);
		pr_err("Error reading trustedcadb from firmware: %d\n", rc);
	} else {
		extract_esl(trustedca, data, dsize, offset);

		rc = parse_efi_signature_list("powerpc:trustedca", trustedca, dsize,
					      get_handler_for_ca_keys);
		if (rc)
			pr_err("Couldn't parse trustedcadb signatures: %d\n", rc);
		kfree(data);
	}

	data = get_cert_list("moduledb", 9,  &dsize);
	if (!data) {
		pr_info("Couldn't get moduledb list from firmware\n");
	} else if (IS_ERR(data)) {
		rc = PTR_ERR(data);
		pr_err("Error reading moduledb from firmware: %d\n", rc);
	} else {
		extract_esl(moduledb, data, dsize, offset);

		rc = parse_efi_signature_list("powerpc:moduledb", moduledb, dsize,
					      get_handler_for_code_signing_keys);
		if (rc)
			pr_err("Couldn't parse moduledb signatures: %d\n", rc);
		kfree(data);
	}

	return rc;
}
late_initcall(load_powerpc_certs);

Annotation

Implementation Notes