UNPKG

@li0ard/crapto1_ts

Version:
39 lines (38 loc) 1.05 kB
import { bit, filter } from "./utils"; /** Crypto1 state */ export class Crypto1State { odd; even; constructor(odd = 0, even = 0) { this.odd = odd; this.even = even; } /** * Initialize state from key (aka LFSR value) * @param key * @returns */ static fromKey(key) { let odd = 0n; let even = 0n; const bitBigInt = (x, n) => ((x >> BigInt(n)) & 1n); for (let i = 47; i > 0; i -= 2) { odd = odd << 1n | bitBigInt(key, (i - 1) ^ 7); even = even << 1n | bitBigInt(key, i ^ 7); } return new Crypto1State(Number(odd), Number(even)); } /** Get LFSR value (aka Key) */ get lfsr() { let lfsr = 0n; for (let i = 23; i >= 0; --i) { lfsr = lfsr << 1n | BigInt(bit(this.odd, i ^ 3)); lfsr = lfsr << 1n | BigInt(bit(this.even, i ^ 3)); } return lfsr; } /** Get filtered state `odd` value */ get peekCrypto1Bit() { return filter(this.odd); } }