@li0ard/crapto1_ts
Version:
Crapto1 TypeScript implement
39 lines (38 loc) • 1.05 kB
JavaScript
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);
}
}