      1 /**
      2  *  ---------
      3  * |.##> <##.|  Open Smart Card Development Platform (www.openscdp.org)
      4  * |#       #|
      5  * |#       #|  Copyright (c) 1999-2009 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 Public Key Reference, the value stored in CAR and CHR of CV-Certificates
     25  */
     26
     27
     28
     29
     30 /**
     31  * <p>Create a public key reference (CAR/CHR) from binary representation or individual fields.</p>
     32  *
     33  * <p>Use one of the following signatures:</p>
     34  *
     35  * <ul>
     36  *  <li>PublicKeyReference(ByteString value) - binary public key reference</li>
     37  *  <li>PublicKeyReference(String value) - string encoded public key reference</li>
     38  *  <li>PublicKeyReference(String countryCode, String holderMnemonic, String sequenceNumber) - string encoded public key reference</li>
     39  * </ul>
     40  * <p>@see PublicKeyReference.test() for an example.</P>
     41  *
     42  * @class <p>A class that implements a public key reference to be used as CAR and CHR in
     43  *        card verifiable certificates (CVC).</p>
     44  * @constructor
     45  */
     46 function PublicKeyReference() {
     47 	if (arguments.length > 0) {
     48 		if (arguments.length == 1) {
     49 			if (typeof(arguments[0]) == "string") {
     50 				this.bin = new ByteString(arguments[0], ASCII);
     51 			} else {
     52 				this.bin = arguments[0];
     53 			}
     54 		} else {
     55 			var cc = arguments[0];
     56 			var mn = arguments[1];
     57 			var sq = arguments[2];
     58 			this.bin = new ByteString(cc + mn + sq, ASCII);
     59 		}
     60 	}
     61 }
     62
     63 exports.PublicKeyReference = PublicKeyReference;
     64
     65
     66
     67 /**
     68  * Returns the 2 character country code
     69  *
     70  * @return the country code
     71  * @type String
     72  */
     73 PublicKeyReference.prototype.getCountryCode = function() {
     74 	return this.bin.bytes(0, 2).toString(ASCII);
     75 }
     76
     77
     78
     79 /**
     80  * Returns the variable length holder mnemonic
     81  *
     82  * @return the holder mnemonic
     83  * @type String
     84  */
     85 PublicKeyReference.prototype.getMnemonic = function() {
     86 	return this.bin.bytes(2, this.bin.length - 7).toString(ASCII);
     87 }
     88
     89
     90
     91 /**
     92  * Returns the 5 character sequence number
     93  *
     94  * @return the sequence number
     95  * @type String
     96  */
     97 PublicKeyReference.prototype.getSequenceNo = function() {
     98 	return this.bin.bytes(this.bin.length - 5, 5).toString(ASCII);
     99 }
    100
    101
    102
    103 /**
    104  * Returns the certificate holder name, which is the concatenation of the country code and the
    105  * holder mnemonic.
    106  *
    107  * @return the holder name
    108  * @type String
    109  */
    110 PublicKeyReference.prototype.getHolder = function() {
    111 	return this.getCountryCode() + this.getMnemonic();
    112 }
    113
    114
    115
    116 /**
    117  * Returns the binary encoded public key reference
    118  *
    119  * @return the public key reference
    120  * @type ByteString
    121  */
    122 PublicKeyReference.prototype.getBytes = function() {
    123 	return this.bin;
    124 }
    125
    126
    127
    128 /**
    129  * Returns the string representation of the public key reference
    130  *
    131  * @return the public key reference
    132  * @type String
    133  */
    134 PublicKeyReference.prototype.toString = function() {
    135 	return this.bin.toString(ASCII);
    136 }
    137
    138
    139
    140 /**
    141  * Returns true if other public key reference equals this public key reference
    142  *
    143  * @return true if equals
    144  * @type boolean
    145  */
    146 PublicKeyReference.prototype.equals = function(other) {
    147 	return this.bin.equals(other.bin);
    148 }
    149
    150
    151
    152 /**
    153  * Test function
    154  */
    155 PublicKeyReference.test = function() {
    156 	var p = new PublicKeyReference(new ByteString("UTABCDF0000", ASCII));
    157 	assert(p.getCountryCode() == "UT");
    158 	assert(p.getMnemonic() == "ABCD");
    159 	assert(p.getSequenceNo() == "F0000");
    160 	assert(p.getHolder() == "UTABCD");
    161
    162 	var p = new PublicKeyReference("UT", "ABCD", "F0000");
    163 	assert(p.getCountryCode() == "UT");
    164 	assert(p.getMnemonic() == "ABCD");
    165 	assert(p.getSequenceNo() == "F0000");
    166 	assert(p.getHolder() == "UTABCD");
    167
    168 	var p = new PublicKeyReference("UTABCDF0000");
    169 	assert(p.getCountryCode() == "UT");
    170 	assert(p.getMnemonic() == "ABCD");
    171 	assert(p.getSequenceNo() == "F0000");
    172 	assert(p.getHolder() == "UTABCD");
    173
    174 	assert(p.getBytes().toString(ASCII) == "UTABCDF0000");
    175 }
    176
    177