high level of auth and some renamings

This commit is contained in:
merlokk 2021-05-29 16:09:34 +03:00
parent f17cbfe412
commit fa85078822
3 changed files with 36 additions and 16 deletions

View file

@ -37,24 +37,24 @@ void CipurseCGetKVV(uint8_t *key, uint8_t *kvv) {
memcpy(kvv, res, CIPURSE_KVV_LENGTH); memcpy(kvv, res, CIPURSE_KVV_LENGTH);
} }
void CipurseClearContext(CipurseContext *ctx) { void CipurseCClearContext(CipurseContext *ctx) {
if (ctx == NULL) if (ctx == NULL)
return; return;
memset(ctx, 0, sizeof(CipurseContext)); memset(ctx, 0, sizeof(CipurseContext));
} }
void CipurseSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key) { void CipurseCSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key) {
if (ctx == NULL) if (ctx == NULL)
return; return;
CipurseClearContext(ctx); CipurseCClearContext(ctx);
ctx->keyId = keyId; ctx->keyId = keyId;
memcpy(ctx->key, key, member_size(CipurseContext, key)); memcpy(ctx->key, key, member_size(CipurseContext, key));
} }
void CipurseSetRandomFromPICC(CipurseContext *ctx, uint8_t *random) { void CipurseCSetRandomFromPICC(CipurseContext *ctx, uint8_t *random) {
if (ctx == NULL) if (ctx == NULL)
return; return;
@ -62,16 +62,25 @@ void CipurseSetRandomFromPICC(CipurseContext *ctx, uint8_t *random) {
memcpy(ctx->rP, random + member_size(CipurseContext, RP), member_size(CipurseContext, rP)); memcpy(ctx->rP, random + member_size(CipurseContext, RP), member_size(CipurseContext, rP));
} }
void CipurseSetRandomHost(CipurseContext *ctx) { void CipurseCSetRandomHost(CipurseContext *ctx) {
memset(ctx->RT, 0x10, member_size(CipurseContext, RT)); memset(ctx->RT, 0x10, member_size(CipurseContext, RT));
memset(ctx->rT, 0x20, member_size(CipurseContext, rT)); memset(ctx->rT, 0x20, member_size(CipurseContext, rT));
} }
void CipurseAuthenticateHost(CipurseContext *ctx) { static void CipurseCFillAuthData(CipurseContext *ctx, uint8_t *authdata) {
memcpy(authdata, ctx->cP, member_size(CipurseContext, cP));
memcpy(&authdata[member_size(CipurseContext, cP)], ctx->RT, member_size(CipurseContext, RT));
memcpy(&authdata[member_size(CipurseContext, cP) + member_size(CipurseContext, RT)], ctx->rT, member_size(CipurseContext, rT));
}
void CipurseCAuthenticateHost(CipurseContext *ctx, uint8_t *authdata) {
if (ctx == NULL) if (ctx == NULL)
return; return;
CipurseSetRandomHost(ctx); CipurseCSetRandomHost(ctx);
CipurseCGenerateK0AndGetCp(ctx); CipurseCGenerateK0AndGetCp(ctx);
CipurseCGenerateCT(ctx->RT, ctx->CT); CipurseCGenerateCT(ctx->RT, ctx->CT);
if (authdata != NULL)
CipurseCFillAuthData(ctx, authdata);
} }

View file

@ -44,12 +44,12 @@ typedef struct CipurseContextS {
uint8_t frameKeyNext[CIPURSE_AES_KEY_LENGTH]; uint8_t frameKeyNext[CIPURSE_AES_KEY_LENGTH];
} CipurseContext; } CipurseContext;
void CipurseClearContext(CipurseContext *ctx); void CipurseCClearContext(CipurseContext *ctx);
void CipurseSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key); void CipurseCSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key);
void CipurseSetRandomFromPICC(CipurseContext *ctx, uint8_t *random); void CipurseCSetRandomFromPICC(CipurseContext *ctx, uint8_t *random);
void CipurseSetRandomHost(CipurseContext *ctx); void CipurseCSetRandomHost(CipurseContext *ctx);
void CipurseAuthenticateHost(CipurseContext *ctx); void CipurseCAuthenticateHost(CipurseContext *ctx, uint8_t *authdata);
void CipurseCGetKVV(uint8_t *key, uint8_t *kvv); void CipurseCGetKVV(uint8_t *key, uint8_t *kvv);

View file

@ -95,24 +95,35 @@ static int CmdHFCipurseAuth(const char *Cmd) {
return PM3_ESOFT; return PM3_ESOFT;
} }
uint8_t keyId = 1;
uint8_t key[] = {0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73}; uint8_t key[] = {0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73};
CipurseContext ctx = {0}; CipurseContext ctx = {0};
CipurseSetKey(&ctx, 1, key); CipurseCSetKey(&ctx, 1, key);
uint8_t kvv[CIPURSE_KVV_LENGTH] = {0}; uint8_t kvv[CIPURSE_KVV_LENGTH] = {0};
CipurseCGetKVV(key, kvv); CipurseCGetKVV(key, kvv);
PrintAndLogEx(INFO, "Key: %s KVV: %s", sprint_hex(key, CIPURSE_AES_KEY_LENGTH), sprint_hex_inrow(kvv, CIPURSE_KVV_LENGTH)); PrintAndLogEx(INFO, "Key: %s KVV: %s", sprint_hex(key, CIPURSE_AES_KEY_LENGTH), sprint_hex_inrow(kvv, CIPURSE_KVV_LENGTH));
// get RP, rP
res = CIPURSEChallenge(buf, sizeof(buf), &len, &sw); res = CIPURSEChallenge(buf, sizeof(buf), &len, &sw);
if (res != 0 || len != 0x16) { if (res != 0 || len != 0x16) {
PrintAndLogEx(ERR, "Cipurse get challenge error. Card returns 0x%04x.", sw); PrintAndLogEx(ERR, "Cipurse get challenge error. Card returns 0x%04x.", sw);
DropField(); DropField();
return PM3_ESOFT; return PM3_ESOFT;
} }
CipurseSetRandomFromPICC(&ctx, buf); CipurseCSetRandomFromPICC(&ctx, buf);
// make auth data
uint8_t authparams[16 + 16 + 6] = {0};
CipurseCAuthenticateHost(&ctx, authparams);
// authenticate
res = CIPURSEMutalAuthenticate(keyId, authparams, sizeof(authparams), buf, sizeof(buf), &len, &sw);
if (res != 0 || sw != 0x9000 || len != 0x16) {
PrintAndLogEx(ERR, "Cipurse authentication error. Card returns 0x%04x.", sw);
DropField();
return PM3_ESOFT;
}
DropField(); DropField();
return PM3_SUCCESS; return PM3_SUCCESS;