finitefields 0.0.5 → 0.0.6

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.
Files changed (4) hide show
  1. package/galois.ts +86 -27
  2. package/main.js +2 -0
  3. package/main.ts +2 -0
  4. package/package.json +1 -1
package/galois.ts CHANGED
@@ -19,17 +19,16 @@ fail = (...args:any[]): never => {
19
19
  return void 0 as never;
20
20
  }
21
21
 
22
- const arithmetics = (p:bigint,op:fieldops) =>
22
+ const arithmeticsℤp = (p:bigint,op:fieldops) =>
23
23
  (op==fieldops.$add) ?
24
- (a:bigint,b:bigint) => (a+b)%p :
24
+ (a:bigint,b:bigint=0n) => (a+b)%p :
25
25
  (op==fieldops.$sub) ?
26
- (a:bigint,b:bigint) => (a-b)%p :
26
+ (a:bigint,b:bigint=0n) => ((a-b)<1)?(a-b+p):(a-b)%p :
27
27
  (op==fieldops.$mul) ?
28
- (a:bigint,b:bigint) => (a*b)%p :
29
- (op==fieldops.$div) ?
30
- (a:bigint,b:bigint) => (b%p)?(a/b)%p:fail() :
31
- fail();
32
-
28
+ (a:bigint,b:bigint=0n) => (a*b)%p :
29
+ (op==fieldops.$inv) ?
30
+ (a:bigint) => (!a)?fail('0 has no inverse'):Util.sqmul(a,(p-2n),p) :
31
+ fail('unknown field operation');
33
32
 
