diff --git a/trial1/layer1.c b/trial1/layer1.c index 5845e53..59dcacb 100644 --- a/trial1/layer1.c +++ b/trial1/layer1.c @@ -1,10 +1,13 @@ #include "layer1.h" -//Layer 1 functions +//ROM functions #define UDSFILE "./out/RANDFILE" #define UDSsize 8 //bytes +#define FW_file "layer1.c" +#define FW_size 1000 +////need to find a way to determine file size using BIO tools int createUDS() @@ -80,53 +83,128 @@ int readFWID(uint8_t * FW_M) //1. Read layer1.c into memory //2. Calcualte hash into arg - printf("in readFWID\n"); - - uint8_t * source = NULL; + //uint8_t * source; + //FW_size shoudl not be static. + //Use indefinite array or determine FW_size + uint8_t* source = calloc(1,sizeof(uint8_t)*(FW_size)); BIO *fp, *out; - int filesize = 0; + int buf_size = 0; int i; out = BIO_new_fp(stdout, BIO_NOCLOSE); - fp = BIO_new_file("layer1.c", "r"); -printf("in 2readFWID\n"); + fp = BIO_new_file(FW_file, "r"); + if(!fp) perror("Opening FW to read failed\n"); if(BIO_eof(fp)) perror("File empty\n"); -printf("in 3readFWID\n"); //SEG FAULT! - while(!BIO_eof(fp)) - { - BIO_read(fp, source[filesize], 1); - filesize++; //filesize includes EOF - } -printf("in 4readFWID\n"); - if(SHA256(source, filesize -1, FW_M) == NULL) + + while(!BIO_eof(fp) && (buf_size < FW_size)) + { + BIO_read(fp, source[buf_size], 1); + buf_size++; //buf_size includes EOF + //break; + } + + if(SHA256(source, buf_size -1, FW_M) == NULL) perror("FW measurement failed\n"); //print block -printf("in 5readFWID\n"); BIO_printf(out,"FW digest : "); for(i = 0; i < SHA256_dig_t; i++) BIO_printf(out,"%x",FW_M[i]); BIO_printf(out, "\n"); - //free(source); + free(source); BIO_free(fp); BIO_free(out); return 1; } -// int calcCDID(uint8_t * UDS_M, uint8_t * FW_M, uint8_t * CDID) -// { -// //0. internally call readUDS and readFWID? abstraction of UDS against layer2 +int calcCDID(uint8_t * UDS_M, uint8_t * FW_M, uint8_t * CDID) +{ + //0. internally call readUDS and readFWID? abstraction of UDS against layer2 -// //1. create sha256 context -// //2. add UDS hash -// //3. add FW hash -// //4. calc composite hash into CDID arg -// return 1; -// } \ No newline at end of file + //1. create sha256 context + //2. add UDS hash + //3. add FW hash + //4. calc composite hash into CDID arg + + BIO * out = BIO_new_fp(stdout, BIO_NOCLOSE); + + SHA256_CTX *ctx; + if(!SHA256_Init(ctx)) + perror("SHA init failed\n"); + + if(!SHA256_Update(ctx, UDS_M, UDSsize)) + perror("SHA update failed\n"); + if(!SHA256_Update(ctx, FW_M, FW_size)) + perror("SHA update2 failed\n"); + + if(!SHA256_Final(CDID, ctx)) + perror("SHA close failed\n"); + + //print block + + BIO_printf(out,"UDID_M : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",UDS_M[i]); + BIO_printf(out, "\n"); + + BIO_printf(out,"FWID_M : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",FW_M[i]); + BIO_printf(out, "\n"); + + BIO_printf(out,"CDI : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",CDID[i]); + BIO_printf(out, "\n"); + BIO_free(out); + + return 1; +} + +int _calcCDID(uint8_t * _CDID) +{ + + BIO * out = BIO_new_fp(stdout, BIO_NOCLOSE); + BIO_printf(out, "\n");BIO_printf(out, "\n");BIO_printf(out, "\n"); + + //step 1 : Derive Device ID + uint8_t* UDS_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); + readUDS(UDS_ID); + + //step 2 : Derive Firmware ID + uint8_t* FW_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); + readFWID(FW_ID); + + //step3 : call calcCDID + calcCDID(UDS_ID,FW_ID,_CDID); + calcCDID(UDS_ID,FW_ID,_CDID); + calcCDID(UDS_ID,FW_ID,_CDID); + + + + BIO_printf(out,"_UDID : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",UDS_ID[i]); + BIO_printf(out, "\n"); + + BIO_printf(out,"_FWID : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",FW_ID[i]); + BIO_printf(out, "\n"); + + + BIO_printf(out,"_CDI : "); + for(int i = 0; i < SHA256_dig_t; i++) + BIO_printf(out,"%x",_CDID[i]); + BIO_printf(out, "\n"); + BIO_free(out); + + return 1; +} \ No newline at end of file diff --git a/trial1/layer1.h b/trial1/layer1.h index 58e26a1..7587675 100644 --- a/trial1/layer1.h +++ b/trial1/layer1.h @@ -11,5 +11,5 @@ int readUDS(uint8_t* UDSdigest); int createUDS(); int readFWID(uint8_t * FW_M); int calcCDID(uint8_t * UDS_M, uint8_t * FW_M, uint8_t * CDID); - +int _calcCDID(uint8_t * CDID); diff --git a/trial1/layer2.c b/trial1/layer2.c index 21c77fd..0a248b7 100644 --- a/trial1/layer2.c +++ b/trial1/layer2.c @@ -9,19 +9,31 @@ void startProtocol() uint8_t* UDS_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); readUDS(UDS_ID); + // for(int i = 0; i < SHA256_dig_t; i++) + // printf("%x",UDS_ID[i]); + // printf("\n"); + //step 2 : Derive Firmware ID uint8_t* FW_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); readFWID(FW_ID); + // for(int i = 0; i < SHA256_dig_t; i++) + // printf("%x",FW_ID[i]); + // printf("\n"); - // //setp 3 : Derive Composite Device ID - // uint8_t* CD_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); - // calcCDID(CD_ID); + //setp 3 : Derive Composite Device ID + uint8_t* CD_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); + calcCDID(UDS_ID,FW_ID,CD_ID); + + + uint8_t* _CD_ID = calloc(1,sizeof(uint8_t)*SHA256_dig_t); + _calcCDID(_CD_ID); //End block free(UDS_ID); free(FW_ID); - // free(CD_ID); + free(CD_ID); + free(_CD_ID); } diff --git a/trial1/out/main2 b/trial1/out/main2 index 23b30d6..57c11f5 100755 Binary files a/trial1/out/main2 and b/trial1/out/main2 differ