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