1 /**
  2  *  ---------
  3  * |.##> <##.|  Open Smart Card Development Platform (www.openscdp.org)
  4  * |#       #|
  5  * |#       #|  Copyright (c) 1999-2018 CardContact Software & System Consulting
  6  * |'##> <##'|  Andreas Schwier, 32429 Minden, Germany (www.cardcontact.de)
  7  *  ---------
  8  *
  9  *  This file is part of OpenSCDP.
 10  *
 11  *  OpenSCDP is free software; you can redistribute it and/or modify
 12  *  it under the terms of the GNU General Public License version 2 as
 13  *  published by the Free Software Foundation.
 14  *
 15  *  OpenSCDP is distributed in the hope that it will be useful,
 16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 18  *  GNU General Public License for more details.
 19  *
 20  *  You should have received a copy of the GNU General Public License
 21  *  along with OpenSCDP; if not, write to the Free Software
 22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 23  *
 24  * @fileoverview Security environment - a container for security related data elements
 25  */
 26 
 27 
 28 
 29 /**
 30  * Creates a security environment container that collects cryptographic reference templates (CRT)
 31  *
 32  * @class Class implementing a security environment for cryptographic operations.
 33  * @constructor
 34  */
 35 function SecurityEnvironment() {
 36 	this.t = { AT:null, KAT: null, HT: null, CCT:null, DST:null, CT: null };
 37 }
 38 
 39 exports.SecurityEnvironment = SecurityEnvironment;
 40 
 41 
 42 
 43 /**
 44  * Adds CRT elements to a named template.
 45  *
 46  * @param {String} tname the CRT name one of AT, KAT, HT, CCT, DST or CT
 47  * @param {ASN1} tlv the tlv object containing the CRT elements
 48  **/
 49 SecurityEnvironment.prototype.addElements = function(tname, tlv) {
 50 	var t = this.t[tname];
 51 	if (t) {
 52 		for (var i = 0; i < tlv.elements; i++) {
 53 			var o = tlv.get(i);
 54 			SecurityEnvironment.decorateCRT(o);
 55 			var j = 0;
 56 			while(j < t.elements) {
 57 				if (t.get(j).tag == o.tag) {
 58 					t.remove(j);
 59 				} else {
 60 					j++;
 61 				}
 62 			}
 63 			t.add(o);
 64 		}
 65 	} else {
 66 		for (var i = 0; i < tlv.elements; i++) {
 67 			var o = tlv.get(i);
 68 			SecurityEnvironment.decorateCRT(o);
 69 		}
 70 		this.t[tname] = tlv;
 71 	}
 72 }
 73 
 74 
 75 
 76 /**
 77  * Adds a CRT identified by it's tag
 78  *
 79  * @param {ASN1} tlv the tlv object
 80  */
 81 SecurityEnvironment.prototype.add = function(tlv) {
 82 	switch(tlv.tag) {
 83 	case 0xA4:
 84 		tlv.setName("AT");
 85 		break;
 86 	case 0xA6:
 87 		tlv.setName("KAT");
 88 		break;
 89 	case 0xAA:
 90 		tlv.setName("HT");
 91 		break;
 92 	case 0xB4:
 93 		tlv.setName("CCT");
 94 		break;
 95 	case 0xB6:
 96 		tlv.setName("DST");
 97 		break;
 98 	case 0xB8:
 99 		tlv.setName("CT");
100 		break;
101 	default:
102 		throw new GPError("SecurityEnvironment", GPError.INVALID_DATA, tlv.tag, "Invalid tag for CRT");
103 	}
104 	this.addElements(tlv.name, tlv);
105 }
106 
107 
108 
109 /**
110  * Return textual representation of security environment container
111  */
112 SecurityEnvironment.prototype.toString = function() {
113 	var str = "";
114 
115 	if (this.t.AT) {
116 		str += "Authentication Template (AT)\n" + this.t.AT;
117 	}
118 	if (this.t.KAT) {
119 		str += "Key Agreement Template (KAT)\n" + this.t.KAT;
120 	}
121 	if (this.t.HT) {
122 		str += "Hash Template (HT)\n" + this.t.HT;
123 	}
124 	if (this.t.CCT) {
125 		str += "Cryptographic Checksum Template (CCT)\n" + this.t.CCT;
126 	}
127 	if (this.t.DST) {
128 		str += "Digital Signature Template (DST)\n" + this.t.DST;
129 	}
130 	if (this.t.CT) {
131 		str += "Confidentiality Template (CT)\n" + this.t.CT;
132 	}
133 	return str;
134 }
135 
136 
137 
138 /**
139  * Decorates a tlv object from the CRT
140  */
141 SecurityEnvironment.decorateCRT = function(asn1) {
142 	switch(asn1.tag) {
143 	case 0x80:
144 		asn1.setName("cryptographicMechanism 80");
145 		break;
146 	case 0x81:
147 		asn1.setName("fileIdentifierOrPath 81");
148 		break;
149 	case 0x82:
150 		asn1.setName("dFName 82");
151 		break;
152 	case 0x83:
153 		asn1.setName("secretOrPublicKeyReference 83");
154 		break;
155 	case 0x84:
156 		asn1.setName("sessionOrPrivateKeyReference 84");
157 		break;
158 	case 0x85:
159 		asn1.setName("nullBlock 85");
160 		break;
161 	case 0x86:
162 		asn1.setName("chainingBlock 86");
163 		break;
164 	case 0x87:
165 		asn1.setName("initialBlock 87");
166 		break;
167 	case 0x88:
168 		asn1.setName("previousChallenge 88");
169 		break;
170 	case 0x89:
171 		asn1.setName("proprietaryDataElementIndex 89");
172 		break;
173 	case 0x8A:
174 		asn1.setName("proprietaryDataElementIndex 8A");
175 		break;
176 	case 0x8B:
177 		asn1.setName("proprietaryDataElementIndex 8B");
178 		break;
179 	case 0x8C:
180 		asn1.setName("proprietaryDataElementIndex 8C");
181 		break;
182 	case 0x8D:
183 		asn1.setName("proprietaryDataElementIndex 8D");
184 		break;
185 	case 0x90:
186 		asn1.setName("cardHashCode 90");
187 		break;
188 	case 0x91:
189 		asn1.setName("ephemeralPublicKey 91");
190 		break;
191 	case 0x92:
192 		asn1.setName("cardTimeStamp 92");
193 		break;
194 	case 0x93:
195 		asn1.setName("dsiCounter 93");
196 		break;
197 	case 0x94:
198 		asn1.setName("challengeOrDerivationParameter 94");
199 		break;
200 	case 0x95:
201 		asn1.setName("usageQualifier 95");
202 		break;
203 	case 0x8E:
204 		asn1.setName("cryptographicContentReference 8E");
205 		break;
206 	case 0x67:
207 		asn1.setName("auxiliaryAuthenticatedData 67");
208 		break;
209 	case 0x67:
210 		asn1.setName("auxiliaryAuthenticatedData 67");
211 		break;
212 	case 0x7F4C:
213 		asn1.setName("certificateHolderAuthorisationTemplate 7F4C");
214 		break;
215 	}
216 }
217