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/fidocore.c \
|
||||
cipurse/cipursecore.c \
|
||||
cipurse/cipursecrypto.c \
|
||||
fileutils.c \
|
||||
flash.c \
|
||||
generator.c \
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// CIPURSE crypto primitives
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "cipursecore.h"
|
||||
#include "cipursecrypto.h"
|
||||
|
||||
#include "commonutil.h" // ARRAYLEN
|
||||
#include "comms.h" // DropField
|
||||
|
@ -20,4 +20,46 @@
|
|||
#include "ui.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"
|
||||
|
||||
#define member_size(type, member) sizeof(((type *)0)->member)
|
||||
|
||||
enum CipurseChannelSecurityLevel {
|
||||
CPSNone,
|
||||
CPSPlain,
|
||||
CPSMACed,
|
||||
CPSEncrypted
|
||||
}
|
||||
};
|
||||
|
||||
struct CipurseSession {
|
||||
uint8_t keyId,
|
||||
uint8_t[16] key,
|
||||
typedef struct CipurseContextS {
|
||||
uint8_t keyId;
|
||||
uint8_t key[16];
|
||||
|
||||
uint8_t[16] RP,
|
||||
uint8_t[6] rP,
|
||||
uint8_t[16] RT,
|
||||
uint8_t[6] rT,
|
||||
uint8_t RP[16];
|
||||
uint8_t rP[6];
|
||||
uint8_t RT[16];
|
||||
uint8_t rT[6];
|
||||
|
||||
uint8_t[16] k0,
|
||||
uint8_t[16] cP,
|
||||
uint8_t frameKey0[16];
|
||||
uint8_t cP[16];
|
||||
|
||||
uint8_t[16] frameKey,
|
||||
uint8_t[16] frameKey1
|
||||
}
|
||||
uint8_t frameKey[16];
|
||||
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 "cmdhfcipurse.h"
|
||||
#include "cipurse/cipursecore.h"
|
||||
#include "cipurse/cipursecrypto.h"
|
||||
#include "ui.h"
|
||||
#include "cmdhf14a.h"
|
||||
#include "cmdtrace.h"
|
||||
|
@ -94,12 +95,19 @@ static int CmdHFCipurseAuth(const char *Cmd) {
|
|||
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);
|
||||
if (res != 0 || len != 0x16) {
|
||||
PrintAndLogEx(ERR, "Cipurse get challenge error. Card returns 0x%04x.", sw);
|
||||
DropField();
|
||||
return PM3_ESOFT;
|
||||
}
|
||||
CipurseSetRandomFromPICC(&ctx, buf);
|
||||
|
||||
|
||||
|
||||
|
||||
DropField();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue