-
Notifications
You must be signed in to change notification settings - Fork 1
/
ISO7816_Applet_Communication.c
86 lines (71 loc) · 1.81 KB
/
ISO7816_Applet_Communication.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "Universal.h"
#include "iso7816.h"
#define HW_AES_ENCRYPT 0x03
#define HW_AES_DECRYPT 0x04
#define HW_RSA_ENCRYPT 0x05
#define HW_RSA_DECRYPT 0x06
// todo test
uint8_t Retrieve_Message(uint8_t * Message, uint8_t count) {
if(SC_Response_Count<count) {
return 0;
}
uint8_t offset=0;
if(SC_ATR_Get_Protocol_Type()==0x01) {
offset=1;
}
else {
offset=0;
}
for(uint8_t i=0; i<count; i++) {
Message[i] = SC_Response[SC_Response_Count-count-2-offset+i];
}
return 1;
}
uint8_t ED_SC_Message_Wrap(uint8_t * message) {
//reciever response //retrieve message
if(SC_ATR_Get_Protocol_Type()==0) {
uint8_t count = Prepare_Standard_APDU(17, message);
Send_And_Recieve(count);
}
else {
uint8_t count = Prepare_Standard_APDU_Block(17, message);
Send_And_Recieve(count);
}
//todo retransmit if no succesfull// for now drop the message
if(Check_Succesfull_Execution_of_Instruction()) {
Segger_write_string("Encrypt/decrypt operations succesful.\n");
return 1;
}
Segger_write_string("Encrypt/decrypt operations NOT succesful!\n");
return 0;
}
void HW_AES_Encode(uint8_t * message, uint8_t value) {
//prepare array 16+1 padding
message[0]=HW_AES_ENCRYPT;
for(uint8_t i=0; i<16; i++){
message[i+1]=0x00;
}
message[1]=value;
if(ED_SC_Message_Wrap(message)) {
//retrieve message
Retrieve_Message(message, 17); //12
#ifdef DEBUG_RETRIEVE_BUFFER
Segger_write_string("\n\n\t\t Retrieved array:");
Print_Array(16, message);
#endif
}
}
uint8_t HW_AES_Decode(uint8_t * message) {
//prepare selector
message[0]=HW_AES_DECRYPT;
if(ED_SC_Message_Wrap(message)) {
Retrieve_Message(message, 16); //12
#ifdef DEBUG_RETRIEVE_BUFFER
Segger_write_string("\n\n\t\t Retrieved array:");
Print_Array(16, message);
#endif
//return valuse
return message[0];
}
return 0xFF;
}