@islom929/react-eimzo 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/e-imzo.js ADDED
@@ -0,0 +1,664 @@
1
+ (function(global) {
2
+ 'use strict';
3
+ var _Base64 = global.Base64;
4
+ var version = "2.1.4";
5
+ var buffer;
6
+ if (typeof module !== 'undefined' && module.exports) {
7
+ buffer = require('buffer').Buffer;
8
+ }
9
+ var b64chars
10
+ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
11
+ var b64tab = function(bin) {
12
+ var t = {};
13
+ for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
14
+ return t;
15
+ }(b64chars);
16
+ var fromCharCode = String.fromCharCode;
17
+ var cb_utob = function(c) {
18
+ if (c.length < 2) {
19
+ var cc = c.charCodeAt(0);
20
+ return cc < 0x80 ? c
21
+ : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6))
22
+ + fromCharCode(0x80 | (cc & 0x3f)))
23
+ : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
24
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
25
+ + fromCharCode(0x80 | ( cc & 0x3f)));
26
+ } else {
27
+ var cc = 0x10000
28
+ + (c.charCodeAt(0) - 0xD800) * 0x400
29
+ + (c.charCodeAt(1) - 0xDC00);
30
+ return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07))
31
+ + fromCharCode(0x80 | ((cc >>> 12) & 0x3f))
32
+ + fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
33
+ + fromCharCode(0x80 | ( cc & 0x3f)));
34
+ }
35
+ };
36
+ var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g;
37
+ var utob = function(u) {
38
+ return u.replace(re_utob, cb_utob);
39
+ };
40
+ var cb_encode = function(ccc) {
41
+ var padlen = [0, 2, 1][ccc.length % 3],
42
+ ord = ccc.charCodeAt(0) << 16
43
+ | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
44
+ | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
45
+ chars = [
46
+ b64chars.charAt( ord >>> 18),
47
+ b64chars.charAt((ord >>> 12) & 63),
48
+ padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
49
+ padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
50
+ ];
51
+ return chars.join('');
52
+ };
53
+ var btoa = global.btoa ? function(b) {
54
+ return global.btoa(b);
55
+ } : function(b) {
56
+ return b.replace(/[\s\S]{1,3}/g, cb_encode);
57
+ };
58
+ var _encode = buffer
59
+ ? function (u) { return (new buffer(u)).toString('base64') }
60
+ : function (u) { return btoa(utob(u)) }
61
+ ;
62
+ var encode = function(u, urisafe) {
63
+ return !urisafe
64
+ ? _encode(u)
65
+ : _encode(u).replace(/[+\/]/g, function(m0) {
66
+ return m0 == '+' ? '-' : '_';
67
+ }).replace(/=/g, '');
68
+ };
69
+ var encodeURI = function(u) { return encode(u, true) };
70
+ var re_btou = new RegExp([
71
+ '[\xC0-\xDF][\x80-\xBF]',
72
+ '[\xE0-\xEF][\x80-\xBF]{2}',
73
+ '[\xF0-\xF7][\x80-\xBF]{3}'
74
+ ].join('|'), 'g');
75
+ var cb_btou = function(cccc) {
76
+ switch(cccc.length) {
77
+ case 4:
78
+ var cp = ((0x07 & cccc.charCodeAt(0)) << 18)
79
+ | ((0x3f & cccc.charCodeAt(1)) << 12)
80
+ | ((0x3f & cccc.charCodeAt(2)) << 6)
81
+ | (0x3f & cccc.charCodeAt(3)),
82
+ offset = cp - 0x10000;
83
+ return (fromCharCode((offset >>> 10) + 0xD800)
84
+ + fromCharCode((offset & 0x3FF) + 0xDC00));
85
+ case 3:
86
+ return fromCharCode(
87
+ ((0x0f & cccc.charCodeAt(0)) << 12)
88
+ | ((0x3f & cccc.charCodeAt(1)) << 6)
89
+ | (0x3f & cccc.charCodeAt(2))
90
+ );
91
+ default:
92
+ return fromCharCode(
93
+ ((0x1f & cccc.charCodeAt(0)) << 6)
94
+ | (0x3f & cccc.charCodeAt(1))
95
+ );
96
+ }
97
+ };
98
+ var btou = function(b) {
99
+ return b.replace(re_btou, cb_btou);
100
+ };
101
+ var cb_decode = function(cccc) {
102
+ var len = cccc.length,
103
+ padlen = len % 4,
104
+ n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
105
+ | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
106
+ | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)
107
+ | (len > 3 ? b64tab[cccc.charAt(3)] : 0),
108
+ chars = [
109
+ fromCharCode( n >>> 16),
110
+ fromCharCode((n >>> 8) & 0xff),
111
+ fromCharCode( n & 0xff)
112
+ ];
113
+ chars.length -= [0, 0, 2, 1][padlen];
114
+ return chars.join('');
115
+ };
116
+ var atob = global.atob ? function(a) {
117
+ return global.atob(a);
118
+ } : function(a){
119
+ return a.replace(/[\s\S]{1,4}/g, cb_decode);
120
+ };
121
+ var _decode = buffer
122
+ ? function(a) { return (new buffer(a, 'base64')).toString() }
123
+ : function(a) { return btou(atob(a)) };
124
+ var decode = function(a){
125
+ return _decode(
126
+ a.replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
127
+ .replace(/[^A-Za-z0-9\+\/]/g, '')
128
+ );
129
+ };
130
+ var noConflict = function() {
131
+ var Base64 = global.Base64;
132
+ global.Base64 = _Base64;
133
+ return Base64;
134
+ };
135
+ global.Base64 = {
136
+ VERSION: version,
137
+ atob: atob,
138
+ btoa: btoa,
139
+ fromBase64: decode,
140
+ toBase64: encode,
141
+ utob: utob,
142
+ encode: encode,
143
+ encodeURI: encodeURI,
144
+ btou: btou,
145
+ decode: decode,
146
+ noConflict: noConflict
147
+ };
148
+ if (typeof Object.defineProperty === 'function') {
149
+ var noEnum = function(v){
150
+ return {value:v,enumerable:false,writable:true,configurable:true};
151
+ };
152
+ global.Base64.extendString = function () {
153
+ Object.defineProperty(
154
+ String.prototype, 'fromBase64', noEnum(function () {
155
+ return decode(this)
156
+ }));
157
+ Object.defineProperty(
158
+ String.prototype, 'toBase64', noEnum(function (urisafe) {
159
+ return encode(this, urisafe)
160
+ }));
161
+ Object.defineProperty(
162
+ String.prototype, 'toBase64URI', noEnum(function () {
163
+ return encode(this, true)
164
+ }));
165
+ };
166
+ }
167
+ })(this);
168
+
169
+ CAPIWS = (typeof EIMZOEXT !== 'undefined') ? EIMZOEXT : {
170
+ URL: (window.location.protocol.toLowerCase() === "https:" ? "wss://127.0.0.1:64443" : "ws://127.0.0.1:64646") + "/service/cryptapi",
171
+ callFunction: function(funcDef, callback, error){
172
+ if (!window.WebSocket){
173
+ if(error)
174
+ error();
175
+ return;
176
+ }
177
+ var socket;
178
+ try{
179
+ socket = new WebSocket(this.URL);
180
+ } catch (e){
181
+ error(e);
182
+ }
183
+ socket.onclose = function(e){
184
+ if(error) {
185
+ if(e.code != 1000){
186
+ error(e.code);
187
+ }
188
+ }
189
+ };
190
+ socket.onmessage = function(event){
191
+ var data = JSON.parse(event.data);
192
+ socket.close();
193
+ callback(event,data);
194
+ };
195
+ socket.onopen = function(){
196
+ socket.send(JSON.stringify(funcDef));
197
+ };
198
+ },
199
+ version: function(callback, error){
200
+ if (!window.WebSocket){
201
+ if(error)
202
+ error();
203
+ return;
204
+ }
205
+ var socket;
206
+ try{
207
+ socket = new WebSocket(this.URL);
208
+ } catch (e){
209
+ error(e);
210
+ }
211
+ socket.onclose = function(e){
212
+ if(error) {
213
+ if(e.code != 1000){
214
+ error(e.code);
215
+ }
216
+ }
217
+ };
218
+ socket.onmessage = function(event){
219
+ var data = JSON.parse(event.data);
220
+ socket.close();
221
+ callback(event,data);
222
+ };
223
+ socket.onopen = function(){
224
+ var o = {name: 'version'};
225
+ socket.send(JSON.stringify(o));
226
+ };
227
+ },
228
+ apidoc: function(callback, error){
229
+ if (!window.WebSocket){
230
+ if(error)
231
+ error();
232
+ return;
233
+ }
234
+ var socket;
235
+ try{
236
+ socket = new WebSocket(this.URL);
237
+ } catch (e){
238
+ error(e);
239
+ }
240
+ socket.onclose = function(e){
241
+ if(error) {
242
+ if(e.code != 1000){
243
+ error(e.code);
244
+ }
245
+ }
246
+ };
247
+ socket.onmessage = function(event){
248
+ var data = JSON.parse(event.data);
249
+ socket.close();
250
+ callback(event,data);
251
+ };
252
+ socket.onopen = function(){
253
+ var o = {name: 'apidoc'};
254
+ socket.send(JSON.stringify(o));
255
+ };
256
+ },
257
+ apikey: function(domainAndKey, callback, error){
258
+ if (!window.WebSocket){
259
+ if(error)
260
+ error();
261
+ return;
262
+ }
263
+ var socket;
264
+ try{
265
+ socket = new WebSocket(this.URL);
266
+ } catch (e){
267
+ error(e);
268
+ }
269
+ socket.onclose = function(e){
270
+ if(error) {
271
+ if(e.code != 1000){
272
+ error(e.code);
273
+ }
274
+ }
275
+ };
276
+ socket.onmessage = function(event){
277
+ var data = JSON.parse(event.data);
278
+ socket.close();
279
+ callback(event,data);
280
+ };
281
+ socket.onopen = function(){
282
+ var o = {name: 'apikey', arguments: domainAndKey};
283
+ socket.send(JSON.stringify(o));
284
+ };
285
+ }
286
+ };
287
+
288
+ Date.prototype.yyyymmdd = function () {
289
+ var yyyy = this.getFullYear().toString();
290
+ var mm = (this.getMonth() + 1).toString();
291
+ var dd = this.getDate().toString();
292
+ return yyyy + (mm[1] ? mm : "0" + mm[0]) + (dd[1] ? dd : "0" + dd[0]);
293
+ };
294
+ Date.prototype.ddmmyyyy = function () {
295
+ var yyyy = this.getFullYear().toString();
296
+ var mm = (this.getMonth() + 1).toString();
297
+ var dd = this.getDate().toString();
298
+ return (dd[1] ? dd : "0" + dd[0]) + "." + (mm[1] ? mm : "0" + mm[0]) + "." + yyyy;
299
+ };
300
+ var dates = {
301
+ convert: function (d) {
302
+ return (
303
+ d.constructor === Date ? d :
304
+ d.constructor === Array ? new Date(d[0], d[1], d[2]) :
305
+ d.constructor === Number ? new Date(d) :
306
+ d.constructor === String ? new Date(d) :
307
+ typeof d === "object" ? new Date(d.year, d.month, d.date) :
308
+ NaN
309
+ );
310
+ },
311
+ compare: function (a, b) {
312
+ return (
313
+ isFinite(a = this.convert(a).valueOf()) &&
314
+ isFinite(b = this.convert(b).valueOf()) ?
315
+ (a > b) - (a < b) :
316
+ NaN
317
+ );
318
+ },
319
+ inRange: function (d, start, end) {
320
+ return (
321
+ isFinite(d = this.convert(d).valueOf()) &&
322
+ isFinite(start = this.convert(start).valueOf()) &&
323
+ isFinite(end = this.convert(end).valueOf()) ?
324
+ start <= d && d <= end :
325
+ NaN
326
+ );
327
+ }
328
+ };
329
+ String.prototype.splitKeep = function (splitter, ahead) {
330
+ var self = this;
331
+ var result = [];
332
+ if (splitter != '') {
333
+ function getSubst(value) {
334
+ var substChar = value[0] == '0' ? '1' : '0';
335
+ var subst = '';
336
+ for (var i = 0; i < value.length; i++) {
337
+ subst += substChar;
338
+ }
339
+ return subst;
340
+ };
341
+ var matches = [];
342
+ var replaceName = splitter instanceof RegExp ? "replace" : "replaceAll";
343
+ var r = self[replaceName](splitter, function (m, i, e) {
344
+ matches.push({value: m, index: i});
345
+ return getSubst(m);
346
+ });
347
+ var lastIndex = 0;
348
+ for (var i = 0; i < matches.length; i++) {
349
+ var m = matches[i];
350
+ var nextIndex = ahead == true ? m.index : m.index + m.value.length;
351
+ if (nextIndex != lastIndex) {
352
+ var part = self.substring(lastIndex, nextIndex);
353
+ result.push(part);
354
+ lastIndex = nextIndex;
355
+ }
356
+ };
357
+ if (lastIndex < self.length) {
358
+ var part = self.substring(lastIndex, self.length);
359
+ result.push(part);
360
+ };
361
+ } else {
362
+ result.add(self);
363
+ };
364
+ return result;
365
+ };
366
+
367
+ var EIMZOClient = {
368
+ NEW_API: false,
369
+ NEW_API2: false,
370
+ NEW_API3: false,
371
+ // Add your production domain and API key below:
372
+ // 'yourdomain.uz', 'YOUR_API_KEY_HERE',
373
+ API_KEYS: [
374
+ 'localhost', '96D0C1491615C82B9A54D9989779DF825B690748224C2B04F500F370D51827CE2644D8D4A82C18184D73AB8530BB8ED537269603F61DB0D03D2104ABF789970B',
375
+ '127.0.0.1', 'A7BCFA5D490B351BE0754130DF03A068F855DB4333D43921125B9CF2670EF6A40370C646B90401955E1F7BC9CDBF59CE0B2C5467D820BE189C845D0B79CFC96F'
376
+ ],
377
+ checkVersion: function(success, fail){
378
+ CAPIWS.version(function (event, data) {
379
+ if(data.success === true){
380
+ if(data.major && data.minor){
381
+ var installedVersion = parseInt(data.major) * 100 + parseInt(data.minor);
382
+ EIMZOClient.NEW_API = installedVersion >= 336;
383
+ EIMZOClient.NEW_API2 = installedVersion >= 412;
384
+ EIMZOClient.NEW_API3 = installedVersion >= 486;
385
+ success(data.major, data.minor);
386
+ } else {
387
+ fail(null, 'E-IMZO Version is undefined');
388
+ }
389
+ } else {
390
+ fail(null, data.reason);
391
+ }
392
+ }, function (e) {
393
+ fail(e, null);
394
+ });
395
+ },
396
+ installApiKeys: function(success, fail){
397
+ CAPIWS.apikey(EIMZOClient.API_KEYS, function (event, data) {
398
+ if (data.success) {
399
+ success();
400
+ } else {
401
+ fail(null,data.reason);
402
+ }
403
+ }, function (e) {
404
+ fail(e, null);
405
+ });
406
+ },
407
+ listAllUserKeys: function(itemIdGen, itemUiGen, success, fail){
408
+ var items = [];
409
+ var errors = [];
410
+ if(!EIMZOClient.NEW_API){
411
+ fail(null, 'Please install new version of E-IMZO');
412
+ } else {
413
+ if(EIMZOClient.NEW_API2){
414
+ EIMZOClient._findPfxs2(itemIdGen, itemUiGen, items, errors, function (firstItmId2) {
415
+ if(items.length === 0 && errors.length > 0){
416
+ fail(errors[0].e, errors[0].r);
417
+ } else {
418
+ var firstId = null;
419
+ if (items.length === 1) {
420
+ if (firstItmId2) {
421
+ firstId = firstItmId2;
422
+ }
423
+ }
424
+ success(items, firstId);
425
+ }
426
+ });
427
+ } else {
428
+ EIMZOClient._findPfxs2(itemIdGen, itemUiGen, items, errors, function (firstItmId2) {
429
+ EIMZOClient._findTokens2(itemIdGen, itemUiGen, items, errors, function (firstItmId3) {
430
+ if(items.length === 0 && errors.length > 0){
431
+ fail(errors[0].e, errors[0].r);
432
+ } else {
433
+ var firstId = null;
434
+ if (items.length === 1) {
435
+ if (firstItmId2) {
436
+ firstId = firstItmId2;
437
+ } else if (firstItmId3) {
438
+ firstId = firstItmId3;
439
+ }
440
+ }
441
+ success(items, firstId);
442
+ }
443
+ });
444
+ });
445
+ }
446
+ }
447
+ },
448
+ idCardIsPLuggedIn: function(success, fail){
449
+ if(!EIMZOClient.NEW_API2){
450
+ success(false);
451
+ } else {
452
+ CAPIWS.callFunction({plugin: "idcard", name: "list_readers"}, function (event, data) {
453
+ if (data.success) {
454
+ success(data.readers.length>0);
455
+ } else {
456
+ fail(null, data.reason);
457
+ }
458
+ }, function (e) {
459
+ fail(e, null);
460
+ });
461
+ }
462
+ },
463
+ isBAIKTokenPLuggedIn: function(success, fail){
464
+ if(!EIMZOClient.NEW_API3){
465
+ success(false);
466
+ } else {
467
+ CAPIWS.callFunction({plugin: "baikey", name: "list_tokens"}, function (event, data) {
468
+ if (data.success) {
469
+ success(data.tokens.length>0);
470
+ } else {
471
+ fail(null, data.reason);
472
+ }
473
+ }, function (e) {
474
+ fail(e, null);
475
+ });
476
+ }
477
+ },
478
+ isCKCPLuggedIn: function(success, fail){
479
+ if(!EIMZOClient.NEW_API3){
480
+ success(false);
481
+ } else {
482
+ CAPIWS.callFunction({plugin: "ckc", name: "list_ckc"}, function (event, data) {
483
+ if (data.success) {
484
+ success(data.devices.length>0);
485
+ } else {
486
+ fail(null, data.reason);
487
+ }
488
+ }, function (e) {
489
+ fail(e, null);
490
+ });
491
+ }
492
+ },
493
+ loadKey: function(itemObject, success, fail, verifyPassword){
494
+ if (itemObject) {
495
+ var vo = itemObject;
496
+ if (vo.type === "pfx") {
497
+ CAPIWS.callFunction({plugin: "pfx", name: "load_key", arguments: [vo.disk, vo.path, vo.name, vo.alias]}, function (event, data) {
498
+ if (data.success) {
499
+ var id = data.keyId;
500
+ if(verifyPassword){
501
+ CAPIWS.callFunction({name: "verify_password", plugin: "pfx", arguments: [id]}, function (event, data) {
502
+ if (data.success) {
503
+ success(id);
504
+ } else {
505
+ fail(null, data.reason);
506
+ }
507
+ }, function (e) {
508
+ fail(e, null);
509
+ });
510
+ } else {
511
+ success(id);
512
+ }
513
+ } else {
514
+ fail(null, data.reason);
515
+ }
516
+ }, function (e) {
517
+ fail(e, null);
518
+ });
519
+ } else if (vo.type === "ftjc") {
520
+ CAPIWS.callFunction({plugin: "ftjc", name: "load_key", arguments: [vo.cardUID]}, function (event, data) {
521
+ if (data.success) {
522
+ var id = data.keyId;
523
+ if(verifyPassword){
524
+ CAPIWS.callFunction({plugin: "ftjc", name: "verify_pin", arguments: [id,'1']}, function (event, data) {
525
+ if (data.success) {
526
+ success(id);
527
+ } else {
528
+ fail(null, data.reason);
529
+ }
530
+ }, function (e) {
531
+ fail(e, null);
532
+ });
533
+ } else {
534
+ success(id);
535
+ }
536
+ } else {
537
+ fail(null, data.reason);
538
+ }
539
+ }, function (e) {
540
+ fail(e, null);
541
+ });
542
+ }
543
+ }
544
+ },
545
+ createPkcs7: function(id, data, timestamper, success, fail, detached, isDataBase64Encoded){
546
+ var data64;
547
+ if(isDataBase64Encoded === true){
548
+ data64 = data
549
+ }else {
550
+ data64 = Base64.encode(data);
551
+ }
552
+ if(detached === true){
553
+ detached = 'yes';
554
+ } else {
555
+ detached = 'no';
556
+ }
557
+ CAPIWS.callFunction({plugin: "pkcs7", name: "create_pkcs7", arguments: [data64, id, detached]}, function (event, data) {
558
+ if (data.success) {
559
+ var pkcs7 = data.pkcs7_64;
560
+ success(pkcs7);
561
+ } else {
562
+ fail(null, data.reason);
563
+ }
564
+ }, function (e) {
565
+ fail(e, null);
566
+ });
567
+ },
568
+ _getX500Val: function (s, f) {
569
+ var res = s.splitKeep(/,[A-Z]+=/g, true);
570
+ for (var i in res) {
571
+ var n = res[i].search((i > 0 ? "," : "") + f + "=");
572
+ if (n !== -1) {
573
+ return res[i].slice(n + f.length + 1 + (i > 0 ? 1 : 0));
574
+ }
575
+ }
576
+ return "";
577
+ },
578
+ _findPfxs2: function (itemIdGen, itemUiGen, items, errors, callback) {
579
+ var itmkey0;
580
+ CAPIWS.callFunction({plugin: "pfx", name: "list_all_certificates"}, function (event, data) {
581
+ if (data.success) {
582
+ for (var rec in data.certificates) {
583
+ var el = data.certificates[rec];
584
+ var x500name_ex = el.alias.toUpperCase();
585
+ x500name_ex = x500name_ex.replace("1.2.860.3.16.1.1=", "INN=");
586
+ x500name_ex = x500name_ex.replace("1.2.860.3.16.1.2=", "PINFL=");
587
+ var vo = {
588
+ disk: el.disk,
589
+ path: el.path,
590
+ name: el.name,
591
+ alias: el.alias,
592
+ serialNumber: EIMZOClient._getX500Val(x500name_ex, "SERIALNUMBER"),
593
+ validFrom: new Date(EIMZOClient._getX500Val(x500name_ex, "VALIDFROM").replace(/\./g, "-").replace(" ", "T")),
594
+ validTo: new Date(EIMZOClient._getX500Val(x500name_ex, "VALIDTO").replace(/\./g, "-").replace(" ", "T")),
595
+ CN: EIMZOClient._getX500Val(x500name_ex, "CN"),
596
+ TIN: (EIMZOClient._getX500Val(x500name_ex, "INN") ? EIMZOClient._getX500Val(x500name_ex, "INN") : EIMZOClient._getX500Val(x500name_ex, "UID")),
597
+ UID: EIMZOClient._getX500Val(x500name_ex, "UID"),
598
+ PINFL: EIMZOClient._getX500Val(x500name_ex, "PINFL"),
599
+ O: EIMZOClient._getX500Val(x500name_ex, "O"),
600
+ T: EIMZOClient._getX500Val(x500name_ex, "T"),
601
+ type: 'pfx'
602
+ };
603
+ if (!vo.TIN && !vo.PINFL)
604
+ continue;
605
+ var itmkey = itemIdGen(vo,rec);
606
+ if (!itmkey0) {
607
+ itmkey0 = itmkey;
608
+ }
609
+ var itm = itemUiGen(itmkey, vo);
610
+ items.push(itm);
611
+ }
612
+ } else {
613
+ errors.push({r: data.reason});
614
+ }
615
+ callback(itmkey0);
616
+ }, function (e) {
617
+ errors.push({e: e});
618
+ callback(itmkey0);
619
+ });
620
+ },
621
+ _findTokens2: function (itemIdGen, itemUiGen, items, errors, callback) {
622
+ var itmkey0;
623
+ CAPIWS.callFunction({plugin: "ftjc", name: "list_all_keys", arguments:['']}, function (event, data) {
624
+ if (data.success) {
625
+ for (var rec in data.tokens) {
626
+ var el = data.tokens[rec];
627
+ var x500name_ex = el.info.toUpperCase();
628
+ x500name_ex = x500name_ex.replace("1.2.860.3.16.1.1=", "INN=");
629
+ x500name_ex = x500name_ex.replace("1.2.860.3.16.1.2=", "PINFL=");
630
+ var vo = {
631
+ cardUID: el.cardUID,
632
+ statusInfo: el.statusInfo,
633
+ ownerName: el.ownerName,
634
+ info: el.info,
635
+ serialNumber: EIMZOClient._getX500Val(x500name_ex, "SERIALNUMBER"),
636
+ validFrom: new Date(EIMZOClient._getX500Val(x500name_ex, "VALIDFROM")),
637
+ validTo: new Date(EIMZOClient._getX500Val(x500name_ex, "VALIDTO")),
638
+ CN: EIMZOClient._getX500Val(x500name_ex, "CN"),
639
+ TIN: (EIMZOClient._getX500Val(x500name_ex, "INN") ? EIMZOClient._getX500Val(x500name_ex, "INN") : EIMZOClient._getX500Val(x500name_ex, "UID")),
640
+ UID: EIMZOClient._getX500Val(x500name_ex, "UID"),
641
+ PINFL: EIMZOClient._getX500Val(x500name_ex, "PINFL"),
642
+ O: EIMZOClient._getX500Val(x500name_ex, "O"),
643
+ T: EIMZOClient._getX500Val(x500name_ex, "T"),
644
+ type: 'ftjc'
645
+ };
646
+ if (!vo.TIN && !vo.PINFL)
647
+ continue;
648
+ var itmkey = itemIdGen(vo,rec);
649
+ if (!itmkey0) {
650
+ itmkey0 = itmkey;
651
+ }
652
+ var itm = itemUiGen(itmkey, vo);
653
+ items.push(itm);
654
+ }
655
+ } else {
656
+ errors.push({r: data.reason});
657
+ }
658
+ callback(itmkey0);
659
+ }, function (e) {
660
+ errors.push({e: e});
661
+ callback(itmkey0);
662
+ });
663
+ }
664
+ };
package/dist/index.cjs ADDED
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ EimzoProvider: () => EimzoProvider,
24
+ useEimzo: () => useEimzo
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+
28
+ // src/provider.tsx
29
+ var import_react = require("react");
30
+
31
+ // src/eimzo.ts
32
+ var sdkLoaded = false;
33
+ function loadSDK(sdkPath) {
34
+ return new Promise((resolve, reject) => {
35
+ if (sdkLoaded || typeof EIMZOClient !== "undefined") {
36
+ sdkLoaded = true;
37
+ resolve();
38
+ return;
39
+ }
40
+ const script = document.createElement("script");
41
+ script.src = sdkPath || "/e-imzo.js";
42
+ script.onload = () => {
43
+ sdkLoaded = true;
44
+ resolve();
45
+ };
46
+ script.onerror = () => reject("Failed to load E-IMZO SDK");
47
+ document.head.appendChild(script);
48
+ });
49
+ }
50
+ function checkVersion() {
51
+ return new Promise((resolve, reject) => {
52
+ EIMZOClient.checkVersion(
53
+ (major, minor) => resolve({ major, minor }),
54
+ (e, r) => reject(r || e)
55
+ );
56
+ });
57
+ }
58
+ function installApiKeys(apiKeys) {
59
+ return new Promise((resolve, reject) => {
60
+ if (apiKeys) {
61
+ EIMZOClient.API_KEYS = [
62
+ ...EIMZOClient.API_KEYS,
63
+ ...apiKeys
64
+ ];
65
+ }
66
+ EIMZOClient.installApiKeys(
67
+ () => resolve(),
68
+ (e, r) => reject(r || e)
69
+ );
70
+ });
71
+ }
72
+ function listAllUserKeys() {
73
+ return new Promise((resolve, reject) => {
74
+ const certs = [];
75
+ EIMZOClient.listAllUserKeys(
76
+ (o, i) => `itm-${o.serialNumber}-${i}`,
77
+ (_itemId, vo) => {
78
+ const cert = {
79
+ ...vo,
80
+ expired: new Date(vo.validTo) < /* @__PURE__ */ new Date()
81
+ };
82
+ certs.push(cert);
83
+ return cert;
84
+ },
85
+ () => resolve(certs),
86
+ (e, r) => reject(r || e)
87
+ );
88
+ });
89
+ }
90
+ function loadKey(cert) {
91
+ return new Promise((resolve, reject) => {
92
+ EIMZOClient.loadKey(
93
+ cert,
94
+ (id) => resolve(id),
95
+ (e, r) => reject(r || e)
96
+ );
97
+ });
98
+ }
99
+ function createPkcs7(keyId, data) {
100
+ return new Promise((resolve, reject) => {
101
+ EIMZOClient.createPkcs7(
102
+ keyId,
103
+ data,
104
+ null,
105
+ (pkcs7) => resolve(pkcs7),
106
+ (e, r) => reject(r || e),
107
+ false
108
+ );
109
+ });
110
+ }
111
+ function checkIdCard() {
112
+ return new Promise((resolve, reject) => {
113
+ EIMZOClient.idCardIsPLuggedIn(
114
+ (plugged) => resolve(plugged),
115
+ (e, r) => reject(r || e)
116
+ );
117
+ });
118
+ }
119
+ function checkBaikToken() {
120
+ return new Promise((resolve, reject) => {
121
+ EIMZOClient.isBAIKTokenPLuggedIn(
122
+ (plugged) => resolve(plugged),
123
+ (e, r) => reject(r || e)
124
+ );
125
+ });
126
+ }
127
+ function checkCkc() {
128
+ return new Promise((resolve, reject) => {
129
+ EIMZOClient.isCKCPLuggedIn(
130
+ (plugged) => resolve(plugged),
131
+ (e, r) => reject(r || e)
132
+ );
133
+ });
134
+ }
135
+ async function install(apiKeys, sdkPath) {
136
+ await loadSDK(sdkPath);
137
+ await checkVersion();
138
+ await installApiKeys(apiKeys);
139
+ }
140
+
141
+ // src/provider.tsx
142
+ var import_jsx_runtime = require("react/jsx-runtime");
143
+ var EimzoContext = (0, import_react.createContext)(null);
144
+ function EimzoProvider({ apiKeys, sdkPath, children }) {
145
+ const [isInstalled, setIsInstalled] = (0, import_react.useState)(false);
146
+ const [isLoading, setIsLoading] = (0, import_react.useState)(false);
147
+ const [keyList, setKeyList] = (0, import_react.useState)([]);
148
+ const [deviceStatus, setDeviceStatus] = (0, import_react.useState)({
149
+ idcard: false,
150
+ baikey: false,
151
+ ckc: false
152
+ });
153
+ (0, import_react.useEffect)(() => {
154
+ install(apiKeys, sdkPath).then(() => setIsInstalled(true)).catch(() => setIsInstalled(false));
155
+ }, []);
156
+ const loadKeys = (0, import_react.useCallback)(async () => {
157
+ setIsLoading(true);
158
+ try {
159
+ const certs = await listAllUserKeys();
160
+ setKeyList(certs);
161
+ const [idcard, baikey, ckc] = await Promise.allSettled([
162
+ checkIdCard(),
163
+ checkBaikToken(),
164
+ checkCkc()
165
+ ]);
166
+ setDeviceStatus({
167
+ idcard: idcard.status === "fulfilled" && idcard.value,
168
+ baikey: baikey.status === "fulfilled" && baikey.value,
169
+ ckc: ckc.status === "fulfilled" && ckc.value
170
+ });
171
+ } catch (err) {
172
+ console.error("E-IMZO: Failed to load keys", err);
173
+ } finally {
174
+ setIsLoading(false);
175
+ }
176
+ }, []);
177
+ const sign = (0, import_react.useCallback)(
178
+ async ({ keyId, data }) => {
179
+ setIsLoading(true);
180
+ try {
181
+ let id;
182
+ if (typeof keyId === "object") {
183
+ id = await loadKey(keyId);
184
+ } else {
185
+ id = keyId;
186
+ }
187
+ const pkcs7 = await createPkcs7(id, data);
188
+ return pkcs7;
189
+ } finally {
190
+ setIsLoading(false);
191
+ }
192
+ },
193
+ []
194
+ );
195
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
196
+ EimzoContext.Provider,
197
+ {
198
+ value: {
199
+ isInstalled,
200
+ isLoading,
201
+ keyList,
202
+ deviceStatus,
203
+ loadKeys,
204
+ sign
205
+ },
206
+ children
207
+ }
208
+ );
209
+ }
210
+ function useEimzo() {
211
+ const context = (0, import_react.useContext)(EimzoContext);
212
+ if (!context) {
213
+ throw new Error("useEimzo must be used within EimzoProvider");
214
+ }
215
+ return context;
216
+ }
217
+ // Annotate the CommonJS export names for ESM import in node:
218
+ 0 && (module.exports = {
219
+ EimzoProvider,
220
+ useEimzo
221
+ });
@@ -0,0 +1,57 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type TKeyType = 'pfx' | 'ftjc' | 'idcard' | 'baikey' | 'ckc';
5
+ interface ICertificate {
6
+ disk: string;
7
+ path: string;
8
+ name: string;
9
+ alias: string;
10
+ serialNumber: string;
11
+ validFrom: Date;
12
+ validTo: Date;
13
+ CN: string;
14
+ TIN: string;
15
+ UID: string;
16
+ PINFL: string;
17
+ O: string;
18
+ T: string;
19
+ type: TKeyType;
20
+ cardUID?: string;
21
+ statusInfo?: string;
22
+ ownerName?: string;
23
+ info?: string;
24
+ expired?: boolean;
25
+ }
26
+ interface ISignParams {
27
+ keyId: ICertificate | string;
28
+ data: string;
29
+ }
30
+ interface IDeviceStatus {
31
+ idcard: boolean;
32
+ baikey: boolean;
33
+ ckc: boolean;
34
+ }
35
+ interface IEimzoProviderProps$1 {
36
+ apiKeys?: string[];
37
+ sdkPath?: string;
38
+ children: React.ReactNode;
39
+ }
40
+ interface IEimzoContext {
41
+ isInstalled: boolean;
42
+ isLoading: boolean;
43
+ keyList: ICertificate[];
44
+ deviceStatus: IDeviceStatus;
45
+ loadKeys: () => Promise<void>;
46
+ sign: (params: ISignParams) => Promise<string>;
47
+ }
48
+
49
+ interface IEimzoProviderProps {
50
+ apiKeys?: string[];
51
+ sdkPath?: string;
52
+ children: ReactNode;
53
+ }
54
+ declare function EimzoProvider({ apiKeys, sdkPath, children }: IEimzoProviderProps): react_jsx_runtime.JSX.Element;
55
+ declare function useEimzo(): IEimzoContext;
56
+
57
+ export { EimzoProvider, type ICertificate, type IDeviceStatus, type IEimzoContext, type IEimzoProviderProps$1 as IEimzoProviderProps, type ISignParams, type TKeyType, useEimzo };
@@ -0,0 +1,57 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ReactNode } from 'react';
3
+
4
+ type TKeyType = 'pfx' | 'ftjc' | 'idcard' | 'baikey' | 'ckc';
5
+ interface ICertificate {
6
+ disk: string;
7
+ path: string;
8
+ name: string;
9
+ alias: string;
10
+ serialNumber: string;
11
+ validFrom: Date;
12
+ validTo: Date;
13
+ CN: string;
14
+ TIN: string;
15
+ UID: string;
16
+ PINFL: string;
17
+ O: string;
18
+ T: string;
19
+ type: TKeyType;
20
+ cardUID?: string;
21
+ statusInfo?: string;
22
+ ownerName?: string;
23
+ info?: string;
24
+ expired?: boolean;
25
+ }
26
+ interface ISignParams {
27
+ keyId: ICertificate | string;
28
+ data: string;
29
+ }
30
+ interface IDeviceStatus {
31
+ idcard: boolean;
32
+ baikey: boolean;
33
+ ckc: boolean;
34
+ }
35
+ interface IEimzoProviderProps$1 {
36
+ apiKeys?: string[];
37
+ sdkPath?: string;
38
+ children: React.ReactNode;
39
+ }
40
+ interface IEimzoContext {
41
+ isInstalled: boolean;
42
+ isLoading: boolean;
43
+ keyList: ICertificate[];
44
+ deviceStatus: IDeviceStatus;
45
+ loadKeys: () => Promise<void>;
46
+ sign: (params: ISignParams) => Promise<string>;
47
+ }
48
+
49
+ interface IEimzoProviderProps {
50
+ apiKeys?: string[];
51
+ sdkPath?: string;
52
+ children: ReactNode;
53
+ }
54
+ declare function EimzoProvider({ apiKeys, sdkPath, children }: IEimzoProviderProps): react_jsx_runtime.JSX.Element;
55
+ declare function useEimzo(): IEimzoContext;
56
+
57
+ export { EimzoProvider, type ICertificate, type IDeviceStatus, type IEimzoContext, type IEimzoProviderProps$1 as IEimzoProviderProps, type ISignParams, type TKeyType, useEimzo };
package/dist/index.js ADDED
@@ -0,0 +1,199 @@
1
+ // src/provider.tsx
2
+ import {
3
+ createContext,
4
+ useContext,
5
+ useState,
6
+ useCallback,
7
+ useEffect
8
+ } from "react";
9
+
10
+ // src/eimzo.ts
11
+ var sdkLoaded = false;
12
+ function loadSDK(sdkPath) {
13
+ return new Promise((resolve, reject) => {
14
+ if (sdkLoaded || typeof EIMZOClient !== "undefined") {
15
+ sdkLoaded = true;
16
+ resolve();
17
+ return;
18
+ }
19
+ const script = document.createElement("script");
20
+ script.src = sdkPath || "/e-imzo.js";
21
+ script.onload = () => {
22
+ sdkLoaded = true;
23
+ resolve();
24
+ };
25
+ script.onerror = () => reject("Failed to load E-IMZO SDK");
26
+ document.head.appendChild(script);
27
+ });
28
+ }
29
+ function checkVersion() {
30
+ return new Promise((resolve, reject) => {
31
+ EIMZOClient.checkVersion(
32
+ (major, minor) => resolve({ major, minor }),
33
+ (e, r) => reject(r || e)
34
+ );
35
+ });
36
+ }
37
+ function installApiKeys(apiKeys) {
38
+ return new Promise((resolve, reject) => {
39
+ if (apiKeys) {
40
+ EIMZOClient.API_KEYS = [
41
+ ...EIMZOClient.API_KEYS,
42
+ ...apiKeys
43
+ ];
44
+ }
45
+ EIMZOClient.installApiKeys(
46
+ () => resolve(),
47
+ (e, r) => reject(r || e)
48
+ );
49
+ });
50
+ }
51
+ function listAllUserKeys() {
52
+ return new Promise((resolve, reject) => {
53
+ const certs = [];
54
+ EIMZOClient.listAllUserKeys(
55
+ (o, i) => `itm-${o.serialNumber}-${i}`,
56
+ (_itemId, vo) => {
57
+ const cert = {
58
+ ...vo,
59
+ expired: new Date(vo.validTo) < /* @__PURE__ */ new Date()
60
+ };
61
+ certs.push(cert);
62
+ return cert;
63
+ },
64
+ () => resolve(certs),
65
+ (e, r) => reject(r || e)
66
+ );
67
+ });
68
+ }
69
+ function loadKey(cert) {
70
+ return new Promise((resolve, reject) => {
71
+ EIMZOClient.loadKey(
72
+ cert,
73
+ (id) => resolve(id),
74
+ (e, r) => reject(r || e)
75
+ );
76
+ });
77
+ }
78
+ function createPkcs7(keyId, data) {
79
+ return new Promise((resolve, reject) => {
80
+ EIMZOClient.createPkcs7(
81
+ keyId,
82
+ data,
83
+ null,
84
+ (pkcs7) => resolve(pkcs7),
85
+ (e, r) => reject(r || e),
86
+ false
87
+ );
88
+ });
89
+ }
90
+ function checkIdCard() {
91
+ return new Promise((resolve, reject) => {
92
+ EIMZOClient.idCardIsPLuggedIn(
93
+ (plugged) => resolve(plugged),
94
+ (e, r) => reject(r || e)
95
+ );
96
+ });
97
+ }
98
+ function checkBaikToken() {
99
+ return new Promise((resolve, reject) => {
100
+ EIMZOClient.isBAIKTokenPLuggedIn(
101
+ (plugged) => resolve(plugged),
102
+ (e, r) => reject(r || e)
103
+ );
104
+ });
105
+ }
106
+ function checkCkc() {
107
+ return new Promise((resolve, reject) => {
108
+ EIMZOClient.isCKCPLuggedIn(
109
+ (plugged) => resolve(plugged),
110
+ (e, r) => reject(r || e)
111
+ );
112
+ });
113
+ }
114
+ async function install(apiKeys, sdkPath) {
115
+ await loadSDK(sdkPath);
116
+ await checkVersion();
117
+ await installApiKeys(apiKeys);
118
+ }
119
+
120
+ // src/provider.tsx
121
+ import { jsx } from "react/jsx-runtime";
122
+ var EimzoContext = createContext(null);
123
+ function EimzoProvider({ apiKeys, sdkPath, children }) {
124
+ const [isInstalled, setIsInstalled] = useState(false);
125
+ const [isLoading, setIsLoading] = useState(false);
126
+ const [keyList, setKeyList] = useState([]);
127
+ const [deviceStatus, setDeviceStatus] = useState({
128
+ idcard: false,
129
+ baikey: false,
130
+ ckc: false
131
+ });
132
+ useEffect(() => {
133
+ install(apiKeys, sdkPath).then(() => setIsInstalled(true)).catch(() => setIsInstalled(false));
134
+ }, []);
135
+ const loadKeys = useCallback(async () => {
136
+ setIsLoading(true);
137
+ try {
138
+ const certs = await listAllUserKeys();
139
+ setKeyList(certs);
140
+ const [idcard, baikey, ckc] = await Promise.allSettled([
141
+ checkIdCard(),
142
+ checkBaikToken(),
143
+ checkCkc()
144
+ ]);
145
+ setDeviceStatus({
146
+ idcard: idcard.status === "fulfilled" && idcard.value,
147
+ baikey: baikey.status === "fulfilled" && baikey.value,
148
+ ckc: ckc.status === "fulfilled" && ckc.value
149
+ });
150
+ } catch (err) {
151
+ console.error("E-IMZO: Failed to load keys", err);
152
+ } finally {
153
+ setIsLoading(false);
154
+ }
155
+ }, []);
156
+ const sign = useCallback(
157
+ async ({ keyId, data }) => {
158
+ setIsLoading(true);
159
+ try {
160
+ let id;
161
+ if (typeof keyId === "object") {
162
+ id = await loadKey(keyId);
163
+ } else {
164
+ id = keyId;
165
+ }
166
+ const pkcs7 = await createPkcs7(id, data);
167
+ return pkcs7;
168
+ } finally {
169
+ setIsLoading(false);
170
+ }
171
+ },
172
+ []
173
+ );
174
+ return /* @__PURE__ */ jsx(
175
+ EimzoContext.Provider,
176
+ {
177
+ value: {
178
+ isInstalled,
179
+ isLoading,
180
+ keyList,
181
+ deviceStatus,
182
+ loadKeys,
183
+ sign
184
+ },
185
+ children
186
+ }
187
+ );
188
+ }
189
+ function useEimzo() {
190
+ const context = useContext(EimzoContext);
191
+ if (!context) {
192
+ throw new Error("useEimzo must be used within EimzoProvider");
193
+ }
194
+ return context;
195
+ }
196
+ export {
197
+ EimzoProvider,
198
+ useEimzo
199
+ };
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@islom929/react-eimzo",
3
+ "version": "0.1.0",
4
+ "description": "Headless E-IMZO digital signature integration for React",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup && cp src/e-imzo.js dist/e-imzo.js",
21
+ "dev": "tsup --watch",
22
+ "lint": "tsc --noEmit"
23
+ },
24
+ "peerDependencies": {
25
+ "react": ">=18.0.0",
26
+ "react-dom": ">=18.0.0"
27
+ },
28
+ "devDependencies": {
29
+ "@types/react": "^18.3.12",
30
+ "@types/react-dom": "^18.3.1",
31
+ "react": "^18.3.1",
32
+ "react-dom": "^18.3.1",
33
+ "tsup": "^8.4.0",
34
+ "typescript": "~5.6.2"
35
+ },
36
+ "keywords": [
37
+ "eimzo",
38
+ "e-imzo",
39
+ "digital-signature",
40
+ "pkcs7",
41
+ "react",
42
+ "uzbekistan"
43
+ ],
44
+ "license": "MIT"
45
+ }