mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-22 14:23:50 -07:00
add crypto sketch
This commit is contained in:
parent
ce2b22a6a7
commit
90f930659c
4 changed files with 74 additions and 14 deletions
|
@ -558,6 +558,7 @@ SRCS = aiddesfire.c \
|
||||||
fido/cbortools.c \
|
fido/cbortools.c \
|
||||||
fido/fidocore.c \
|
fido/fidocore.c \
|
||||||
cipurse/cipursecore.c \
|
cipurse/cipursecore.c \
|
||||||
|
cipurse/cipursecrypto.c \
|
||||||
fileutils.c \
|
fileutils.c \
|
||||||
flash.c \
|
flash.c \
|
||||||
generator.c \
|
generator.c \
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// CIPURSE crypto primitives
|
// CIPURSE crypto primitives
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
#include "cipursecore.h"
|
#include "cipursecrypto.h"
|
||||||
|
|
||||||
#include "commonutil.h" // ARRAYLEN
|
#include "commonutil.h" // ARRAYLEN
|
||||||
#include "comms.h" // DropField
|
#include "comms.h" // DropField
|
||||||
|
@ -20,4 +20,46 @@
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
|
void CipurseClearContext(CipurseContext *ctx) {
|
||||||
|
if (ctx == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(ctx, 0, sizeof(CipurseContext));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CipurseSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key) {
|
||||||
|
if (ctx == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CipurseClearContext(ctx);
|
||||||
|
|
||||||
|
ctx->keyId = keyId;
|
||||||
|
memcpy(ctx->key, key, member_size(CipurseContext, key));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CipurseSetRandomFromPICC(CipurseContext *ctx, uint8_t *random) {
|
||||||
|
if (ctx == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memcpy(ctx->RP, random, member_size(CipurseContext, RP));
|
||||||
|
memcpy(ctx->rP, random + member_size(CipurseContext, RP), member_size(CipurseContext, rP));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CipurseSetRandomHost(CipurseContext *ctx) {
|
||||||
|
memset(ctx->RT, 0x10, member_size(CipurseContext, RT));
|
||||||
|
memset(ctx->rT, 0x20, member_size(CipurseContext, rT));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CipurseAuthenticateHost(CipurseContext *ctx) {
|
||||||
|
if (ctx == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* RT = Random.nextBytes(16)
|
||||||
|
rT = Random.nextBytes(6)
|
||||||
|
|
||||||
|
val cP = generateK0AndGetCp(key, RP, rP, RT, rT) ?: return Pair(null, null)
|
||||||
|
|
||||||
|
return Pair(cP + RT + rT, generateCT(RT))*/
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -13,28 +13,37 @@
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
|
#define member_size(type, member) sizeof(((type *)0)->member)
|
||||||
|
|
||||||
enum CipurseChannelSecurityLevel {
|
enum CipurseChannelSecurityLevel {
|
||||||
CPSNone,
|
CPSNone,
|
||||||
CPSPlain,
|
CPSPlain,
|
||||||
CPSMACed,
|
CPSMACed,
|
||||||
CPSEncrypted
|
CPSEncrypted
|
||||||
}
|
};
|
||||||
|
|
||||||
struct CipurseSession {
|
typedef struct CipurseContextS {
|
||||||
uint8_t keyId,
|
uint8_t keyId;
|
||||||
uint8_t[16] key,
|
uint8_t key[16];
|
||||||
|
|
||||||
uint8_t[16] RP,
|
uint8_t RP[16];
|
||||||
uint8_t[6] rP,
|
uint8_t rP[6];
|
||||||
uint8_t[16] RT,
|
uint8_t RT[16];
|
||||||
uint8_t[6] rT,
|
uint8_t rT[6];
|
||||||
|
|
||||||
uint8_t[16] k0,
|
uint8_t frameKey0[16];
|
||||||
uint8_t[16] cP,
|
uint8_t cP[16];
|
||||||
|
|
||||||
uint8_t[16] frameKey,
|
uint8_t frameKey[16];
|
||||||
uint8_t[16] frameKey1
|
uint8_t frameKeyNext[16];
|
||||||
}
|
} CipurseContext;
|
||||||
|
|
||||||
|
void CipurseClearContext(CipurseContext *ctx);
|
||||||
|
void CipurseSetKey(CipurseContext *ctx, uint8_t keyId, uint8_t *key);
|
||||||
|
void CipurseSetRandomFromPICC(CipurseContext *ctx, uint8_t *random);
|
||||||
|
void CipurseSetRandomHost(CipurseContext *ctx);
|
||||||
|
|
||||||
|
void CipurseAuthenticateHost(CipurseContext *ctx);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "cliparser.h"
|
#include "cliparser.h"
|
||||||
#include "cmdhfcipurse.h"
|
#include "cmdhfcipurse.h"
|
||||||
#include "cipurse/cipursecore.h"
|
#include "cipurse/cipursecore.h"
|
||||||
|
#include "cipurse/cipursecrypto.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
#include "cmdhf14a.h"
|
#include "cmdhf14a.h"
|
||||||
#include "cmdtrace.h"
|
#include "cmdtrace.h"
|
||||||
|
@ -94,12 +95,19 @@ static int CmdHFCipurseAuth(const char *Cmd) {
|
||||||
return PM3_ESOFT;
|
return PM3_ESOFT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t key[] = {0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73};
|
||||||
|
CipurseContext ctx = {0};
|
||||||
|
CipurseSetKey(&ctx, 1, key);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DropField();
|
DropField();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue