Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
80575 views
1
'use strict';
2
3
var utils = exports;
4
5
utils.assert = function assert(val, msg) {
6
if (!val)
7
throw new Error(msg || 'Assertion failed');
8
};
9
10
function toArray(msg, enc) {
11
if (Array.isArray(msg))
12
return msg.slice();
13
if (!msg)
14
return [];
15
var res = [];
16
if (typeof msg !== 'string') {
17
for (var i = 0; i < msg.length; i++)
18
res[i] = msg[i] | 0;
19
return res;
20
}
21
if (!enc) {
22
for (var i = 0; i < msg.length; i++) {
23
var c = msg.charCodeAt(i);
24
var hi = c >> 8;
25
var lo = c & 0xff;
26
if (hi)
27
res.push(hi, lo);
28
else
29
res.push(lo);
30
}
31
} else if (enc === 'hex') {
32
msg = msg.replace(/[^a-z0-9]+/ig, '');
33
if (msg.length % 2 !== 0)
34
msg = '0' + msg;
35
for (var i = 0; i < msg.length; i += 2)
36
res.push(parseInt(msg[i] + msg[i + 1], 16));
37
}
38
return res;
39
}
40
utils.toArray = toArray;
41
42
function zero2(word) {
43
if (word.length === 1)
44
return '0' + word;
45
else
46
return word;
47
}
48
utils.zero2 = zero2;
49
50
function toHex(msg) {
51
var res = '';
52
for (var i = 0; i < msg.length; i++)
53
res += zero2(msg[i].toString(16));
54
return res;
55
}
56
utils.toHex = toHex;
57
58
utils.encode = function encode(arr, enc) {
59
if (enc === 'hex')
60
return toHex(arr);
61
else
62
return arr;
63
};
64
65
// Represent num in a w-NAF form
66
function getNAF(num, w) {
67
var naf = [];
68
var ws = 1 << (w + 1);
69
var k = num.clone();
70
while (k.cmpn(1) >= 0) {
71
var z;
72
if (k.isOdd()) {
73
var mod = k.andln(ws - 1);
74
if (mod > (ws >> 1) - 1)
75
z = (ws >> 1) - mod;
76
else
77
z = mod;
78
k.isubn(z);
79
} else {
80
z = 0;
81
}
82
naf.push(z);
83
84
// Optimization, shift by word if possible
85
var shift = (k.cmpn(0) !== 0 && k.andln(ws - 1) === 0) ? (w + 1) : 1;
86
for (var i = 1; i < shift; i++)
87
naf.push(0);
88
k.ishrn(shift);
89
}
90
91
return naf;
92
}
93
utils.getNAF = getNAF;
94
95
// Represent k1, k2 in a Joint Sparse Form
96
function getJSF(k1, k2) {
97
var jsf = [
98
[],
99
[]
100
];
101
102
k1 = k1.clone();
103
k2 = k2.clone();
104
var d1 = 0;
105
var d2 = 0;
106
while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) {
107
108
// First phase
109
var m14 = (k1.andln(3) + d1) & 3;
110
var m24 = (k2.andln(3) + d2) & 3;
111
if (m14 === 3)
112
m14 = -1;
113
if (m24 === 3)
114
m24 = -1;
115
var u1;
116
if ((m14 & 1) === 0) {
117
u1 = 0;
118
} else {
119
var m8 = (k1.andln(7) + d1) & 7;
120
if ((m8 === 3 || m8 === 5) && m24 === 2)
121
u1 = -m14;
122
else
123
u1 = m14;
124
}
125
jsf[0].push(u1);
126
127
var u2;
128
if ((m24 & 1) === 0) {
129
u2 = 0;
130
} else {
131
var m8 = (k2.andln(7) + d2) & 7;
132
if ((m8 === 3 || m8 === 5) && m14 === 2)
133
u2 = -m24;
134
else
135
u2 = m24;
136
}
137
jsf[1].push(u2);
138
139
// Second phase
140
if (2 * d1 === u1 + 1)
141
d1 = 1 - d1;
142
if (2 * d2 === u2 + 1)
143
d2 = 1 - d2;
144
k1.ishrn(1);
145
k2.ishrn(1);
146
}
147
148
return jsf;
149
}
150
utils.getJSF = getJSF;
151
152