smartcard2
Version:
122 lines (113 loc) • 4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var statusCodes = {
"^9000$": "Normal processing",
"^61(.{2})$": "Normal processing, (sw2 indicates the number of response bytes still available)",
"^62(.{2})$": "Warning processing",
"^6200$": "no info",
"^6281$": "Part of return data may be corrupted",
"^6282$": "end of file/record reached before reading le bytes",
"^6283$": "ret data may contain structural info",
"^6284$": "selected file is invalidated",
"^6285$": "file control info not in required format",
"^6286$": "unsuccessful writing",
"^63(.{2})$": "Warning processing",
"^6300$": "no info",
"^6381$": "last write filled up file",
"^6382$": "execution successful after retry",
// c0 least significant nibble is a counter....
// .. ..valued from 0 to 15
// cf
"^64(.{2})$": "Execution error",
"^65(.{2})$": "Execution error",
"^6500$": "no info",
"^6581$": "memory failure",
"^66(.{2})$": "Reserved for future use",
"^6700$": "Wrong length",
"^68(.{2})$": "Checking error: functions in CLA not supported (see sw2)",
"^6800$": "no info",
"^6881$": "logical channel not supported",
"^6882$": "secure messaging not supported",
"^69(.{2})$": "Checking error: command not allowed (see sw2)",
"^6a(.{2})$": "Checking error: wrong parameters (p1 or p2) (see sw2)",
"^6b(.{2})$": "Checking error: wrong parameters",
"^6c(.{2})$": "Checking error: wrong length (sw2 indicates correct length for le)",
"^6d(.{2})$": "Checking error: wrong ins",
"^6e(.{2})$": "Checking error: class not supported",
"^6f(.{2})$": "Checking error: no precise diagnosis"
};
var ResponseApdu = function () {
function ResponseApdu(buffer) {
_classCallCheck(this, ResponseApdu);
this.buffer = buffer;
this.data = buffer.toString("hex");
}
_createClass(ResponseApdu, [{
key: "meaning",
value: function meaning() {
var statusCode = this.getStatusCode();
for (var prop in statusCodes) {
if (statusCodes.hasOwnProperty(prop)) {
var result = statusCodes[prop];
if (statusCode.match(prop)) {
return result;
}
}
}
return "Unknown";
}
}, {
key: "getDataOnly",
value: function getDataOnly() {
return this.data.substr(0, this.data.length - 4);
}
}, {
key: "getStatusCode",
value: function getStatusCode() {
return this.data.substr(-4);
}
}, {
key: "isOk",
value: function isOk() {
return this.getStatusCode() === "9000";
}
}, {
key: "buffer",
value: function buffer() {
return this.buffer;
}
}, {
key: "hasMoreBytesAvailable",
value: function hasMoreBytesAvailable() {
return this.data.substr(-4, 2) === "61";
}
}, {
key: "numberOfBytesAvailable",
value: function numberOfBytesAvailable() {
var hexLength = this.data.substr(-2, 2);
return parseInt(hexLength, 16);
}
}, {
key: "isWrongLength",
value: function isWrongLength() {
return this.data.substr(-4, 2) === "6c";
}
}, {
key: "correctLength",
value: function correctLength() {
var hexLength = this.data.substr(-2, 2);
return parseInt(hexLength, 16);
}
}, {
key: "toString",
value: function toString() {
return this.data.toString("hex");
}
}]);
return ResponseApdu;
}();
exports.default = ResponseApdu;