1 package org.bouncycastle.asn1.eac;
2 
3 import org.bouncycastle.asn1.ASN1ApplicationSpecific;
4 import org.bouncycastle.asn1.BERTags;
5 
6 public class EACTags
7 {
8     public static final int COUNTRY_CODE_NATIONAL_DATA = 0x01;
9     public static final int ISSUER_IDENTIFICATION_NUMBER = 0x02; //0x42;
10     public static final int CARD_SERVICE_DATA = 0x03;
11     public static final int INITIAL_ACCESS_DATA = 0x04;
12     public static final int CARD_ISSUER_DATA = 0x05;
13     public static final int PRE_ISSUING_DATA = 0x06;
14     public static final int CARD_CAPABILITIES = 0x07;
15     public static final int STATUS_INFORMATION = 0x08;
16     public static final int EXTENDED_HEADER_LIST = 0x0D;
17     public static final int APPLICATION_IDENTIFIER = 0x0F;
18     public static final int APPLICATION_LABEL = 0x10;
19     public static final int FILE_REFERENCE = 0x11;           // 0x51
20     public static final int COMMAND_TO_PERFORM = 0x12;
21     public static final int DISCRETIONARY_DATA = 0x13;
22     public static final int OFFSET_DATA_OBJECT = 0x14;
23     public static final int TRACK1_APPLICATION = 0x16;
24     public static final int TRACK2_APPLICATION = 0x17;
25     public static final int TRACK3_APPLICATION = 0x18;
26     public static final int CARD_EXPIRATION_DATA = 0x19;
27     public static final int PRIMARY_ACCOUNT_NUMBER = 0x1A;// PAN
28     public static final int NAME = 0x1B;
29     public static final int TAG_LIST = 0x1C;
30     public static final int HEADER_LIST = 0x1D;
31     public static final int LOGIN_DATA = 0x1E;
32     public static final int CARDHOLDER_NAME = 0x20; // 0x5F20;
33     public static final int TRACK1_CARD = 0x21;
34     public static final int TRACK2_CARD = 0x22;
35     public static final int TRACK3_CARD = 0x23;
36     public static final int APPLICATION_EXPIRATION_DATE = 0x24; // 0x5F24;
37     public static final int APPLICATION_EFFECTIVE_DATE = 0x25; // 0x5F25;
38     public static final int CARD_EFFECTIVE_DATE = 0x26;
39     public static final int INTERCHANGE_CONTROL = 0x27;
40     public static final int COUNTRY_CODE = 0x28;
41     public static final int INTERCHANGE_PROFILE = 0x29; // 0x5F29;
42     public static final int CURRENCY_CODE = 0x2A;
43     public static final int DATE_OF_BIRTH = 0x2B;
44     public static final int CARDHOLDER_NATIONALITY = 0x2C;
45     public static final int LANGUAGE_PREFERENCES = 0x2D;
46     public static final int CARDHOLDER_BIOMETRIC_DATA = 0x2E;
47     public static final int PIN_USAGE_POLICY = 0x2F;
48     public static final int SERVICE_CODE = 0x30;
49     public static final int TRANSACTION_COUNTER = 0x32;
50     public static final int TRANSACTION_DATE = 0x33;
51     public static final int CARD_SEQUENCE_NUMBER = 0x34;
52     public static final int SEX = 0x35;
53     public static final int CURRENCY_EXPONENT = 0x36;
54     public static final int STATIC_INTERNAL_AUTHENTIFICATION_ONE_STEP = 0x37;    // 0x5F37;
55     public static final int SIGNATURE = 0x37;                                    // 0x5F37
56     public static final int STATIC_INTERNAL_AUTHENTIFICATION_FIRST_DATA = 0x38;  // 0x5F38
57     public static final int STATIC_INTERNAL_AUTHENTIFICATION_SECOND_DATA = 0x39; // 0x5F39
58     public static final int DYNAMIC_INTERNAL_AUTHENTIFICATION = 0x3A;            // 0x5F3A
59     public static final int DYNAMIC_EXTERNAL_AUTHENTIFICATION = 0x3B;            // 0x5F3B
60     public static final int DYNAMIC_MUTUAL_AUTHENTIFICATION = 0x3C;              // 0x5F3C
61     public static final int CARDHOLDER_PORTRAIT_IMAGE = 0x40;                    // 0x5F40
62     public static final int ELEMENT_LIST = 0x41;                                 // 0x5F41
63     public static final int ADDRESS = 0x42;                                      // 0x5F42
64     public static final int CARDHOLDER_HANDWRITTEN_SIGNATURE = 0x43;             // 0x5F43
65     public static final int APPLICATION_IMAGE = 0x44;                            // 0x5F44
66     public static final int DISPLAY_IMAGE = 0x45;                                // 0x5F45
67     public static final int TIMER = 0x46;                                        // 0x5F46
68     public static final int MESSAGE_REFERENCE = 0x47;                            // 0x5F47
69     public static final int CARDHOLDER_PRIVATE_KEY = 0x48;                       // 0x5F48
70     public static final int CARDHOLDER_PUBLIC_KEY = 0x49;                        // 0x5F49
71     public static final int CERTIFICATION_AUTHORITY_PUBLIC_KEY = 0x4A;           // 0x5F4A
72     public static final int DEPRECATED = 0x4B;                                   // 0x5F4B
73     public static final int CERTIFICATE_HOLDER_AUTHORIZATION = 0x4C;    // 0x5F4C Not yet defined in iso7816. The allocation is requested
74     public static final int INTEGRATED_CIRCUIT_MANUFACTURER_ID = 0x4D;  // 0x5F4D
75     public static final int CERTIFICATE_CONTENT = 0x4E;                 // 0x5F4E
76     public static final int UNIFORM_RESOURCE_LOCATOR = 0x50;            // 0x5F50
77     public static final int ANSWER_TO_RESET = 0x51;                     // 0x5F51
78     public static final int HISTORICAL_BYTES = 0x52;                    // 0x5F52
79     public static final int DIGITAL_SIGNATURE = 0x3D;                   // 0x5F3D
80     public static final int APPLICATION_TEMPLATE = 0x01;                // 0x61
81     public static final int FCP_TEMPLATE = 0x02;                        // 0x62
82     public static final int WRAPPER = 0x03;                             // 0x63
83     public static final int FMD_TEMPLATE = 0x04;                        // 0x64
84     public static final int CARDHOLDER_RELATIVE_DATA = 0x05;            // 0x65
85     public static final int CARD_DATA = 0x06;                           // 0x66
86     public static final int AUTHENTIFICATION_DATA = 0x07;               // 0x67
87     public static final int SPECIAL_USER_REQUIREMENTS = 0x08;           // 0x68
88     public static final int LOGIN_TEMPLATE = 0x0A;                      // 0x6A
89     public static final int QUALIFIED_NAME = 0x0B;                      // 0x6B
90     public static final int CARDHOLDER_IMAGE_TEMPLATE = 0x0C;           // 0x6C
91     public static final int APPLICATION_IMAGE_TEMPLATE = 0x0D;          // 0x6D
92     public static final int APPLICATION_RELATED_DATA = 0x0E;            // 0x6E
93     public static final int FCI_TEMPLATE = 0x0F;                        // 0x6F
94     public static final int DISCRETIONARY_DATA_OBJECTS = 0x13;          // 0x73
95     public static final int COMPATIBLE_TAG_ALLOCATION_AUTHORITY = 0x18; // 0x78
96     public static final int COEXISTANT_TAG_ALLOCATION_AUTHORITY = 0x19; // 0x79
97     public static final int SECURITY_SUPPORT_TEMPLATE = 0x1A;           // 0x7A
98     public static final int SECURITY_ENVIRONMENT_TEMPLATE = 0x1B;       // 0x7B
99     public static final int DYNAMIC_AUTHENTIFICATION_TEMPLATE = 0x1C;   // 0x7C
100     public static final int SECURE_MESSAGING_TEMPLATE = 0x1D;           // 0x7D
101     public static final int NON_INTERINDUSTRY_DATA_OBJECT_NESTING_TEMPLATE = 0x1E; // 0x7E
102     public static final int DISPLAY_CONTROL = 0x20;                           // 0x7F20
103     public static final int CARDHOLDER_CERTIFICATE = 0x21;                    // 0x7F21;
104     public static final int CV_CERTIFICATE = 0x21;                            // 0x7F21;
105     public static final int CARDHOLER_REQUIREMENTS_INCLUDED_FEATURES = 0x22;  // 0x7F22;
106     public static final int CARDHOLER_REQUIREMENTS_EXCLUDED_FEATURES = 0x23;  // 0x7F23;
107     public static final int BIOMETRIC_DATA_TEMPLATE = 0x2E;                   // 0x7F2E;
108     public static final int DIGITAL_SIGNATURE_BLOCK = 0x3D;                   // 0x7F3D;
109     public static final int CARDHOLDER_PRIVATE_KEY_TEMPLATE = 0x48;           // 0x7F48;
110     public static final int CARDHOLDER_PUBLIC_KEY_TEMPLATE = 0x49;            // 0x7F49;
111     public static final int CERTIFICATE_HOLDER_AUTHORIZATION_TEMPLATE = 0x4C; // 0x7F4C;
112     public static final int CERTIFICATE_CONTENT_TEMPLATE = 0x4E;              // 0x7F4E;
113     public static final int CERTIFICATE_BODY = 0x4E;                          // 0x7F4E;
114     public static final int BIOMETRIC_INFORMATION_TEMPLATE = 0x00;            // 0x60
115     public static final int BIOMETRIC_INFORMATION_GROUP_TEMPLATE = 0x01;      // 0x61
116 
getTag(int encodedTag)117     public static int getTag(int encodedTag)
118     {
119         /*
120         int i;
121         for (i = 24; i>=0; i-=8) {
122             if (((0xFF<<i) & tag) != 0)
123                 return (((0xFF<<i) & tag) >> i);
124         }
125         return 0;
126         */
127         return decodeTag(encodedTag);
128     }
129 
getTagNo(int tag)130     public static int getTagNo(int tag)
131     {
132         int i;
133         for (i = 24; i >= 0; i -= 8)
134         {
135             if (((0xFF << i) & tag) != 0)
136             {
137                 return ((~(0xFF << i)) & tag);
138             }
139         }
140         return 0;
141     }
142 
encodeTag(ASN1ApplicationSpecific spec)143     public static int encodeTag(ASN1ApplicationSpecific spec)
144     {
145         int retValue = BERTags.APPLICATION;
146         boolean constructed = spec.isConstructed();
147         if (constructed)
148         {
149             retValue |= BERTags.CONSTRUCTED;
150         }
151 
152         int tag = spec.getApplicationTag();
153 
154         if (tag > 31)
155         {
156             retValue |= 0x1F;
157             retValue <<= 8;
158 
159             int currentByte = tag & 0x7F;
160             retValue |= currentByte;
161             tag >>= 7;
162 
163             while (tag > 0)
164             {
165                 retValue |= 0x80;
166                 retValue <<= 8;
167 
168                 currentByte = tag & 0x7F;
169                 retValue |= currentByte;
170                 tag >>= 7;
171             }
172         }
173         else
174         {
175             retValue |= tag;
176         }
177 
178         return retValue;
179     }
180 
decodeTag(int tag)181     public static int decodeTag(int tag)
182     {
183         int retValue = 0;
184         boolean multiBytes = false;
185         for (int i = 24; i >= 0; i -= 8)
186         {
187             int currentByte = tag >> i & 0xFF;
188             if (currentByte == 0)
189             {
190                 continue;
191             }
192 
193             if (multiBytes)
194             {
195                 retValue <<= 7;
196                 retValue |= currentByte & 0x7F;
197             }
198             else if ((currentByte & 0x1F) == 0x1F)
199             {
200                 multiBytes = true;
201             }
202             else
203             {
204                 return currentByte & 0x1F; // higher order bit are for DER.Constructed and type
205             }
206         }
207         return retValue;
208     }
209 }
210