Skip to content
Snippets Groups Projects
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;
	}
	
}