main.c 1.76 KiB
#include "common.h"
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include "rng.h"
#include "ISO7816-card.h"
#include "applications/applications.h"
#define INS_APPLICATION_MANAGER 0xA4
#define APPLICATION_MANAGER_P1_SELECT 0x04
application_t applications[NUM_APPLICATIONS] = APPLICATIONS;
uint16_t main_handle_adpu(ISO7816_APDU_Header* header,
uint8_t* payload,
uint8_t payload_length,
uint8_t* answer_buffer,
uint8_t* answer_length);
uint8_t current_application = 0xFF;
int main(void){
//DDRB = (1 << 5) | (1 << 7);
// ISO7816_init();
ISO7816_set_apdu_handler(main_handle_adpu);
ISO7816_sendATR();
sei();
rnd_init();
for (uint8_t i = 0; i < NUM_APPLICATIONS; i++){
applications[i].init();
}
while(1){
if (ISO7816_data_available()){
ISO7816_process();
}
}
}
uint16_t main_handle_adpu(ISO7816_APDU_Header* header,
uint8_t* payload,
uint8_t payload_length,
uint8_t* answer_buffer,
uint8_t* answer_length){
*answer_length = 0;
if (header->instruction == INS_APPLICATION_MANAGER){
if (header->param1 == APPLICATION_MANAGER_P1_SELECT){
for (uint8_t i = 0; i < NUM_APPLICATIONS; i++){
if (memcmp(applications[i].aid, payload, sizeof(application_id_t)) == 0){
if (current_application != 0xFF) applications[current_application].deselect();
ISO7816_set_apdu_handler(applications[i].select());
return APDU_RESULT_OK;
}
}
return ISO7816_STATUS_ERR_FILE_NOT_FOUND;
} else {
return ISO7816_STATUS_ERR_WRONG_P1P2;
}
} else if (header->instruction == 0x11){
for (uint8_t i = 0; i < 32; i++){
answer_buffer[i] = rnd_get_byte();
}
*answer_length = 32;
return APDU_RESULT_OK;
} else {
return ISO7816_STATUS_ERR_INS_NOT_SUPPORTED;
}
}