mbedtls extract CDI key, ROM functions complete.
This commit is contained in:
BIN
trial2/src/RANDFILE
Normal file
BIN
trial2/src/RANDFILE
Normal file
Binary file not shown.
182
trial2/src/ROMfunctions.c
Normal file
182
trial2/src/ROMfunctions.c
Normal file
@@ -0,0 +1,182 @@
|
||||
#include <ROMfunctions.h>
|
||||
|
||||
#define IDENTITY "identity"
|
||||
|
||||
int readUDS(uint8_t* UDSdigest)
|
||||
{
|
||||
//Read 8 bytes from RANDFILE
|
||||
//calculate sha256
|
||||
//print digest
|
||||
|
||||
FILE *fp = NULL;
|
||||
fp = fopen("RANDFILE","rb");
|
||||
if (!fp)
|
||||
{
|
||||
perror("File open failed\n");
|
||||
return -1; //FILENOTFOUND
|
||||
}
|
||||
//uint8_t UDSbuf[UDS_SIZE] = {0}; //{0Xe3,0xc5,0x58,0xaa,0x2f,0xd2,0x19,0x25};
|
||||
uint8_t *UDSbuf = calloc(1, sizeof(uint8_t)*UDS_SIZE);
|
||||
fread(UDSbuf,UDS_SIZE,1,fp);
|
||||
fclose(fp);
|
||||
|
||||
uint8_t UDS_ID[UDS_DGST_SIZE] = {0};
|
||||
|
||||
//mbedtls_sha256_ret( &UDSbuf,sizeof(UDSbuf),UDS_ID,0 );
|
||||
mbedtls_sha256_ret( UDSbuf,UDS_SIZE,UDSdigest,0 );
|
||||
|
||||
|
||||
for (int i = 0; i < UDS_SIZE; i++)
|
||||
printf("%x", UDSbuf[i]);
|
||||
printf(" : fuse secret\n" );
|
||||
|
||||
for (int i = 0; i < UDS_DGST_SIZE; i++)
|
||||
printf("%x", UDSdigest[i]);
|
||||
printf(" : UDS ID\n" );
|
||||
|
||||
free(UDSbuf);
|
||||
return RIOTSUCCESS;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int readFWID(uint8_t* FW_M)
|
||||
{
|
||||
|
||||
// //1. Read functions.c into memory
|
||||
// //2. Calcualte hash into arg
|
||||
|
||||
FILE *fp = NULL;
|
||||
fp = fopen("functions.c", "r");
|
||||
if (!fp)
|
||||
{
|
||||
perror("File open failed\n");
|
||||
return -1; //FILENOTFOUND
|
||||
}
|
||||
|
||||
fseek(fp, 0L, SEEK_END);
|
||||
long FW_size = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
//uint8_t *source = calloc(1,sizeof(uint8_t)*FW_size);
|
||||
uint8_t source[FW_size];
|
||||
|
||||
if (fread(&source, FW_size, 1, fp) < 0)
|
||||
{
|
||||
perror("File read failed");
|
||||
return -1;
|
||||
}
|
||||
fclose(fp);
|
||||
mbedtls_sha256_ret(source,FW_size,FW_M,0 );
|
||||
|
||||
//Print block. delete later
|
||||
// for(int i = 0; i < 100; i++)
|
||||
// printf("%x,",source[i]);
|
||||
// printf("\n");
|
||||
|
||||
//printf("File contnts : %s\n", source);
|
||||
|
||||
for(int i = 0; i < FW_DGST_SIZE; i++)
|
||||
printf("%x",FW_M[i]);
|
||||
printf(" : FW digest\n");
|
||||
|
||||
//free(source);
|
||||
return RIOTSUCCESS;
|
||||
|
||||
}
|
||||
|
||||
int _calcCDID(uint8_t * CDID)
|
||||
{
|
||||
//function should not expose any internal measurements
|
||||
//ONLY CDI should be accessible outside layer 0
|
||||
|
||||
//call readUDS, store measurement
|
||||
//call readFWID, store measurement
|
||||
//calculate Composite Device Identity
|
||||
//return CDI
|
||||
|
||||
uint8_t* UDS_ID = calloc(1,sizeof(uint8_t)*UDS_DGST_SIZE);
|
||||
readUDS(UDS_ID);
|
||||
|
||||
uint8_t* FW_ID = calloc(1,sizeof(uint8_t)*FW_DGST_SIZE);
|
||||
readFWID(FW_ID);
|
||||
|
||||
mbedtls_sha256_context * sha_ctx;
|
||||
mbedtls_sha256_init(sha_ctx);
|
||||
if(mbedtls_sha256_starts_ret(sha_ctx,0) < 0 )
|
||||
{
|
||||
perror("SHA session failed to start\n");
|
||||
mbedtls_sha256_free(sha_ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(mbedtls_sha256_update_ret(sha_ctx, UDS_ID, UDS_DGST_SIZE) < 0)
|
||||
{
|
||||
perror("SHA session update failed\n");
|
||||
mbedtls_sha256_free(sha_ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(mbedtls_sha256_update_ret(sha_ctx, FW_ID, FW_DGST_SIZE) < 0)
|
||||
{
|
||||
perror("SHA session update failed\n");
|
||||
mbedtls_sha256_free(sha_ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(mbedtls_sha256_finish_ret(sha_ctx,CDID) < 0)
|
||||
{
|
||||
perror("SHA session update failed\n");
|
||||
mbedtls_sha256_free(sha_ctx);
|
||||
return -1;
|
||||
}
|
||||
|
||||
for(int i = 0; i < CDI_DGST_SIZE; i++)
|
||||
printf("%x",CDID[i]);
|
||||
printf(" : CDID\n");
|
||||
|
||||
free(UDS_ID);
|
||||
free(FW_ID);
|
||||
return RIOTSUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/*int mbedtls_hkdf( const mbedtls_md_info_t *md,
|
||||
const unsigned char *salt, size_t salt_len,
|
||||
const unsigned char *ikm, size_t ikm_len,
|
||||
const unsigned char *info, size_t info_len,
|
||||
unsigned char *okm, size_t okm_len ); */
|
||||
|
||||
int _calcCDIKEY(uint8_t * CDIKEY)
|
||||
{
|
||||
uint8_t* KEYIN = calloc(1,sizeof(uint8_t)*CDI_DGST_SIZE);
|
||||
_calcCDID(KEYIN);
|
||||
|
||||
for(int i = 0; i < SHA256_DGST_SIZE; i++)
|
||||
printf("%x",KEYIN[i]);
|
||||
printf(" : CDID main\n");
|
||||
|
||||
const mbedtls_md_info_t * md_info;
|
||||
if(!(md_info = mbedtls_md_info_from_type(HKDF_ALG)))
|
||||
{
|
||||
perror("MD alg type def failed\n");
|
||||
return RIOTFAILURE;
|
||||
}
|
||||
|
||||
uint8_t salt[32] = {0x30,0xe2,0x3e,0xcc,0x28,0xc5,0x7b,0xbb,0x38,0x7d,0xe6,0x66,0xbb,
|
||||
0xbe,0x67,0x0a,0xf8,0xf3,0x92,0x0e,0xba,0x68,0xd1,0x56,0xea,0x34,0x3f,0xbc,0x4f,
|
||||
0xf1,0xd9,0x1e};
|
||||
|
||||
mbedtls_hkdf(md_info, salt, sizeof(salt), KEYIN, CDI_DGST_SIZE,
|
||||
IDENTITY, sizeof(IDENTITY), CDIKEY, CDI_KEY_SIZE);
|
||||
|
||||
//mbedtls_hkdf_extract( md_info, salt, sizeof(salt),KEYIN, CDI_DGST_SIZE, CDIKEY);
|
||||
|
||||
for(int i = 0; i < CDI_KEY_SIZE; i++)
|
||||
printf("%x",CDIKEY[i]);
|
||||
printf(" : CDIKEY\n");
|
||||
|
||||
free(KEYIN);
|
||||
|
||||
return RIOTSUCCESS;
|
||||
}
|
||||
BIN
trial2/src/debug
Executable file
BIN
trial2/src/debug
Executable file
Binary file not shown.
42
trial2/src/functions.c
Normal file
42
trial2/src/functions.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include <functions.h>
|
||||
|
||||
//string used to test changing FWID
|
||||
|
||||
|
||||
void ROMprotocol(void)
|
||||
{
|
||||
printf("Hello function!\n");
|
||||
|
||||
//readUDS function
|
||||
|
||||
// uint8_t* UDS_ID = calloc(1,sizeof(uint8_t)*UDS_DGST_SIZE);
|
||||
// readUDS(UDS_ID);
|
||||
|
||||
// for (int i = 0; i < UDS_ID_SIZE; i++)
|
||||
// printf("%x", UDS_ID[i]);
|
||||
// printf(" : UDS ID\n" );
|
||||
|
||||
//readFWID function
|
||||
// uint8_t* FW_ID = calloc(1,sizeof(uint8_t)*FW_DGST_SIZE);
|
||||
// readFWID(FW_ID);
|
||||
|
||||
// for(int i = 0; i < SHA256_DGST_SIZE; i++)
|
||||
// printf("%x",FW_ID[i]);
|
||||
// printf(" : FW_ID\n");
|
||||
|
||||
// uint8_t* CDID = calloc(1,sizeof(uint8_t)*CDI_DGST_SIZE);
|
||||
// _calcCDID(CDID);
|
||||
|
||||
// for(int i = 0; i < SHA256_DGST_SIZE; i++)
|
||||
// printf("%x",CDID[i]);
|
||||
// printf(" : CDID main\n");
|
||||
|
||||
uint8_t * CDIKEY = calloc(1, sizeof(uint8_t)*CDI_KEY_SIZE);
|
||||
_calcCDIKEY(CDIKEY);
|
||||
|
||||
for(int i = 0; i < CDI_KEY_SIZE; i++)
|
||||
printf("%x",CDIKEY[i]);
|
||||
printf(" : CDIKEY main\n");
|
||||
|
||||
return;
|
||||
}
|
||||
BIN
trial2/src/main
Executable file
BIN
trial2/src/main
Executable file
Binary file not shown.
13
trial2/src/main.c
Normal file
13
trial2/src/main.c
Normal file
@@ -0,0 +1,13 @@
|
||||
#include <functions.h>
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
printf("Hello World!\n");
|
||||
// call a function in another file
|
||||
ROMprotocol();
|
||||
|
||||
printf("Successful exit\n");
|
||||
|
||||
return;
|
||||
}
|
||||
23
trial2/src/makefile2
Normal file
23
trial2/src/makefile2
Normal file
@@ -0,0 +1,23 @@
|
||||
CC=gcc
|
||||
IDIR=./include
|
||||
LDIR=./lib
|
||||
ODIR=./out
|
||||
_DEPS = layer2.h layer1.h
|
||||
DEPS = $(pathsbst %,(IDIR)/%,%(_DEPS))
|
||||
|
||||
|
||||
CFLAGS= -I. -T$(IDIR)
|
||||
|
||||
|
||||
.PHONY: all debug clean
|
||||
|
||||
all: main.c layer1.c
|
||||
${CC} -o $(ODIR)/main main.c functions.c ROMfunctions.c -lssl -lcrypto
|
||||
|
||||
debug:
|
||||
${CC} -g -o $(ODIR)/dbg-main main.c functions.c ROMfunctions.c -lssl -lcrypto
|
||||
|
||||
clean:
|
||||
rm -r $(ODIR)/*
|
||||
rm -r ./keys/*
|
||||
|
||||
BIN
trial2/src/obj/ROMfunctions.o
Normal file
BIN
trial2/src/obj/ROMfunctions.o
Normal file
Binary file not shown.
BIN
trial2/src/obj/functions.o
Normal file
BIN
trial2/src/obj/functions.o
Normal file
Binary file not shown.
BIN
trial2/src/obj/main.o
Normal file
BIN
trial2/src/obj/main.o
Normal file
Binary file not shown.
BIN
trial2/src/out/RANDFILE
Normal file
BIN
trial2/src/out/RANDFILE
Normal file
Binary file not shown.
Reference in New Issue
Block a user