/
bitwise.ts
68 lines (61 loc) · 2.1 KB
/
bitwise.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { binsAreEqual } from '../../../format/format.js';
import type {
AuthenticationProgramStateError,
AuthenticationProgramStateStack,
Operation,
} from '../../../lib.js';
import {
combineOperations,
pushToStack,
useTwoStackItems,
} from './combinators.js';
import { applyError, AuthenticationErrorCommon } from './errors.js';
import { opVerify } from './flow-control.js';
import { booleanToVmNumber } from './instruction-sets-utils.js';
export const opEqual = <
State extends AuthenticationProgramStateError &
AuthenticationProgramStateStack,
>(
state: State,
) =>
useTwoStackItems(state, (nextState, [element1, element2]) =>
pushToStack(nextState, booleanToVmNumber(binsAreEqual(element1, element2))),
);
export const opEqualVerify = combineOperations(opEqual, opVerify);
export const bitwiseOperation =
<
State extends AuthenticationProgramStateError &
AuthenticationProgramStateStack,
>(
combine: (a: Uint8Array, b: Uint8Array) => Uint8Array,
): Operation<State> =>
(state: State) =>
useTwoStackItems(state, (nextState, [a, b]) =>
a.length === b.length
? pushToStack(nextState, combine(a, b))
: applyError(
nextState,
AuthenticationErrorCommon.mismatchedBitwiseOperandLength,
),
);
// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion
export const opAnd = bitwiseOperation((a, b) => a.map((v, i) => v & b[i]!)) as <
State extends AuthenticationProgramStateError &
AuthenticationProgramStateStack,
>(
state: State,
) => State;
// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion
export const opOr = bitwiseOperation((a, b) => a.map((v, i) => v | b[i]!)) as <
State extends AuthenticationProgramStateError &
AuthenticationProgramStateStack,
>(
state: State,
) => State;
// eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion
export const opXor = bitwiseOperation((a, b) => a.map((v, i) => v ^ b[i]!)) as <
State extends AuthenticationProgramStateError &
AuthenticationProgramStateStack,
>(
state: State,
) => State;