Exemple #1
0
Fichier : fs.c Projet : 12019/SOSSE
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);
}
Exemple #3
0
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));

}
Exemple #6
0
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 );
}
Exemple #7
0
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);    
}