bool fs_init( void ) { if( !hal_eeprom_read( (iu8*)&fsstart, FS_START_PTR_ADDR, sizeof(fsstart) ) ) return FALSE; if( !hal_eeprom_read( (iu8*)&fssize, fsstart, sizeof(fssize) ) ) return FALSE; memset( &selected, 0xFF, sizeof(selected) ); return TRUE; }
extern hal_result_t ap_privateData_init(void) { const eEsharinfoPartable_t *ptab; hal_result_t res; ap_private_datastruct_t privdata; //sharinfo_applic_partiontable_get(&ptab); ee_sharedstorage_partiontable_get(&ptab); res = hal_eeprom_read(hal_eeprom_emulatedflash, ptab->strg_priv_application.addr, sizeof(ap_private_datastruct_t), (void*)&privdata); if(hal_res_OK != res) { return(res); } //check if data is valid if(!s_ap_privatedata_isValid(&privdata)) { res = hal_eeprom_write(hal_eeprom_emulatedflash, ptab->strg_priv_application.addr, sizeof(ap_private_datastruct_t), (void*)&privateData_default); if(hal_res_OK != res) { return(res); } } return(hal_res_OK); }
bool fstream_read( S_FSTREAM *fs, iu8 *dst, iu8 len ) { if( !( fstream_test( fs, len ) && hal_eeprom_read( dst, fs->start+fs->pos, len ) ) ) return FALSE; fs->pos+=len; return TRUE; }
extern eEresult_t ee_privatestorage_get(void** pdata, eEbool_t* itiscorrect) { eEresult_t res = ee_res_NOK_generic; hal_result_t halres = hal_res_NOK_generic; // controls upon initialisation. if not initted yet, then we return error if(0 == s_ee_privatestorage_internals.config.size) { return(ee_res_NOK_generic); } halres = hal_eeprom_read(hal_eeprom_emulatedflash, s_ee_privatestorage_internals.eeprom_address, s_ee_privatestorage_internals.dataplussig_sizeof, s_ee_privatestorage_internals.dataplussig_ramfor); if(hal_res_OK != halres) { return(ee_res_NOK_generic); } if(NULL != pdata) { *pdata = s_ee_privatestorage_internals.dataplussig_ramfor; } if(NULL != itiscorrect) { *itiscorrect = s_ee_privatestorage_isvalid(); } return(ee_res_OK); }
extern hal_result_t ap_privateData_get(ap_private_datastruct_t *privdata) { const eEsharinfoPartable_t *ptab; if(NULL == privdata) { return(hal_res_NOK_generic); } //sharinfo_applic_partiontable_get(&ptab); ee_sharedstorage_partiontable_get(&ptab); return( hal_eeprom_read(hal_eeprom_emulatedflash, ptab->strg_priv_application.addr, sizeof(ap_private_datastruct_t), (void*)privdata)); }
void cmd_read( void ) { iu16 i, max=header[4]; iu8 b; /* TODO: check for eeprom range */ /* ACK */ t0_sendAck(); if( !max ) max=256; for( i=0; i<max; i++ ) { if( !hal_eeprom_read( &b, (header[2]<<8)+header[3]+i, 1 ) ) return; /* Data */ hal_io_sendByteT0( b ); } /* SW */ sw_set( SW_OK ); }
int main( void ) #endif { iu8 i, len, b; /* TODO: On error? */ hal_init(); /* Send ATR */ /* TODO: Possible from EEPROM? */ hal_io_sendByteT0( 0x3B ); #if CONF_WITH_LOGGING==1 log_init(); #endif resplen = 0; #if CONF_WITH_TRANSACTIONS==1 /* Commit transactions not yet done. */ /* TODO: On error? */ ta_commit(); #endif /* CONF_WITH_TRANSACTIONS */ /* Initialize FS state in RAM. */ /* TODO: On error? */ fs_init(); #if CONF_WITH_PINAUTH==1 /* Initialize authentication state. */ /* TODO: On error? */ auth_init(); #endif /* CONF_WITH_PINAUTH==1 */ if( !(hal_eeprom_read( &len, ATR_LEN_ADDR, 1 ) && (len<=ATR_MAXLEN)) ) for(;;) {} /* XXX good loop mechanism? what is it anyway */ for( i=1; i<len; i++ ) { if( !hal_eeprom_read( &b, ATR_ADDR+i, 1 ) ) for(;;) {} hal_io_sendByteT0( b ); } /* Command loop */ for(;;) { for( i=0; i<5; i++ ) { header[i] = hal_io_recByteT0(); } #if CONF_WITH_KEYAUTH==1 if( challvalidity ) challvalidity--; #endif /* CONF_WITH_KEYAUTH==1 */ #if CONF_WITH_TRNG==1 hal_rnd_addEntropy(); #endif /* CONF_WITH_TRNG==1 */ if( (header[0]&0xFC)==CLA_PROP ) { switch( header[1]&0xFE ) { #if CONF_WITH_TESTCMDS==1 case INS_WRITE: cmd_write(); break; case INS_READ: cmd_read(); break; #endif /* CONF_WITH_TESTCMDS==1 */ #if CONF_WITH_FUNNY==1 case INS_LED: cmd_led(); break; #endif /* CONF_WITH_FUNNY==1 */ #if CONF_WITH_PINCMDS==1 case INS_CHANGE_PIN: cmd_changeUnblockPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ #if CONF_WITH_CREATECMD==1 case INS_CREATE: cmd_create(); break; #endif /* CONF_WITH_CREATECMD==1 */ #if CONF_WITH_DELETECMD==1 case INS_DELETE: cmd_delete(); break; #endif /* CONF_WITH_DELETECMD==1 */ #if CONF_WITH_KEYCMDS==1 case INS_EXTERNAL_AUTH: cmd_extAuth(); break; #endif /* CONF_WITH_KEYCMDS==1 */ #if CONF_WITH_KEYCMDS==1 case INS_GET_CHALLENGE: cmd_getChallenge(); break; #endif /* CONF_WITH_KEYCMDS==1 */ case INS_GET_RESPONSE: cmd_getResponse(); break; #if CONF_WITH_KEYCMDS==1 case INS_INTERNAL_AUTH: cmd_intAuth(); break; #endif /* CONF_WITH_KEYCMDS==1 */ case INS_READ_BINARY: cmd_readBinary(); break; case INS_SELECT: cmd_select(); break; #if CONF_WITH_PINCMDS==1 case INS_UNBLOCK_PIN: cmd_changeUnblockPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ case INS_UPDATE_BINARY: cmd_updateBinary(); break; #if CONF_WITH_KEYCMDS==1 case INS_VERIFY_KEY: cmd_verifyKeyPIN(); break; #endif /* CONF_WITH_KEYCMDS==1 */ #if CONF_WITH_PINCMDS==1 case INS_VERIFY_PIN: cmd_verifyKeyPIN(); break; #endif /* CONF_WITH_PINCMDS==1 */ default: t0_sendWord( SW_WRONG_INS ); } } else { t0_sendWord( SW_WRONG_CLA ); } #if CONF_WITH_TRNG==1 hal_rnd_addEntropy(); #endif /* Return the SW in sw */ t0_sendSw(); } }
extern eEresult_t ee_privatestorage_init(ee_privatestorage_cfg_t* cfg, void** pdata) { eEresult_t res = ee_res_NOK_generic; const eEsharinfoPartable_t *ptab; hal_result_t halres = hal_res_NOK_generic; uint16_t tmp16 = 0; // some controls upon validity of the params if((NULL == cfg) || (0 == cfg->size)) { return(ee_res_NOK_generic); } // controls upon a previous call, so that we dont call it twice if(0 != s_ee_privatestorage_internals.config.size) { return(ee_res_NOK_generic); } if(NULL != pdata) { *pdata = NULL; } // ok, params are ok. and it is first call. let's go on memcpy(&s_ee_privatestorage_internals.config, cfg, sizeof(ee_privatestorage_cfg_t)); ee_sharedstorage_partiontable_get(&ptab); s_ee_privatestorage_internals.eeprom_address = ptab->strg_priv_application.addr; // for data i use 4-bytes alignment tmp16 = (s_ee_privatestorage_internals.config.size + 3)/4; tmp16 *= 4; s_ee_privatestorage_internals.dataplussig_sigoff = tmp16; s_ee_privatestorage_internals.dataplussig_sizeof = s_ee_privatestorage_internals.dataplussig_sigoff + 4; // add 4 bytes for the sig at the end. s_ee_privatestorage_internals.tmpsigvalue = 0; s_ee_privatestorage_internals.dataplussig_ramfor = calloc(s_ee_privatestorage_internals.dataplussig_sizeof, 1); if(NULL == s_ee_privatestorage_internals.dataplussig_ramfor) { return(ee_res_NOK_generic); } // read data plus sig halres = hal_eeprom_read(hal_eeprom_emulatedflash, s_ee_privatestorage_internals.eeprom_address, s_ee_privatestorage_internals.dataplussig_sizeof, s_ee_privatestorage_internals.dataplussig_ramfor); if(hal_res_OK != halres) { return(ee_res_NOK_generic); } // check if data is valid if(ee_false == s_ee_privatestorage_isvalid()) { // reset data if(NULL != s_ee_privatestorage_internals.config.defval) { memcpy(s_ee_privatestorage_internals.dataplussig_ramfor, s_ee_privatestorage_internals.config.defval, s_ee_privatestorage_internals.config.size); } else { memset(s_ee_privatestorage_internals.dataplussig_ramfor, 0, s_ee_privatestorage_internals.config.size); } // now compute the signature and set it tmp16 = s_ee_privatestorage_compute_signature(); s_ee_privatestorage_set_signature(tmp16); // now i write in eeprom halres = hal_eeprom_write(hal_eeprom_emulatedflash, s_ee_privatestorage_internals.eeprom_address, s_ee_privatestorage_internals.dataplussig_sizeof, s_ee_privatestorage_internals.dataplussig_ramfor); if(hal_res_OK != res) { return(ee_res_NOK_generic); } } if(NULL != pdata) { *pdata = s_ee_privatestorage_internals.dataplussig_ramfor; } return(ee_res_OK); }