blob: 3988d809b56a6ed4acf0c07934e4918bf439ec8d (
plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
package org.bouncycastle.asn1.eac;
import org.bouncycastle.asn1.BERTags;
import org.bouncycastle.asn1.DERApplicationSpecific;
public class EACTags
{
public static final int OBJECT_IDENTIFIER = 0x06;
public static final int COUNTRY_CODE_NATIONAL_DATA = 0x41;
public static final int ISSUER_IDENTIFICATION_NUMBER = 0x02; //0x42;
public static final int CARD_SERVICE_DATA = 0x43;
public static final int INITIAL_ACCESS_DATA = 0x44;
public static final int CARD_ISSUER_DATA = 0x45;
public static final int PRE_ISSUING_DATA = 0x46;
public static final int CARD_CAPABILITIES = 0x47;
public static final int STATUS_INFORMATION = 0x48;
public static final int EXTENDED_HEADER_LIST = 0x4D;
public static final int APPLICATION_IDENTIFIER = 0x4F;
public static final int APPLICATION_LABEL = 0x50;
public static final int FILE_REFERENCE = 0x51;
public static final int COMMAND_TO_PERFORM = 0x52;
public static final int DISCRETIONARY_DATA = 0x53;
public static final int OFFSET_DATA_OBJECT = 0x54;
public static final int TRACK1_APPLICATION = 0x56;
public static final int TRACK2_APPLICATION = 0x57;
public static final int TRACK3_APPLICATION = 0x58;
public static final int CARD_EXPIRATION_DATA = 0x59;
public static final int PRIMARY_ACCOUNT_NUMBER = 0x5A;// PAN
public static final int NAME = 0x5B;
public static final int TAG_LIST = 0x5C;
public static final int HEADER_LIST = 0x5D;
public static final int LOGIN_DATA = 0x5E;
public static final int CARDHOLDER_NAME = 0x20; // 0x5F20;
public static final int TRACK1_CARD = 0x5F21;
public static final int TRACK2_CARD = 0x5F22;
public static final int TRACK3_CARD = 0x5F23;
public static final int APPLICATION_EXPIRATION_DATE = 0x24; // 0x5F24;
public static final int APPLICATION_EFFECTIVE_DATE = 0x25; // 0x5F25;
public static final int CARD_EFFECTIVE_DATE = 0x5F26;
public static final int INTERCHANGE_CONTROL = 0x5F27;
public static final int COUNTRY_CODE = 0x5F28;
public static final int INTERCHANGE_PROFILE = 0x29; // 0x5F29;
public static final int CURRENCY_CODE = 0x5F2A;
public static final int DATE_OF_BIRTH = 0x5F2B;
public static final int CARDHOLDER_NATIONALITY = 0x5F2C;
public static final int LANGUAGE_PREFERENCES = 0x5F2D;
public static final int CARDHOLDER_BIOMETRIC_DATA = 0x5F2E;
public static final int PIN_USAGE_POLICY = 0x5F2F;
public static final int SERVICE_CODE = 0x5F30;
public static final int TRANSACTION_COUNTER = 0x5F32;
public static final int TRANSACTION_DATE = 0x5F33;
public static final int CARD_SEQUENCE_NUMBER = 0x5F34;
public static final int SEX = 0x5F35;
public static final int CURRENCY_EXPONENT = 0x5F36;
public static final int STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP = 0x37; // 0x5F37;
public static final int SIGNATURE = 0x5F37;
public static final int STATIC_INTERNAL_AUTHENTIFICATION_FIRST_DATA = 0x5F38;
public static final int STATIC_INTERNAL_AUTHENTIFICATION_SECOND_DATA = 0x5F39;
public static final int DYNAMIC_INTERNAL_AUTHENTIFICATION = 0x5F3A;
public static final int DYNAMIC_EXTERNAL_AUTHENTIFICATION = 0x5F3B;
public static final int DYNAMIC_MUTUAL_AUTHENTIFICATION = 0x5F3C;
public static final int CARDHOLDER_PORTRAIT_IMAGE = 0x5F40;
public static final int ELEMENT_LIST = 0x5F41;
public static final int ADDRESS = 0x5F42;
public static final int CARDHOLDER_HANDWRITTEN_SIGNATURE = 0x5F43;
public static final int APPLICATION_IMAGE = 0x5F44;
public static final int DISPLAY_IMAGE = 0x5F45;
public static final int TIMER = 0x5F46;
public static final int MESSAGE_REFERENCE = 0x5F47;
public static final int CARDHOLDER_PRIVATE_KEY = 0x5F48;
public static final int CARDHOLDER_PUBLIC_KEY = 0x5F49;
public static final int CERTIFICATION_AUTHORITY_PUBLIC_KEY = 0x5F4A;
public static final int DEPRECATED = 0x5F4B;
public static final int CERTIFICATE_HOLDER_AUTHORIZATION = 0x5F4C;// Not yet defined in iso7816. The allocation is requested
public static final int INTEGRATED_CIRCUIT_MANUFACTURER_ID = 0x5F4D;
public static final int CERTIFICATE_CONTENT = 0x5F4E;
public static final int UNIFORM_RESOURCE_LOCATOR = 0x5F50;
public static final int ANSWER_TO_RESET = 0x5F51;
public static final int HISTORICAL_BYTES = 0x5F52;
public static final int DIGITAL_SIGNATURE = 0x5F3D;
public static final int APPLICATION_TEMPLATE = 0x61;
public static final int FCP_TEMPLATE = 0x62;
public static final int WRAPPER = 0x63;
public static final int FMD_TEMPLATE = 0x64;
public static final int CARDHOLDER_RELATIVE_DATA = 0x65;
public static final int CARD_DATA = 0x66;
public static final int AUTHENTIFICATION_DATA = 0x67;
public static final int SPECIAL_USER_REQUIREMENTS = 0x68;
public static final int LOGIN_TEMPLATE = 0x6A;
public static final int QUALIFIED_NAME = 0x6B;
public static final int CARDHOLDER_IMAGE_TEMPLATE = 0x6C;
public static final int APPLICATION_IMAGE_TEMPLATE = 0x6D;
public static final int APPLICATION_RELATED_DATA = 0x6E;
public static final int FCI_TEMPLATE = 0x6F;
public static final int DISCRETIONARY_DATA_OBJECTS = 0x73;
public static final int COMPATIBLE_TAG_ALLOCATION_AUTHORITY = 0x78;
public static final int COEXISTANT_TAG_ALLOCATION_AUTHORITY = 0x79;
public static final int SECURITY_SUPPORT_TEMPLATE = 0x7A;
public static final int SECURITY_ENVIRONMENT_TEMPLATE = 0x7B;
public static final int DYNAMIC_AUTHENTIFICATION_TEMPLATE = 0x7C;
public static final int SECURE_MESSAGING_TEMPLATE = 0x7D;
public static final int NON_INTERINDUSTRY_DATA_OBJECT_NESTING_TEMPLATE = 0x7E;
public static final int DISPLAY_CONTROL = 0x7F20;
public static final int CARDHOLDER_CERTIFICATE = 0x21; // 0x7F21;
public static final int CV_CERTIFICATE = 0x7F21;
public static final int CARDHOLER_REQUIREMENTS_INCLUDED_FEATURES = 0x7F22;
public static final int CARDHOLER_REQUIREMENTS_EXCLUDED_FEATURES = 0x7F23;
public static final int BIOMETRIC_DATA_TEMPLATE = 0x7F2E;
public static final int DIGITAL_SIGNATURE_BLOCK = 0x7F3D;
public static final int CARDHOLDER_PRIVATE_KEY_TEMPLATE = 0x7F48;
public static final int CARDHOLDER_PUBLIC_KEY_TEMPLATE = 0x49; // 0x7F49;
public static final int CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE = 0x4C; // 0x7F4C;
public static final int CERTIFICATE_CONTENT_TEMPLATE = 0x4E; // 0x7F4E;
public static final int CERTIFICATE_BODY = 0x4E; // 0x7F4E;
public static final int BIOMETRIC_INFORMATION_TEMPLATE = 0x7F60;
public static final int BIOMETRIC_INFORMATION_GROUP_TEMPLATE = 0x7F61;
public static int getTag(int encodedTag)
{
/*
int i;
for (i = 24; i>=0; i-=8) {
if (((0xFF<<i) & tag) != 0)
return (((0xFF<<i) & tag) >> i);
}
return 0;
*/
return decodeTag(encodedTag);
}
public static int getTagNo(int tag)
{
int i;
for (i = 24; i >= 0; i -= 8)
{
if (((0xFF << i) & tag) != 0)
{
return ((~(0xFF << i)) & tag);
}
}
return 0;
}
public static int encodeTag(DERApplicationSpecific spec)
{
int retValue = BERTags.APPLICATION;
boolean constructed = spec.isConstructed();
if (constructed)
retValue |= BERTags.CONSTRUCTED;
int tag = spec.getApplicationTag();
if (tag > 31)
{
retValue |= 0x1F;
retValue <<= 8;
int currentByte = tag & 0x7F;
retValue |= currentByte;
tag >>= 7;
while (tag > 0)
{
retValue |= 0x80;
retValue <<= 8;
currentByte = tag & 0x7F;
tag >>= 7;
}
}
else
{
retValue |= tag;
}
return retValue;
}
public static int decodeTag(int tag)
{
int retValue = 0;
boolean multiBytes = false;
for (int i = 24; i >= 0; i -= 8)
{
int currentByte = tag >> i & 0xFF;
if (currentByte == 0)
{
continue;
}
if (multiBytes)
{
retValue <<= 7;
retValue |= currentByte & 0x7F;
}
else if ((currentByte & 0x1F) == 0x1F)
{
multiBytes = true;
}
else
{
return currentByte & 0x1F; // higher order bit are for DER.Constructed and type
}
}
return retValue;
}
}
|