Hi Kan
You said I could create user with that special "index" with ssscli tool, which I did. Here are my commands again:
ssscli policy userid RESERVED_ID_FACTORY_RESET 7FFF0205
ssscli set bin --policy_name RESERVED_ID_FACTORY_RESET 7FFF0205 MYSECRETUSER
Here is the output of the command you suggested:
simw-top_build/raspbian_native_se050_t1oi2c/bin/se05x_Delete_and_test_provision
App :INFO :PlugAndTrust_v04.02.00_20220524
App :INFO :Running simw-top_build/raspbian_native_se050_t1oi2c/bin/se05x_Delete_and_test_provision
App :INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
App :INFO :Using default PlatfSCP03 keys. You can use keys from file using ENV=EX_SSS_BOOT_SCP03_PATH
sss :INFO :atr (Len=35)
01 A0 00 00 03 96 04 03 E8 00 FE 02 0B 03 E8 00
01 00 00 00 00 64 13 88 0A 00 65 53 45 30 35 31
00 00 00
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
hostLib:WARN :Error in erasing ObjId=0x0000FA3E (Others)
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
hostLib:WARN :Error in erasing ObjId=0x000003E3 (Others)
App :ERROR:# se05x_Delete_and_test_provision !!! Only for testing. NOT FOR PRODUCTION USE!!!!
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
hostLib:WARN :Error in erasing ObjId=0x0000FA3E (Others)
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
hostLib:WARN :Error in erasing ObjId=0x000003E3 (Others)
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
App :INFO :Se05x_API_CreateCurve_prime256v1 status = 6985
App :WARN :ECC_ATTESTATION_KEY_ID Object already exists
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
App :INFO :Se05x_API_WriteRSAKey (Attestation key - RSA_ATTESTATION_KEY_ID) status = 6985
sss :WARN :nxEnsure:'ret == SM_OK' failed. At Line:6971 Function:sss_se05x_TXn
App :INFO :Se05x_API_CreateCurve_prime256v1 status = 6985
App :WARN :kSE05x_AppletResID_FACTORY_RESET Object already exists
App :INFO :kSE05x_AppletResID_PLATFORM_SCP status = 9000
App :INFO :kEX_SSS_ObjID_UserID_Auth status = 9000
App :INFO :kEX_SSS_ObjID_UserID_Auth + 0x10 status = 9000
App :INFO :kSE05x_AppletResID_RESTRICT status = 9000
App :INFO :kEX_SSS_ObjID_APPLETSCP03_Auth status = 9000
App :INFO :kEX_SSS_ObjID_APPLETSCP03_Auth + 0x10 status = 9000
App :INFO :kSE05x_ECCurve_NIST_P256 status = 9000
App :INFO :kSE05x_ECCurve_NIST_P256 + 0x10 status = 9000
App :INFO :ex_sss Finished
I do not really see how it helps. It has created a lot of mess, which I'd also like to delete now.
I am pasting my relevant code again:
#include <err.h>
#include <sm_const.h>
#include <ex_sss_boot.h>
#include <fsl_sss_api.h>
#include <se05x_APDU_apis.h>
#include <fsl_sss_se05x_apis.h>
int
main(int argc, char **argv)
{
sss_status_t status;
smStatus_t sm_status;
ex_sss_boot_ctx_t ctx = { 0 };
sss_object_t sobj = { 0 };
SE_Connect_Ctx_t eraseAuthCtx = { 0 };
const uint8_t userid_value[] = { 'M','Y','S','E','C','R','E','T','U','S','E','R' };
pSe05xSession_t coresesh = &((sss_se05x_session_t*)&ctx.session)->s_ctx;
warnx("Make sure you have created a special user, if not, issue:");
warnx("ssscli policy userid RESERVED_ID_FACTORY_RESET 7FFF0205");
warnx("ssscli set bin --policy_name RESERVED_ID_FACTORY_RESET 7FFF0205 MYSECRETUSER");
status = ex_sss_boot_open(&ctx, NULL);
if (status != kStatus_SSS_Success) errx(1, "ex_sss_boot_se05x_open() failed");
status = sss_key_object_init(&sobj, &ctx.host_ks);
if (status != kStatus_SSS_Success) errx(1, "sss_key_object_init() failed");
status = sss_key_object_allocate_handle(&sobj, 0x3A8D0E, // RANDOM
kSSS_KeyPart_Default,
kSSS_CipherType_UserID,
sizeof(userid_value),
kKeyObject_Mode_Transient);
if (status != kStatus_SSS_Success) errx(1, "sss_key_object_allocate_handle() failed");
status = sss_key_store_set_key(&ctx.host_ks, &sobj, userid_value,
sizeof(userid_value), sizeof(userid_value) * 8,
NULL, 0);
if (status != kStatus_SSS_Success) errx(1, "sss_key_store_set_key() failed");
/*
sm_status = Se05x_API_WriteUserID(coresesh, NULL, SE05x_MaxAttemps_NA,
kSE05x_AppletResID_FACTORY_RESET,
userid_value, sizeof(userid_value),
kSE05x_AttestationType_AUTH);
if (sm_status != SM_OK) errx(1, "Se05x_API_WriteUserID() failed %x", sm_status);
*/
eraseAuthCtx.auth.ctx.idobj.pObj = &sobj;
//eraseAuthCtx.tunnelCtx = ctx.se05x_open_ctx.tunnelCtx; //&retunnel;
eraseAuthCtx.connType = ctx.se05x_open_ctx.connType; //kType_SE_Conn_Type_Channel;
eraseAuthCtx.portName = ctx.se05x_open_ctx.portName; //NULL
eraseAuthCtx.auth.authType = kSSS_AuthType_ID;
sss_session_close(&ctx.session);
status = sss_session_open(&ctx.session, kType_SSS_SE_SE05x,
kSE05x_AppletResID_FACTORY_RESET,
kSSS_ConnectionType_Password, &eraseAuthCtx);
if (status != kStatus_SSS_Success) errx(1, "sss_session_open() failed");
sm_status = Se05x_API_DeleteAll(coresesh);
if (sm_status != SM_OK) errx(1, "Se05x_API_DeleteAll() failed %x", sm_status);
return 0;
}
Just to re-iterate again: Se05x_API_WriteUserID() commented out because it fails - the ID exists. The second sss_session_open() in the code above fails with SM_ERR_COMMAND_NOT_ALLOWED.
So, my understanding is that ssscli does NOT work properly - it should never be used for anything. We do not know what it has done, but the required object ID is occupied. Could you please discuss it internally - I need to reset my SE050 to the state it had on arrival: delete everything except ORIGIN_PROVISIONED. Could you just give me some code that does it.