34
33
  Util = {
35
34
  countbits(x:bigint): bigint {
@@ -87,6 +86,45 @@ Util = {
87
86
  return (val%max);
88
87
  else
89
88
  return val;
89
+ },
90
+
91
+ eea(x:bigint,p:bigint): bigint {
92
+ return fail('eea() not implemented') as never;
93
+ },
94
+
95
+ sqmul(a:bigint,e:bigint,p:bigint): bigint {
96
+ let bitstring:boolean[];
97
+ let bitlen:bigint;
98
+ let n:bigint;
99
+ let val:bigint;
100
+ let mul:(y:bigint,z:bigint,p_:bigint)=>bigint;
101
+ let sq:(y:bigint,p_:bigint)=>bigint;
102
+
103
+ log(`${a}^${e} (mod ${p}) = `);
104
+
105
+ mul = (y:bigint,z:bigint,p_:bigint):bigint => ((y*z)%p_);
106
+ sq = (y:bigint,p_:bigint):bigint => ((y*y)%p_);
107
+
108
+ val = a;
109
+ bitlen = this.countbits(e);
110
+ if (!bitlen)
111
+ return fail('error: n ≯ 0');
112
+ n = (bitlen-1n);
113
+ bitstring = new Array<boolean>(Number(bitlen))
114
+ .fill(false,0,Number(bitlen))
115
+ .map((x:boolean,idx:number):boolean =>
116
+ (((e>>n--)&1n)===1n) && (!!idx));
117
+ // log(bitstring.map((x:boolean):number => (x)?1:0));
118
+ bitstring
119
+ .forEach((x:boolean):void => {
120
+ val = (x) ?
121
+ mul(a,sq(val,p),p) :
122
+ sq(a,p);
123
+
124
+ return void 0;
125
+ });
126
+
127
+ return (val%p);
90
128
  }
91
129
  }
92
130
 
@@ -94,10 +132,14 @@ enum fieldops {
94
132
  $add,
95
133
  $sub,
96
134
  $mul,
97
- $div
135
+ $inv
98
136
  }
99
137
 
100
138
  interface Igalois {
139
+ add: (a:bigint,b:bigint)=>bigint;
140
+ sub: (a:bigint,b:bigint)=>bigint;
141
+ mul: (a:bigint,b:bigint)=>bigint;
142
+ inv: (a:bigint)=>bigint;
101
143
  verify:()=>void;
102
144
  constructor:Function;
103
145
  }
@@ -106,38 +148,55 @@ interface Iutil {
106
148
  isprime: (p:bigint,bitlen?:bigint,s?:number)=>boolean;
107
149
  countbits: (x:bigint)=>bigint;
108
150
  rnd: (bitlen:bigint,max:bigint)=>bigint;
151
+ eea: (x:bigint,p:bigint)=>bigint;
152
+ sqmul: (a:bigint,e:bigint,p:bigint)=>bigint;
109
153
  }
110
154
 
111
- class GF implements Igalois {
112
- private modulus: bigint;
113
- private bitlen: bigint;
114
- private add: (a:bigint,b:bigint)=>bigint;
115
- private sub: typeof this.add;
116
- private mul: typeof this.add;
117
- private div: typeof this.add;
155
+ abstract class GF implements Igalois {
156
+ protected modulus: bigint;
157
+ protected bitlen: bigint;
158
+ public abstract add: (a:bigint,b:bigint)=>bigint;
159
+ public abstract sub: typeof this.add;
160
+ public abstract mul: typeof this.add;
161
+ public abstract inv: (a:bigint)=>bigint;
162
+
163
+ public abstract verify(): void;
164
+
165
+ constructor(field:bigint,bitlen:bigint) {
166
+ this.modulus = field;
167
+ this.bitlen = bitlen;
168
+ this.verify();
169
+
170
+ return this;
171
+ }
172
+
173
+ }
174
+
175
+ class PrimeField extends GF implements Igalois {
176
+ public add: (a:bigint,b:bigint)=>bigint;
177
+ public sub: typeof this.add;
178
+ public mul: typeof this.add;
179
+ public inv: (a:bigint)=>bigint;
118
180
 
119
181
  public verify(): void {
120
182
  if (!Util.isprime(this.modulus))
121
- return fail(this.modulus, 'needs to be prime');
183
+ return fail('error: p ');
122
184
  else if (Util.countbits(this.modulus) > this.bitlen)
123
- return fail(this.modulus, 'does not fit in bitlen:', this.bitlen);
185
+ return fail('error: p ≮ 2ⁿ', this.bitlen);
124
186
 
125
187
  return void 0;
126
188
  }
127
189
 
128
190
  constructor(field:bigint,bitlen:bigint) {
129
- this.modulus = field;
130
- this.bitlen = bitlen;
131
- this.verify();
132
-
133
- this.add = arithmetics(this.modulus, fieldops.$add);
134
- this.sub = arithmetics(this.modulus, fieldops.$sub);
135
- this.mul = arithmetics(this.modulus, fieldops.$mul);
136
- this.div = arithmetics(this.modulus, fieldops.$div);
191
+ super(field,bitlen);
192
+ this.add = arithmeticsℤp(this.modulus, fieldops.$add);
193
+ this.sub = arithmeticsℤp(this.modulus, fieldops.$sub);
194
+ this.mul = arithmeticsℤp(this.modulus, fieldops.$mul);
195
+ this.inv = arithmeticsℤp(this.modulus, fieldops.$inv);
137
196
 
138
197
  return this;
139
198
  }
140
199
 
141
200
  }
142
201
 
143
- export { Util, GF };
202
+ export { Util, PrimeField };
package/main.js CHANGED
@@ -1,5 +1,6 @@
1
1
  /* main.ts */
2
2
  import { Polynomial } from './polynomial.js';
3
+ import { Util, PrimeField } from './galois.js';
3
4
  let log;
4
5
  log = console.log;
5
6
  let p1;
@@ -20,4 +21,5 @@ p2 = new Polynomial({ tobject: 0n, x3: 1n, x2: 0n, x: 1n, 1: 1n }, 2n);
20
21
  p3 = new Polynomial(1n << 254n, 2n);
21
22
  log(p3, p3.eval());
22
23
  // log(p3.eval());
24
+ export { Polynomial, Util, PrimeField };
23
25
  //# sourceMappingURL=main.js.map
package/main.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /* main.ts */
2
2
  import { Polynomial } from './polynomial.js';
3
+ import { Util,PrimeField } from './galois.js';
3
4
 
4
5
  let log:(...x:any[])=>void;
5
6
  log = console.log;
@@ -26,3 +27,4 @@ p3 = new Polynomial(1n<<254n, 2n);
26
27
  log(p3, p3.eval());
27
28
  // log(p3.eval());
28
29
 
30
+ export { Polynomial,Util,PrimeField };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "finitefields",
3
3
  "type": "module",
4
- "version": "0.0.5",
4
+ "version": "0.0.6",
5
5
  "description": "Galois/Finite field crypto and raw elliptic curves",
6
6
  "main": "main.js",
7
7
  "scripts": {