162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Functions corresponding to secure platform management object type
462306a36Sopenharmony_ci * attributes under BIOS PASSWORD for use with hp-bioscfg driver
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (c) 2022 HP Development Company, L.P.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "bioscfg.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic const char * const spm_state_types[] = {
1262306a36Sopenharmony_ci	"not provisioned",
1362306a36Sopenharmony_ci	"provisioned",
1462306a36Sopenharmony_ci	"provisioning in progress",
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic const char * const spm_mechanism_types[] = {
1862306a36Sopenharmony_ci	"not provisioned",
1962306a36Sopenharmony_ci	"signing-key",
2062306a36Sopenharmony_ci	"endorsement-key",
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct secureplatform_provisioning_data {
2462306a36Sopenharmony_ci	u8 state;
2562306a36Sopenharmony_ci	u8 version[2];
2662306a36Sopenharmony_ci	u8 reserved1;
2762306a36Sopenharmony_ci	u32 features;
2862306a36Sopenharmony_ci	u32 nonce;
2962306a36Sopenharmony_ci	u8 reserved2[28];
3062306a36Sopenharmony_ci	u8 sk_mod[MAX_KEY_MOD_SIZE];
3162306a36Sopenharmony_ci	u8 kek_mod[MAX_KEY_MOD_SIZE];
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci/**
3562306a36Sopenharmony_ci * hp_calculate_security_buffer() - determines size of security buffer
3662306a36Sopenharmony_ci * for authentication scheme
3762306a36Sopenharmony_ci *
3862306a36Sopenharmony_ci * @authentication: the authentication content
3962306a36Sopenharmony_ci *
4062306a36Sopenharmony_ci * Currently only supported type is Admin password
4162306a36Sopenharmony_ci */
4262306a36Sopenharmony_cisize_t hp_calculate_security_buffer(const char *authentication)
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	size_t size, authlen;
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	if (!authentication)
4762306a36Sopenharmony_ci		return sizeof(u16) * 2;
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	authlen = strlen(authentication);
5062306a36Sopenharmony_ci	if (!authlen)
5162306a36Sopenharmony_ci		return sizeof(u16) * 2;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	size = sizeof(u16) + authlen * sizeof(u16);
5462306a36Sopenharmony_ci	if (!strstarts(authentication, BEAM_PREFIX))
5562306a36Sopenharmony_ci		size += strlen(UTF_PREFIX) * sizeof(u16);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	return size;
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/**
6162306a36Sopenharmony_ci * hp_populate_security_buffer() - builds a security buffer for
6262306a36Sopenharmony_ci * authentication scheme
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci * @authbuf: the security buffer
6562306a36Sopenharmony_ci * @authentication: the authentication content
6662306a36Sopenharmony_ci *
6762306a36Sopenharmony_ci * Currently only supported type is PLAIN TEXT
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_ciint hp_populate_security_buffer(u16 *authbuf, const char *authentication)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	u16 *auth = authbuf;
7262306a36Sopenharmony_ci	char *strprefix = NULL;
7362306a36Sopenharmony_ci	int ret = 0;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	if (strstarts(authentication, BEAM_PREFIX)) {
7662306a36Sopenharmony_ci		/*
7762306a36Sopenharmony_ci		 * BEAM_PREFIX is append to authbuf when a signature
7862306a36Sopenharmony_ci		 * is provided and Sure Admin is enabled in BIOS
7962306a36Sopenharmony_ci		 */
8062306a36Sopenharmony_ci		/* BEAM_PREFIX found, convert part to unicode */
8162306a36Sopenharmony_ci		auth = hp_ascii_to_utf16_unicode(auth, authentication);
8262306a36Sopenharmony_ci		if (!auth)
8362306a36Sopenharmony_ci			return -EINVAL;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	} else {
8662306a36Sopenharmony_ci		/*
8762306a36Sopenharmony_ci		 * UTF-16 prefix is append to the * authbuf when a BIOS
8862306a36Sopenharmony_ci		 * admin password is configured in BIOS
8962306a36Sopenharmony_ci		 */
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci		/* append UTF_PREFIX to part and then convert it to unicode */
9262306a36Sopenharmony_ci		strprefix = kasprintf(GFP_KERNEL, "%s%s", UTF_PREFIX,
9362306a36Sopenharmony_ci				      authentication);
9462306a36Sopenharmony_ci		if (!strprefix)
9562306a36Sopenharmony_ci			return -ENOMEM;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci		auth = hp_ascii_to_utf16_unicode(auth, strprefix);
9862306a36Sopenharmony_ci		kfree(strprefix);
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci		if (!auth) {
10162306a36Sopenharmony_ci			ret = -EINVAL;
10262306a36Sopenharmony_ci			goto out_buffer;
10362306a36Sopenharmony_ci		}
10462306a36Sopenharmony_ci	}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciout_buffer:
10762306a36Sopenharmony_ci	return ret;
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic ssize_t update_spm_state(void)
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	struct secureplatform_provisioning_data data;
11362306a36Sopenharmony_ci	int ret;
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	ret = hp_wmi_perform_query(HPWMI_SECUREPLATFORM_GET_STATE,
11662306a36Sopenharmony_ci				   HPWMI_SECUREPLATFORM, &data, 0,
11762306a36Sopenharmony_ci				   sizeof(data));
11862306a36Sopenharmony_ci	if (ret < 0)
11962306a36Sopenharmony_ci		return ret;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci	bioscfg_drv.spm_data.mechanism = data.state;
12262306a36Sopenharmony_ci	if (bioscfg_drv.spm_data.mechanism)
12362306a36Sopenharmony_ci		bioscfg_drv.spm_data.is_enabled = 1;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	return 0;
12662306a36Sopenharmony_ci}
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_cistatic ssize_t statusbin(struct kobject *kobj,
12962306a36Sopenharmony_ci			 struct kobj_attribute *attr,
13062306a36Sopenharmony_ci			 struct secureplatform_provisioning_data *buf)
13162306a36Sopenharmony_ci{
13262306a36Sopenharmony_ci	int ret = hp_wmi_perform_query(HPWMI_SECUREPLATFORM_GET_STATE,
13362306a36Sopenharmony_ci				       HPWMI_SECUREPLATFORM, buf, 0,
13462306a36Sopenharmony_ci				       sizeof(*buf));
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	if (ret < 0)
13762306a36Sopenharmony_ci		return ret;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	return sizeof(struct secureplatform_provisioning_data);
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci/*
14362306a36Sopenharmony_ci * status_show - Reads SPM status
14462306a36Sopenharmony_ci */
14562306a36Sopenharmony_cistatic ssize_t status_show(struct kobject *kobj, struct kobj_attribute
14662306a36Sopenharmony_ci			   *attr, char *buf)
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	int ret, i;
14962306a36Sopenharmony_ci	int len = 0;
15062306a36Sopenharmony_ci	struct secureplatform_provisioning_data data;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	ret = statusbin(kobj, attr, &data);
15362306a36Sopenharmony_ci	if (ret < 0)
15462306a36Sopenharmony_ci		return ret;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	/*
15762306a36Sopenharmony_ci	 * 'status' is a read-only file that returns ASCII text in
15862306a36Sopenharmony_ci	 * JSON format reporting the status information.
15962306a36Sopenharmony_ci	 *
16062306a36Sopenharmony_ci	 * "State": "not provisioned | provisioned | provisioning in progress ",
16162306a36Sopenharmony_ci	 * "Version": " Major. Minor ",
16262306a36Sopenharmony_ci	 * "Nonce": <16-bit unsigned number display in base 10>,
16362306a36Sopenharmony_ci	 * "FeaturesInUse": <16-bit unsigned number display in base 10>,
16462306a36Sopenharmony_ci	 * "EndorsementKeyMod": "<256 bytes in base64>",
16562306a36Sopenharmony_ci	 * "SigningKeyMod": "<256 bytes in base64>"
16662306a36Sopenharmony_ci	 */
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "{\n");
16962306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"State\": \"%s\",\n",
17062306a36Sopenharmony_ci			     spm_state_types[data.state]);
17162306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"Version\": \"%d.%d\"",
17262306a36Sopenharmony_ci			     data.version[0], data.version[1]);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci	/*
17562306a36Sopenharmony_ci	 * state == 0 means secure platform management
17662306a36Sopenharmony_ci	 * feature is not configured in BIOS.
17762306a36Sopenharmony_ci	 */
17862306a36Sopenharmony_ci	if (data.state == 0) {
17962306a36Sopenharmony_ci		len += sysfs_emit_at(buf, len, "\n");
18062306a36Sopenharmony_ci		goto status_exit;
18162306a36Sopenharmony_ci	} else {
18262306a36Sopenharmony_ci		len += sysfs_emit_at(buf, len, ",\n");
18362306a36Sopenharmony_ci	}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"Nonce\": %d,\n", data.nonce);
18662306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"FeaturesInUse\": %d,\n", data.features);
18762306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"EndorsementKeyMod\": \"");
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	for (i = 255; i >= 0; i--)
19062306a36Sopenharmony_ci		len += sysfs_emit_at(buf, len, " %u", data.kek_mod[i]);
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, " \",\n");
19362306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "\t\"SigningKeyMod\": \"");
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	for (i = 255; i >= 0; i--)
19662306a36Sopenharmony_ci		len += sysfs_emit_at(buf, len, " %u", data.sk_mod[i]);
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	/* Return buf contents */
19962306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, " \"\n");
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatus_exit:
20262306a36Sopenharmony_ci	len += sysfs_emit_at(buf, len, "}\n");
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	return len;
20562306a36Sopenharmony_ci}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistatic struct kobj_attribute password_spm_status = __ATTR_RO(status);
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ciATTRIBUTE_SPM_N_PROPERTY_SHOW(is_enabled, spm);
21062306a36Sopenharmony_cistatic struct kobj_attribute password_spm_is_key_enabled = __ATTR_RO(is_enabled);
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_cistatic ssize_t key_mechanism_show(struct kobject *kobj, struct kobj_attribute *attr,
21362306a36Sopenharmony_ci				  char *buf)
21462306a36Sopenharmony_ci{
21562306a36Sopenharmony_ci	return sysfs_emit(buf, "%s\n",
21662306a36Sopenharmony_ci			  spm_mechanism_types[bioscfg_drv.spm_data.mechanism]);
21762306a36Sopenharmony_ci}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistatic struct kobj_attribute password_spm_key_mechanism = __ATTR_RO(key_mechanism);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistatic ssize_t sk_store(struct kobject *kobj,
22262306a36Sopenharmony_ci			struct kobj_attribute *attr,
22362306a36Sopenharmony_ci			const char *buf, size_t count)
22462306a36Sopenharmony_ci{
22562306a36Sopenharmony_ci	int ret;
22662306a36Sopenharmony_ci	int length;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	length = count;
22962306a36Sopenharmony_ci	if (buf[length - 1] == '\n')
23062306a36Sopenharmony_ci		length--;
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	/* allocate space and copy current signing key */
23362306a36Sopenharmony_ci	bioscfg_drv.spm_data.signing_key = kmemdup(buf, length, GFP_KERNEL);
23462306a36Sopenharmony_ci	if (!bioscfg_drv.spm_data.signing_key)
23562306a36Sopenharmony_ci		return -ENOMEM;
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	/* submit signing key payload */
23862306a36Sopenharmony_ci	ret = hp_wmi_perform_query(HPWMI_SECUREPLATFORM_SET_SK,
23962306a36Sopenharmony_ci				   HPWMI_SECUREPLATFORM,
24062306a36Sopenharmony_ci				   (void *)bioscfg_drv.spm_data.signing_key,
24162306a36Sopenharmony_ci				   count, 0);
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_ci	if (!ret) {
24462306a36Sopenharmony_ci		bioscfg_drv.spm_data.mechanism = SIGNING_KEY;
24562306a36Sopenharmony_ci		hp_set_reboot_and_signal_event();
24662306a36Sopenharmony_ci	}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.signing_key);
24962306a36Sopenharmony_ci	bioscfg_drv.spm_data.signing_key = NULL;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	return ret ? ret : count;
25262306a36Sopenharmony_ci}
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistatic struct kobj_attribute password_spm_signing_key = __ATTR_WO(sk);
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_cistatic ssize_t kek_store(struct kobject *kobj,
25762306a36Sopenharmony_ci			 struct kobj_attribute *attr,
25862306a36Sopenharmony_ci			 const char *buf, size_t count)
25962306a36Sopenharmony_ci{
26062306a36Sopenharmony_ci	int ret;
26162306a36Sopenharmony_ci	int length;
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	length = count;
26462306a36Sopenharmony_ci	if (buf[length - 1] == '\n')
26562306a36Sopenharmony_ci		length--;
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci	/* allocate space and copy current signing key */
26862306a36Sopenharmony_ci	bioscfg_drv.spm_data.endorsement_key = kmemdup(buf, length, GFP_KERNEL);
26962306a36Sopenharmony_ci	if (!bioscfg_drv.spm_data.endorsement_key) {
27062306a36Sopenharmony_ci		ret = -ENOMEM;
27162306a36Sopenharmony_ci		goto exit_kek;
27262306a36Sopenharmony_ci	}
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	ret = hp_wmi_perform_query(HPWMI_SECUREPLATFORM_SET_KEK,
27562306a36Sopenharmony_ci				   HPWMI_SECUREPLATFORM,
27662306a36Sopenharmony_ci				   (void *)bioscfg_drv.spm_data.endorsement_key,
27762306a36Sopenharmony_ci				   count, 0);
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	if (!ret) {
28062306a36Sopenharmony_ci		bioscfg_drv.spm_data.mechanism = ENDORSEMENT_KEY;
28162306a36Sopenharmony_ci		hp_set_reboot_and_signal_event();
28262306a36Sopenharmony_ci	}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ciexit_kek:
28562306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.endorsement_key);
28662306a36Sopenharmony_ci	bioscfg_drv.spm_data.endorsement_key = NULL;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	return ret ? ret : count;
28962306a36Sopenharmony_ci}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_cistatic struct kobj_attribute password_spm_endorsement_key = __ATTR_WO(kek);
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistatic ssize_t role_show(struct kobject *kobj, struct kobj_attribute *attr,
29462306a36Sopenharmony_ci			 char *buf)
29562306a36Sopenharmony_ci{
29662306a36Sopenharmony_ci	return sysfs_emit(buf, "%s\n", BIOS_SPM);
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_cistatic struct kobj_attribute password_spm_role = __ATTR_RO(role);
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_cistatic ssize_t auth_token_store(struct kobject *kobj,
30262306a36Sopenharmony_ci				struct kobj_attribute *attr,
30362306a36Sopenharmony_ci				const char *buf, size_t count)
30462306a36Sopenharmony_ci{
30562306a36Sopenharmony_ci	int ret = 0;
30662306a36Sopenharmony_ci	int length;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	length = count;
30962306a36Sopenharmony_ci	if (buf[length - 1] == '\n')
31062306a36Sopenharmony_ci		length--;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	/* allocate space and copy current auth token */
31362306a36Sopenharmony_ci	bioscfg_drv.spm_data.auth_token = kmemdup(buf, length, GFP_KERNEL);
31462306a36Sopenharmony_ci	if (!bioscfg_drv.spm_data.auth_token) {
31562306a36Sopenharmony_ci		ret = -ENOMEM;
31662306a36Sopenharmony_ci		goto exit_token;
31762306a36Sopenharmony_ci	}
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	return count;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ciexit_token:
32262306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.auth_token);
32362306a36Sopenharmony_ci	bioscfg_drv.spm_data.auth_token = NULL;
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	return ret;
32662306a36Sopenharmony_ci}
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_cistatic struct kobj_attribute password_spm_auth_token = __ATTR_WO(auth_token);
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic struct attribute *secure_platform_attrs[] = {
33162306a36Sopenharmony_ci	&password_spm_is_key_enabled.attr,
33262306a36Sopenharmony_ci	&password_spm_signing_key.attr,
33362306a36Sopenharmony_ci	&password_spm_endorsement_key.attr,
33462306a36Sopenharmony_ci	&password_spm_key_mechanism.attr,
33562306a36Sopenharmony_ci	&password_spm_status.attr,
33662306a36Sopenharmony_ci	&password_spm_role.attr,
33762306a36Sopenharmony_ci	&password_spm_auth_token.attr,
33862306a36Sopenharmony_ci	NULL,
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistatic const struct attribute_group secure_platform_attr_group = {
34262306a36Sopenharmony_ci	.attrs = secure_platform_attrs,
34362306a36Sopenharmony_ci};
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_civoid hp_exit_secure_platform_attributes(void)
34662306a36Sopenharmony_ci{
34762306a36Sopenharmony_ci	/* remove secure platform sysfs entry and free key data*/
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.endorsement_key);
35062306a36Sopenharmony_ci	bioscfg_drv.spm_data.endorsement_key = NULL;
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.signing_key);
35362306a36Sopenharmony_ci	bioscfg_drv.spm_data.signing_key = NULL;
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci	kfree(bioscfg_drv.spm_data.auth_token);
35662306a36Sopenharmony_ci	bioscfg_drv.spm_data.auth_token = NULL;
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci	if (bioscfg_drv.spm_data.attr_name_kobj)
35962306a36Sopenharmony_ci		sysfs_remove_group(bioscfg_drv.spm_data.attr_name_kobj,
36062306a36Sopenharmony_ci				   &secure_platform_attr_group);
36162306a36Sopenharmony_ci}
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ciint hp_populate_secure_platform_data(struct kobject *attr_name_kobj)
36462306a36Sopenharmony_ci{
36562306a36Sopenharmony_ci	/* Populate data for Secure Platform Management */
36662306a36Sopenharmony_ci	bioscfg_drv.spm_data.attr_name_kobj = attr_name_kobj;
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	strscpy(bioscfg_drv.spm_data.attribute_name, SPM_STR,
36962306a36Sopenharmony_ci		sizeof(bioscfg_drv.spm_data.attribute_name));
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	bioscfg_drv.spm_data.is_enabled = 0;
37262306a36Sopenharmony_ci	bioscfg_drv.spm_data.mechanism = 0;
37362306a36Sopenharmony_ci	bioscfg_drv.pending_reboot = false;
37462306a36Sopenharmony_ci	update_spm_state();
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	bioscfg_drv.spm_data.endorsement_key = NULL;
37762306a36Sopenharmony_ci	bioscfg_drv.spm_data.signing_key = NULL;
37862306a36Sopenharmony_ci	bioscfg_drv.spm_data.auth_token = NULL;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	return sysfs_create_group(attr_name_kobj, &secure_platform_attr_group);
38162306a36Sopenharmony_ci}
382