@mindpeeker/entropy 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +496 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/bits.d.ts +9 -0
- package/dist/internal/bits.d.ts.map +1 -0
- package/dist/internal/bits.js +29 -0
- package/dist/internal/bits.js.map +1 -0
- package/dist/internal/byte-source.d.ts +16 -0
- package/dist/internal/byte-source.d.ts.map +1 -0
- package/dist/internal/byte-source.js +96 -0
- package/dist/internal/byte-source.js.map +1 -0
- package/dist/internal/bytes.d.ts +5 -0
- package/dist/internal/bytes.d.ts.map +1 -0
- package/dist/internal/bytes.js +56 -0
- package/dist/internal/bytes.js.map +1 -0
- package/dist/internal/composite.d.ts +15 -0
- package/dist/internal/composite.d.ts.map +1 -0
- package/dist/internal/composite.js +36 -0
- package/dist/internal/composite.js.map +1 -0
- package/dist/internal/condition.d.ts +38 -0
- package/dist/internal/condition.d.ts.map +1 -0
- package/dist/internal/condition.js +49 -0
- package/dist/internal/condition.js.map +1 -0
- package/dist/internal/encoding.d.ts +14 -0
- package/dist/internal/encoding.d.ts.map +1 -0
- package/dist/internal/encoding.js +91 -0
- package/dist/internal/encoding.js.map +1 -0
- package/dist/internal/health.d.ts +25 -0
- package/dist/internal/health.d.ts.map +1 -0
- package/dist/internal/health.js +84 -0
- package/dist/internal/health.js.map +1 -0
- package/dist/internal/http.d.ts +25 -0
- package/dist/internal/http.d.ts.map +1 -0
- package/dist/internal/http.js +76 -0
- package/dist/internal/http.js.map +1 -0
- package/dist/internal/nist-pulse.d.ts +31 -0
- package/dist/internal/nist-pulse.d.ts.map +1 -0
- package/dist/internal/nist-pulse.js +62 -0
- package/dist/internal/nist-pulse.js.map +1 -0
- package/dist/internal/provider.d.ts +19 -0
- package/dist/internal/provider.d.ts.map +1 -0
- package/dist/internal/provider.js +62 -0
- package/dist/internal/provider.js.map +1 -0
- package/dist/internal/rate-limit.d.ts +15 -0
- package/dist/internal/rate-limit.d.ts.map +1 -0
- package/dist/internal/rate-limit.js +47 -0
- package/dist/internal/rate-limit.js.map +1 -0
- package/dist/internal/sampled.d.ts +25 -0
- package/dist/internal/sampled.d.ts.map +1 -0
- package/dist/internal/sampled.js +49 -0
- package/dist/internal/sampled.js.map +1 -0
- package/dist/internal/stream.d.ts +29 -0
- package/dist/internal/stream.d.ts.map +1 -0
- package/dist/internal/stream.js +78 -0
- package/dist/internal/stream.js.map +1 -0
- package/dist/internal/validate.d.ts +5 -0
- package/dist/internal/validate.d.ts.map +1 -0
- package/dist/internal/validate.js +39 -0
- package/dist/internal/validate.js.map +1 -0
- package/dist/node/ffmpeg-frames.d.ts +27 -0
- package/dist/node/ffmpeg-frames.d.ts.map +1 -0
- package/dist/node/ffmpeg-frames.js +102 -0
- package/dist/node/ffmpeg-frames.js.map +1 -0
- package/dist/node/ffmpeg-samples.d.ts +21 -0
- package/dist/node/ffmpeg-samples.d.ts.map +1 -0
- package/dist/node/ffmpeg-samples.js +81 -0
- package/dist/node/ffmpeg-samples.js.map +1 -0
- package/dist/node/hwrng.d.ts +12 -0
- package/dist/node/hwrng.d.ts.map +1 -0
- package/dist/node/hwrng.js +43 -0
- package/dist/node/hwrng.js.map +1 -0
- package/dist/node/index.d.ts +9 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +7 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/rtl-sdr.d.ts +31 -0
- package/dist/node/rtl-sdr.d.ts.map +1 -0
- package/dist/node/rtl-sdr.js +63 -0
- package/dist/node/rtl-sdr.js.map +1 -0
- package/dist/node/serial-source.d.ts +22 -0
- package/dist/node/serial-source.d.ts.map +1 -0
- package/dist/node/serial-source.js +63 -0
- package/dist/node/serial-source.js.map +1 -0
- package/dist/providers/anu-legacy.d.ts +17 -0
- package/dist/providers/anu-legacy.d.ts.map +1 -0
- package/dist/providers/anu-legacy.js +56 -0
- package/dist/providers/anu-legacy.js.map +1 -0
- package/dist/providers/anu.d.ts +14 -0
- package/dist/providers/anu.d.ts.map +1 -0
- package/dist/providers/anu.js +42 -0
- package/dist/providers/anu.js.map +1 -0
- package/dist/providers/bitcoin.d.ts +14 -0
- package/dist/providers/bitcoin.d.ts.map +1 -0
- package/dist/providers/bitcoin.js +95 -0
- package/dist/providers/bitcoin.js.map +1 -0
- package/dist/providers/camera.d.ts +49 -0
- package/dist/providers/camera.d.ts.map +1 -0
- package/dist/providers/camera.js +123 -0
- package/dist/providers/camera.js.map +1 -0
- package/dist/providers/crypto.d.ts +8 -0
- package/dist/providers/crypto.d.ts.map +1 -0
- package/dist/providers/crypto.js +26 -0
- package/dist/providers/crypto.js.map +1 -0
- package/dist/providers/curby.d.ts +17 -0
- package/dist/providers/curby.d.ts.map +1 -0
- package/dist/providers/curby.js +113 -0
- package/dist/providers/curby.js.map +1 -0
- package/dist/providers/drand.d.ts +19 -0
- package/dist/providers/drand.d.ts.map +1 -0
- package/dist/providers/drand.js +87 -0
- package/dist/providers/drand.js.map +1 -0
- package/dist/providers/flow.d.ts +15 -0
- package/dist/providers/flow.d.ts.map +1 -0
- package/dist/providers/flow.js +82 -0
- package/dist/providers/flow.js.map +1 -0
- package/dist/providers/index.d.ts +56 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +32 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/inmetro.d.ts +17 -0
- package/dist/providers/inmetro.d.ts.map +1 -0
- package/dist/providers/inmetro.js +25 -0
- package/dist/providers/inmetro.js.map +1 -0
- package/dist/providers/jitter.d.ts +33 -0
- package/dist/providers/jitter.d.ts.map +1 -0
- package/dist/providers/jitter.js +81 -0
- package/dist/providers/jitter.js.map +1 -0
- package/dist/providers/lfdr.d.ts +11 -0
- package/dist/providers/lfdr.d.ts.map +1 -0
- package/dist/providers/lfdr.js +34 -0
- package/dist/providers/lfdr.js.map +1 -0
- package/dist/providers/microphone.d.ts +26 -0
- package/dist/providers/microphone.d.ts.map +1 -0
- package/dist/providers/microphone.js +120 -0
- package/dist/providers/microphone.js.map +1 -0
- package/dist/providers/nist-beacon.d.ts +11 -0
- package/dist/providers/nist-beacon.d.ts.map +1 -0
- package/dist/providers/nist-beacon.js +20 -0
- package/dist/providers/nist-beacon.js.map +1 -0
- package/dist/providers/nqsn.d.ts +11 -0
- package/dist/providers/nqsn.d.ts.map +1 -0
- package/dist/providers/nqsn.js +16 -0
- package/dist/providers/nqsn.js.map +1 -0
- package/dist/providers/outshift.d.ts +14 -0
- package/dist/providers/outshift.d.ts.map +1 -0
- package/dist/providers/outshift.js +52 -0
- package/dist/providers/outshift.js.map +1 -0
- package/dist/providers/padova.d.ts +12 -0
- package/dist/providers/padova.d.ts.map +1 -0
- package/dist/providers/padova.js +56 -0
- package/dist/providers/padova.js.map +1 -0
- package/dist/providers/qbck.d.ts +13 -0
- package/dist/providers/qbck.d.ts.map +1 -0
- package/dist/providers/qbck.js +62 -0
- package/dist/providers/qbck.js.map +1 -0
- package/dist/providers/qci.d.ts +14 -0
- package/dist/providers/qci.d.ts.map +1 -0
- package/dist/providers/qci.js +91 -0
- package/dist/providers/qci.js.map +1 -0
- package/dist/providers/qrandom.d.ts +12 -0
- package/dist/providers/qrandom.d.ts.map +1 -0
- package/dist/providers/qrandom.js +39 -0
- package/dist/providers/qrandom.js.map +1 -0
- package/dist/providers/randao.d.ts +14 -0
- package/dist/providers/randao.d.ts.map +1 -0
- package/dist/providers/randao.js +81 -0
- package/dist/providers/randao.js.map +1 -0
- package/dist/providers/random-org.d.ts +13 -0
- package/dist/providers/random-org.d.ts.map +1 -0
- package/dist/providers/random-org.js +89 -0
- package/dist/providers/random-org.js.map +1 -0
- package/dist/providers/sdr.d.ts +21 -0
- package/dist/providers/sdr.d.ts.map +1 -0
- package/dist/providers/sdr.js +63 -0
- package/dist/providers/sdr.js.map +1 -0
- package/dist/providers/sensor.d.ts +24 -0
- package/dist/providers/sensor.d.ts.map +1 -0
- package/dist/providers/sensor.js +119 -0
- package/dist/providers/sensor.js.map +1 -0
- package/dist/providers/serial.d.ts +35 -0
- package/dist/providers/serial.d.ts.map +1 -0
- package/dist/providers/serial.js +78 -0
- package/dist/providers/serial.js.map +1 -0
- package/dist/providers/solana.d.ts +13 -0
- package/dist/providers/solana.d.ts.map +1 -0
- package/dist/providers/solana.js +83 -0
- package/dist/providers/solana.js.map +1 -0
- package/dist/providers/superrand.d.ts +35 -0
- package/dist/providers/superrand.d.ts.map +1 -0
- package/dist/providers/superrand.js +215 -0
- package/dist/providers/superrand.js.map +1 -0
- package/dist/providers/tezos.d.ts +13 -0
- package/dist/providers/tezos.d.ts.map +1 -0
- package/dist/providers/tezos.js +92 -0
- package/dist/providers/tezos.js.map +1 -0
- package/dist/providers/uchile.d.ts +11 -0
- package/dist/providers/uchile.d.ts.map +1 -0
- package/dist/providers/uchile.js +22 -0
- package/dist/providers/uchile.js.map +1 -0
- package/dist/strategies/fallback.d.ts +12 -0
- package/dist/strategies/fallback.d.ts.map +1 -0
- package/dist/strategies/fallback.js +45 -0
- package/dist/strategies/fallback.js.map +1 -0
- package/dist/strategies/race.d.ts +7 -0
- package/dist/strategies/race.d.ts.map +1 -0
- package/dist/strategies/race.js +41 -0
- package/dist/strategies/race.js.map +1 -0
- package/dist/strategies/xor.d.ts +9 -0
- package/dist/strategies/xor.d.ts.map +1 -0
- package/dist/strategies/xor.js +56 -0
- package/dist/strategies/xor.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { EntropyError } from '../errors.js';
|
|
2
|
+
import { concatBytes, hexToBytes } from '../internal/bytes.js';
|
|
3
|
+
import { fetchJson } from '../internal/http.js';
|
|
4
|
+
import { defineProvider } from '../internal/provider.js';
|
|
5
|
+
import { beaconStream } from '../internal/stream.js';
|
|
6
|
+
const INFO = Object.freeze({
|
|
7
|
+
name: 'drand',
|
|
8
|
+
kind: 'beacon',
|
|
9
|
+
privacy: 'public',
|
|
10
|
+
});
|
|
11
|
+
const ROUND_BYTES = 32;
|
|
12
|
+
const DEFAULT_BASE_URLS = ['https://api.drand.sh', 'https://api2.drand.sh', 'https://api3.drand.sh'];
|
|
13
|
+
// quicknet emits a round every 3 seconds.
|
|
14
|
+
const DEFAULT_POLL_INTERVAL_MS = 3000;
|
|
15
|
+
/**
|
|
16
|
+
* drand / League of Entropy distributed randomness beacon (threshold BLS).
|
|
17
|
+
* PUBLIC randomness: everyone sees every round — never seed secrets from it
|
|
18
|
+
* alone; combine via `xorMix` with a private source for auditable secrets.
|
|
19
|
+
* Randomness is derived as SHA-256(signature), as specified for unchained
|
|
20
|
+
* beacons like quicknet.
|
|
21
|
+
*/
|
|
22
|
+
export function drand(opts = {}) {
|
|
23
|
+
const { baseUrls = DEFAULT_BASE_URLS, beacon = 'quicknet', pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, fetch: fetchImpl, } = opts;
|
|
24
|
+
async function fetchRound(which, signal) {
|
|
25
|
+
let lastError;
|
|
26
|
+
for (const base of baseUrls) {
|
|
27
|
+
try {
|
|
28
|
+
const res = await fetchJson(`${base}/v2/beacons/${beacon}/rounds/${which}`, {
|
|
29
|
+
provider: INFO.name,
|
|
30
|
+
signal,
|
|
31
|
+
fetchImpl,
|
|
32
|
+
});
|
|
33
|
+
const { round, signature } = res ?? {};
|
|
34
|
+
if (!Number.isInteger(round) || typeof signature !== 'string' || signature.length === 0) {
|
|
35
|
+
throw new EntropyError('bad_response', 'malformed drand round', { provider: INFO.name });
|
|
36
|
+
}
|
|
37
|
+
return { round: round, signature };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (!(error instanceof EntropyError) || error.code === 'aborted')
|
|
41
|
+
throw error;
|
|
42
|
+
lastError = error; // try the next mirror
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw lastError;
|
|
46
|
+
}
|
|
47
|
+
async function randomnessOf(signature) {
|
|
48
|
+
let sigBytes;
|
|
49
|
+
try {
|
|
50
|
+
sigBytes = hexToBytes(signature);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
throw new EntropyError('bad_response', 'invalid signature hex', {
|
|
54
|
+
provider: INFO.name,
|
|
55
|
+
cause: error,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return new Uint8Array(await crypto.subtle.digest('SHA-256', sigBytes));
|
|
59
|
+
}
|
|
60
|
+
return defineProvider({
|
|
61
|
+
...INFO,
|
|
62
|
+
defaultChunkBytes: ROUND_BYTES,
|
|
63
|
+
async getBytes(length, reqOpts) {
|
|
64
|
+
const roundsNeeded = Math.ceil(length / ROUND_BYTES);
|
|
65
|
+
const latest = await fetchRound('latest', reqOpts?.signal);
|
|
66
|
+
const chunks = [await randomnessOf(latest.signature)];
|
|
67
|
+
// Past rounds are just as public as the latest one — walk backwards.
|
|
68
|
+
for (let i = 1; i < roundsNeeded; i++) {
|
|
69
|
+
const round = latest.round - i;
|
|
70
|
+
if (round < 1) {
|
|
71
|
+
throw new EntropyError('insufficient_entropy', 'drand chain too short for request', {
|
|
72
|
+
provider: INFO.name,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
chunks.push(await randomnessOf((await fetchRound(round, reqOpts?.signal)).signature));
|
|
76
|
+
}
|
|
77
|
+
return { bytes: concatBytes(chunks).slice(0, length), sources: [INFO] };
|
|
78
|
+
},
|
|
79
|
+
stream(streamOpts = {}) {
|
|
80
|
+
return beaconStream(async (signal) => {
|
|
81
|
+
const { round, signature } = await fetchRound('latest', signal);
|
|
82
|
+
return { id: round, bytes: await randomnessOf(signature) };
|
|
83
|
+
}, pollIntervalMs, ROUND_BYTES, INFO.name, streamOpts);
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=drand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drand.js","sourceRoot":"","sources":["../../src/providers/drand.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EntropyProvider } from '../types.js';
|
|
2
|
+
export interface FlowBeaconOptions {
|
|
3
|
+
fetch?: typeof fetch;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
/** Wait between retries when consecutive draws are identical. Default 1000. */
|
|
6
|
+
retryDelayMs?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Flow protocol randomness via keyless script execution (`revertibleRandom`)
|
|
10
|
+
* on the public access node. PUBLIC crypto-beacon class: 8 bytes per call,
|
|
11
|
+
* re-derived per execution from Flow's DKG random beacon. Rate limits apply
|
|
12
|
+
* on the public node.
|
|
13
|
+
*/
|
|
14
|
+
export declare function flowBeacon(opts?: FlowBeaconOptions): EntropyProvider;
|
|
15
|
+
//# sourceMappingURL=flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../src/providers/flow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAA;AASrE,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,eAAe,CAoExE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { EntropyError } from '../errors.js';
|
|
2
|
+
import { base64ToBytes, concatBytes } from '../internal/bytes.js';
|
|
3
|
+
import { fetchJson } from '../internal/http.js';
|
|
4
|
+
import { defineProvider } from '../internal/provider.js';
|
|
5
|
+
import { sleep } from '../internal/rate-limit.js';
|
|
6
|
+
const INFO = Object.freeze({ name: 'flow', kind: 'beacon', privacy: 'public' });
|
|
7
|
+
const DRAW_BYTES = 8;
|
|
8
|
+
const DEFAULT_BASE_URL = 'https://rest-mainnet.onflow.org';
|
|
9
|
+
const CADENCE_SCRIPT = 'access(all) fun main(): UInt64 { return revertibleRandom<UInt64>() }';
|
|
10
|
+
const SCRIPT_B64 = btoa(CADENCE_SCRIPT);
|
|
11
|
+
/**
|
|
12
|
+
* Flow protocol randomness via keyless script execution (`revertibleRandom`)
|
|
13
|
+
* on the public access node. PUBLIC crypto-beacon class: 8 bytes per call,
|
|
14
|
+
* re-derived per execution from Flow's DKG random beacon. Rate limits apply
|
|
15
|
+
* on the public node.
|
|
16
|
+
*/
|
|
17
|
+
export function flowBeacon(opts = {}) {
|
|
18
|
+
const { baseUrl = DEFAULT_BASE_URL, retryDelayMs = 1000, fetch: fetchImpl } = opts;
|
|
19
|
+
async function fetchDraw(signal) {
|
|
20
|
+
// The response is DOUBLE-encoded: a JSON string containing base64 of a
|
|
21
|
+
// JSON-Cadence value (plus a trailing newline).
|
|
22
|
+
const outer = await fetchJson(`${baseUrl}/v1/scripts?block_height=sealed`, {
|
|
23
|
+
provider: INFO.name,
|
|
24
|
+
method: 'POST',
|
|
25
|
+
body: { script: SCRIPT_B64, arguments: [] },
|
|
26
|
+
signal,
|
|
27
|
+
fetchImpl,
|
|
28
|
+
});
|
|
29
|
+
if (typeof outer !== 'string') {
|
|
30
|
+
throw new EntropyError('bad_response', 'expected a base64 script result', {
|
|
31
|
+
provider: INFO.name,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const inner = new TextDecoder().decode(base64ToBytes(outer)).trim();
|
|
36
|
+
const cadence = JSON.parse(inner);
|
|
37
|
+
if (cadence.type !== 'UInt64' || typeof cadence.value !== 'string') {
|
|
38
|
+
throw new Error(`unexpected Cadence value of type ${cadence.type}`);
|
|
39
|
+
}
|
|
40
|
+
return BigInt(cadence.value);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof EntropyError)
|
|
44
|
+
throw error;
|
|
45
|
+
throw new EntropyError('bad_response', 'malformed JSON-Cadence payload', {
|
|
46
|
+
provider: INFO.name,
|
|
47
|
+
cause: error,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function drawToBytes(value) {
|
|
52
|
+
const out = new Uint8Array(DRAW_BYTES);
|
|
53
|
+
for (let i = 0; i < DRAW_BYTES; i++) {
|
|
54
|
+
out[i] = Number((value >> BigInt(8 * (DRAW_BYTES - 1 - i))) & 0xffn);
|
|
55
|
+
}
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
let lastDraw = null;
|
|
59
|
+
async function nextFreshDraw(signal) {
|
|
60
|
+
while (true) {
|
|
61
|
+
const draw = await fetchDraw(signal);
|
|
62
|
+
if (draw !== lastDraw) {
|
|
63
|
+
lastDraw = draw;
|
|
64
|
+
return draw;
|
|
65
|
+
}
|
|
66
|
+
// identical consecutive draws — likely the same sealed block; wait it out
|
|
67
|
+
await sleep(retryDelayMs, signal);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return defineProvider({
|
|
71
|
+
...INFO,
|
|
72
|
+
defaultChunkBytes: DRAW_BYTES,
|
|
73
|
+
async getBytes(length, reqOpts) {
|
|
74
|
+
const chunks = [];
|
|
75
|
+
for (let collected = 0; collected < length; collected += DRAW_BYTES) {
|
|
76
|
+
chunks.push(drawToBytes(await nextFreshDraw(reqOpts?.signal)));
|
|
77
|
+
}
|
|
78
|
+
return { bytes: concatBytes(chunks).slice(0, length), sources: [INFO] };
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../src/providers/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type { AnuOptions } from './anu.js';
|
|
2
|
+
export { anu } from './anu.js';
|
|
3
|
+
export type { AnuLegacyOptions } from './anu-legacy.js';
|
|
4
|
+
export { anuLegacy } from './anu-legacy.js';
|
|
5
|
+
export type { BitcoinBeaconOptions } from './bitcoin.js';
|
|
6
|
+
export { bitcoinBeacon } from './bitcoin.js';
|
|
7
|
+
export type { CameraOptions, Frame, FrameSource } from './camera.js';
|
|
8
|
+
export { cameraEntropy, lsbBits, signBits } from './camera.js';
|
|
9
|
+
export { cryptoProvider } from './crypto.js';
|
|
10
|
+
export type { CurbyOptions } from './curby.js';
|
|
11
|
+
export { curby } from './curby.js';
|
|
12
|
+
export type { DrandOptions } from './drand.js';
|
|
13
|
+
export { drand } from './drand.js';
|
|
14
|
+
export type { FlowBeaconOptions } from './flow.js';
|
|
15
|
+
export { flowBeacon } from './flow.js';
|
|
16
|
+
export type { InmetroOptions, InmetroVariant } from './inmetro.js';
|
|
17
|
+
export { inmetro } from './inmetro.js';
|
|
18
|
+
export type { JitterOptions } from './jitter.js';
|
|
19
|
+
export { jitterEntropy } from './jitter.js';
|
|
20
|
+
export type { LfdrOptions } from './lfdr.js';
|
|
21
|
+
export { lfdr } from './lfdr.js';
|
|
22
|
+
export type { MicrophoneOptions, SampleSource } from './microphone.js';
|
|
23
|
+
export { micEntropy, sampleLsbBits } from './microphone.js';
|
|
24
|
+
export type { NistBeaconOptions } from './nist-beacon.js';
|
|
25
|
+
export { nistBeacon } from './nist-beacon.js';
|
|
26
|
+
export type { NqsnOptions } from './nqsn.js';
|
|
27
|
+
export { nqsn } from './nqsn.js';
|
|
28
|
+
export type { OutshiftOptions } from './outshift.js';
|
|
29
|
+
export { outshift } from './outshift.js';
|
|
30
|
+
export type { PadovaOptions } from './padova.js';
|
|
31
|
+
export { padova } from './padova.js';
|
|
32
|
+
export type { QbckOptions } from './qbck.js';
|
|
33
|
+
export { qbck } from './qbck.js';
|
|
34
|
+
export type { QciOptions } from './qci.js';
|
|
35
|
+
export { qci } from './qci.js';
|
|
36
|
+
export type { QrandomIoOptions } from './qrandom.js';
|
|
37
|
+
export { qrandomIo } from './qrandom.js';
|
|
38
|
+
export type { RandaoOptions } from './randao.js';
|
|
39
|
+
export { randao } from './randao.js';
|
|
40
|
+
export type { RandomOrgOptions } from './random-org.js';
|
|
41
|
+
export { randomOrg } from './random-org.js';
|
|
42
|
+
export type { SdrOptions } from './sdr.js';
|
|
43
|
+
export { iqLsbBits, sdrEntropy } from './sdr.js';
|
|
44
|
+
export type { SensorOptions, SensorSource } from './sensor.js';
|
|
45
|
+
export { sensorEntropy, sensorReadingBytes } from './sensor.js';
|
|
46
|
+
export type { SerialOptions, SerialPortLike } from './serial.js';
|
|
47
|
+
export { serialEntropy } from './serial.js';
|
|
48
|
+
export type { SolanaBeaconOptions } from './solana.js';
|
|
49
|
+
export { solanaBeacon } from './solana.js';
|
|
50
|
+
export type { SuperRandOptions, WebSocketConstructor, WebSocketLike, } from './superrand.js';
|
|
51
|
+
export { superRand } from './superrand.js';
|
|
52
|
+
export type { TezosBeaconOptions } from './tezos.js';
|
|
53
|
+
export { tezosBeacon } from './tezos.js';
|
|
54
|
+
export type { UchileOptions } from './uchile.js';
|
|
55
|
+
export { uchile } from './uchile.js';
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// All entropy providers — import from '@mindpeeker/entropy/providers'.
|
|
2
|
+
// The root '@mindpeeker/entropy' entry carries the core (types, errors,
|
|
3
|
+
// strategies, defineProvider) only.
|
|
4
|
+
export { anu } from './anu.js';
|
|
5
|
+
export { anuLegacy } from './anu-legacy.js';
|
|
6
|
+
export { bitcoinBeacon } from './bitcoin.js';
|
|
7
|
+
export { cameraEntropy, lsbBits, signBits } from './camera.js';
|
|
8
|
+
export { cryptoProvider } from './crypto.js';
|
|
9
|
+
export { curby } from './curby.js';
|
|
10
|
+
export { drand } from './drand.js';
|
|
11
|
+
export { flowBeacon } from './flow.js';
|
|
12
|
+
export { inmetro } from './inmetro.js';
|
|
13
|
+
export { jitterEntropy } from './jitter.js';
|
|
14
|
+
export { lfdr } from './lfdr.js';
|
|
15
|
+
export { micEntropy, sampleLsbBits } from './microphone.js';
|
|
16
|
+
export { nistBeacon } from './nist-beacon.js';
|
|
17
|
+
export { nqsn } from './nqsn.js';
|
|
18
|
+
export { outshift } from './outshift.js';
|
|
19
|
+
export { padova } from './padova.js';
|
|
20
|
+
export { qbck } from './qbck.js';
|
|
21
|
+
export { qci } from './qci.js';
|
|
22
|
+
export { qrandomIo } from './qrandom.js';
|
|
23
|
+
export { randao } from './randao.js';
|
|
24
|
+
export { randomOrg } from './random-org.js';
|
|
25
|
+
export { iqLsbBits, sdrEntropy } from './sdr.js';
|
|
26
|
+
export { sensorEntropy, sensorReadingBytes } from './sensor.js';
|
|
27
|
+
export { serialEntropy } from './serial.js';
|
|
28
|
+
export { solanaBeacon } from './solana.js';
|
|
29
|
+
export { superRand } from './superrand.js';
|
|
30
|
+
export { tezosBeacon } from './tezos.js';
|
|
31
|
+
export { uchile } from './uchile.js';
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,wEAAwE;AACxE,oCAAoC;AAGpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEhD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAM1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE1C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type NistFamilyOptions } from '../internal/nist-pulse.js';
|
|
2
|
+
import type { EntropyProvider } from '../types.js';
|
|
3
|
+
export type InmetroVariant = 'primary' | 'combination';
|
|
4
|
+
export interface InmetroOptions extends NistFamilyOptions {
|
|
5
|
+
/**
|
|
6
|
+
* 'primary' (default): Inmetro's own quantum-optical beacon, 60 s pulses.
|
|
7
|
+
* 'combination': CONCAT+VDF combination of UChile, RANDOM.ORG and NIST
|
|
8
|
+
* seeds, one pulse every 10 minutes.
|
|
9
|
+
*/
|
|
10
|
+
variant?: InmetroVariant;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Inmetro Brazilian randomness beacon (national metrology institute) —
|
|
14
|
+
* NIST IR 8213 format. PUBLIC randomness.
|
|
15
|
+
*/
|
|
16
|
+
export declare function inmetro(opts?: InmetroOptions): EntropyProvider;
|
|
17
|
+
//# sourceMappingURL=inmetro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inmetro.d.ts","sourceRoot":"","sources":["../../src/providers/inmetro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAmB,MAAM,2BAA2B,CAAA;AACnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,CAAA;AAEtD,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD;;;;OAIG;IACH,OAAO,CAAC,EAAE,cAAc,CAAA;CACzB;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,GAAE,cAAmB,GAAG,eAAe,CAwBlE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { nistPulseBeacon } from '../internal/nist-pulse.js';
|
|
2
|
+
/**
|
|
3
|
+
* Inmetro Brazilian randomness beacon (national metrology institute) —
|
|
4
|
+
* NIST IR 8213 format. PUBLIC randomness.
|
|
5
|
+
*/
|
|
6
|
+
export function inmetro(opts = {}) {
|
|
7
|
+
const { variant = 'primary', ...rest } = opts;
|
|
8
|
+
if (variant === 'combination') {
|
|
9
|
+
return nistPulseBeacon({
|
|
10
|
+
info: Object.freeze({ name: 'inmetro(combination)', kind: 'beacon', privacy: 'public' }),
|
|
11
|
+
defaultBaseUrl: 'https://beacon.inmetro.gov.br/combination/beacon/2.0',
|
|
12
|
+
// quirk: latest has NO /pulse segment, but by-index DOES
|
|
13
|
+
latestPath: '/last',
|
|
14
|
+
pulsePath: (_chain, i) => `/pulse/${i}`,
|
|
15
|
+
defaultPollIntervalMs: 600_000,
|
|
16
|
+
}, rest);
|
|
17
|
+
}
|
|
18
|
+
return nistPulseBeacon({
|
|
19
|
+
info: Object.freeze({ name: 'inmetro', kind: 'beacon', privacy: 'public' }),
|
|
20
|
+
defaultBaseUrl: 'https://beacon.inmetro.gov.br/beacon/2.1',
|
|
21
|
+
latestPath: '/pulse/last',
|
|
22
|
+
defaultPollIntervalMs: 60_000,
|
|
23
|
+
}, rest);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=inmetro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inmetro.js","sourceRoot":"","sources":["../../src/providers/inmetro.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAcnF;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,OAAuB,EAAE;IAC/C,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAA;IAC7C,IAAI,OAAO,KAAK,aAAa,EAAE,CAAC;QAC9B,OAAO,eAAe,CACpB;YACE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YACxF,cAAc,EAAE,sDAAsD;YACtE,yDAAyD;YACzD,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE;YACvC,qBAAqB,EAAE,OAAO;SAC/B,EACD,IAAI,CACL,CAAA;IACH,CAAC;IACD,OAAO,eAAe,CACpB;QACE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC3E,cAAc,EAAE,0CAA0C;QAC1D,UAAU,EAAE,aAAa;QACzB,qBAAqB,EAAE,MAAM;KAC9B,EACD,IAAI,CACL,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ConditioningOptions } from '../internal/condition.js';
|
|
2
|
+
import type { EntropyProvider } from '../types.js';
|
|
3
|
+
export interface JitterOptions extends ConditioningOptions {
|
|
4
|
+
/** Timing deltas gathered per internal batch (event loop yields between). Default 4096. */
|
|
5
|
+
batchSamples?: number;
|
|
6
|
+
/**
|
|
7
|
+
* Opt in to the coarse browser clock (performance.now, 100µs+ granularity).
|
|
8
|
+
* Coarse mode counts operations per fixed window instead of measuring
|
|
9
|
+
* per-operation deltas; its entropy is real but UNQUANTIFIED — mix it via
|
|
10
|
+
* xorMix, never use it as your only source.
|
|
11
|
+
*/
|
|
12
|
+
allowCoarseClock?: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface HrtimeClock {
|
|
15
|
+
kind: 'hrtime';
|
|
16
|
+
now: () => bigint;
|
|
17
|
+
}
|
|
18
|
+
interface CoarseClock {
|
|
19
|
+
kind: 'coarse';
|
|
20
|
+
now: () => number;
|
|
21
|
+
}
|
|
22
|
+
/** Resolve the best available clock without importing node: modules. */
|
|
23
|
+
export declare function pickClock(allowCoarse: boolean, g?: typeof globalThis): HrtimeClock | CoarseClock;
|
|
24
|
+
/**
|
|
25
|
+
* CPU timing jitter (the jitterentropy concept in plain JS). With
|
|
26
|
+
* process.hrtime.bigint (Node/Bun) it measures per-iteration nanosecond
|
|
27
|
+
* deltas of a data-dependent memory walk, credited very conservatively at
|
|
28
|
+
* 1/16 bit per delta. Software-only and unattested — prefer hardware sources
|
|
29
|
+
* where available; ideal as an always-on xorMix member.
|
|
30
|
+
*/
|
|
31
|
+
export declare function jitterEntropy(opts?: JitterOptions): EntropyProvider;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=jitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jitter.d.ts","sourceRoot":"","sources":["../../src/providers/jitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAGnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,WAAW,aAAc,SAAQ,mBAAmB;IACxD,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,MAAM,MAAM,CAAA;CAClB;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CACvB,WAAW,EAAE,OAAO,EACpB,CAAC,GAAE,OAAO,UAAuB,GAChC,WAAW,GAAG,WAAW,CAiB3B;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,aAAkB,GAAG,eAAe,CA0DvE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { sleep } from '../internal/rate-limit.js';
|
|
2
|
+
import { sampledProvider } from '../internal/sampled.js';
|
|
3
|
+
/** Resolve the best available clock without importing node: modules. */
|
|
4
|
+
export function pickClock(allowCoarse, g = globalThis) {
|
|
5
|
+
const bigint = g.process?.hrtime?.bigint;
|
|
6
|
+
if (typeof bigint === 'function') {
|
|
7
|
+
return { kind: 'hrtime', now: () => bigint() };
|
|
8
|
+
}
|
|
9
|
+
const perf = g.performance;
|
|
10
|
+
const perfNow = perf?.now;
|
|
11
|
+
if (typeof perfNow === 'function') {
|
|
12
|
+
if (!allowCoarse) {
|
|
13
|
+
throw new TypeError('jitterEntropy: this runtime only offers a coarse clock (performance.now) — pass allowCoarseClock: true to accept unquantified supplementary entropy');
|
|
14
|
+
}
|
|
15
|
+
// performance.now needs its receiver — a detached call throws in browsers
|
|
16
|
+
return { kind: 'coarse', now: () => perfNow.call(perf) };
|
|
17
|
+
}
|
|
18
|
+
throw new TypeError('jitterEntropy: no usable high-resolution clock found in this runtime');
|
|
19
|
+
}
|
|
20
|
+
const WALK_SIZE = 65_536;
|
|
21
|
+
const COARSE_WINDOW_MS = 0.5;
|
|
22
|
+
const COARSE_BATCH = 64;
|
|
23
|
+
/**
|
|
24
|
+
* CPU timing jitter (the jitterentropy concept in plain JS). With
|
|
25
|
+
* process.hrtime.bigint (Node/Bun) it measures per-iteration nanosecond
|
|
26
|
+
* deltas of a data-dependent memory walk, credited very conservatively at
|
|
27
|
+
* 1/16 bit per delta. Software-only and unattested — prefer hardware sources
|
|
28
|
+
* where available; ideal as an always-on xorMix member.
|
|
29
|
+
*/
|
|
30
|
+
export function jitterEntropy(opts = {}) {
|
|
31
|
+
const { batchSamples = 4096, allowCoarseClock = false } = opts;
|
|
32
|
+
const clock = pickClock(allowCoarseClock);
|
|
33
|
+
const walk = new Uint8Array(WALK_SIZE);
|
|
34
|
+
let index = 0;
|
|
35
|
+
function mix(i) {
|
|
36
|
+
index = (index * 31 + walk[index] + i) & (WALK_SIZE - 1);
|
|
37
|
+
walk[index] = (walk[index] + 0x9e) & 0xff;
|
|
38
|
+
}
|
|
39
|
+
async function* hrtimeSamples(signal) {
|
|
40
|
+
const now = clock.now;
|
|
41
|
+
while (true) {
|
|
42
|
+
const samples = new Uint8Array(batchSamples);
|
|
43
|
+
let prev = now();
|
|
44
|
+
for (let i = 0; i < batchSamples; i++) {
|
|
45
|
+
mix(i);
|
|
46
|
+
const t = now();
|
|
47
|
+
samples[i] = Number((t - prev) & 0xffn);
|
|
48
|
+
prev = t;
|
|
49
|
+
}
|
|
50
|
+
yield samples;
|
|
51
|
+
await sleep(0, signal);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function* coarseSamples(signal) {
|
|
55
|
+
const now = clock.now;
|
|
56
|
+
while (true) {
|
|
57
|
+
const samples = new Uint8Array(COARSE_BATCH);
|
|
58
|
+
for (let i = 0; i < COARSE_BATCH; i++) {
|
|
59
|
+
const start = now();
|
|
60
|
+
let ops = 0;
|
|
61
|
+
while (now() - start < COARSE_WINDOW_MS) {
|
|
62
|
+
mix(ops);
|
|
63
|
+
ops++;
|
|
64
|
+
}
|
|
65
|
+
samples[i] = ops & 0xff;
|
|
66
|
+
}
|
|
67
|
+
yield samples;
|
|
68
|
+
await sleep(0, signal);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return sampledProvider({
|
|
72
|
+
name: clock.kind === 'coarse' ? 'jitter(coarse)' : 'jitter',
|
|
73
|
+
kind: 'trng',
|
|
74
|
+
privacy: 'private',
|
|
75
|
+
open: clock.kind === 'coarse' ? coarseSamples : hrtimeSamples,
|
|
76
|
+
defaultMinEntropyPerSample: clock.kind === 'coarse' ? 0.01 : 0.0625,
|
|
77
|
+
defaultSafetyFactor: 2,
|
|
78
|
+
defaultTimeoutMs: 30_000,
|
|
79
|
+
}, opts);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=jitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jitter.js","sourceRoot":"","sources":["../../src/providers/jitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { EntropyProvider } from '../types.js';
|
|
2
|
+
export interface LfdrOptions {
|
|
3
|
+
fetch?: typeof fetch;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* LfD (Germany) QRNG — an ID Quantique Quantis PCIe card behind a free,
|
|
8
|
+
* keyless HTTP API. Hobby-grade: no SLA, no published limits.
|
|
9
|
+
*/
|
|
10
|
+
export declare function lfdr(opts?: LfdrOptions): EntropyProvider;
|
|
11
|
+
//# sourceMappingURL=lfdr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lfdr.d.ts","sourceRoot":"","sources":["../../src/providers/lfdr.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,aAAa,CAAA;AAOrE,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAOD;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,GAAE,WAAgB,GAAG,eAAe,CAqB5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { concatBytes } from '../internal/bytes.js';
|
|
2
|
+
import { fetchJson } from '../internal/http.js';
|
|
3
|
+
import { defineProvider } from '../internal/provider.js';
|
|
4
|
+
import { bytesFromHexField } from '../internal/validate.js';
|
|
5
|
+
const INFO = Object.freeze({ name: 'lfdr', kind: 'qrng', privacy: 'private' });
|
|
6
|
+
// No documented cap — self-imposed politeness limit per request.
|
|
7
|
+
const MAX_PER_REQUEST = 1024;
|
|
8
|
+
const DEFAULT_BASE_URL = 'https://lfdr.de/qrng_api/qrng';
|
|
9
|
+
/**
|
|
10
|
+
* LfD (Germany) QRNG — an ID Quantique Quantis PCIe card behind a free,
|
|
11
|
+
* keyless HTTP API. Hobby-grade: no SLA, no published limits.
|
|
12
|
+
*/
|
|
13
|
+
export function lfdr(opts = {}) {
|
|
14
|
+
const { baseUrl = DEFAULT_BASE_URL, fetch: fetchImpl } = opts;
|
|
15
|
+
return defineProvider({
|
|
16
|
+
...INFO,
|
|
17
|
+
async getBytes(length, reqOpts) {
|
|
18
|
+
const chunks = [];
|
|
19
|
+
for (let remaining = length; remaining > 0;) {
|
|
20
|
+
const n = Math.min(MAX_PER_REQUEST, remaining);
|
|
21
|
+
const query = new URLSearchParams({ length: String(n), format: 'HEX' });
|
|
22
|
+
const res = await fetchJson(`${baseUrl}?${query}`, {
|
|
23
|
+
provider: INFO.name,
|
|
24
|
+
signal: reqOpts?.signal,
|
|
25
|
+
fetchImpl,
|
|
26
|
+
});
|
|
27
|
+
chunks.push(bytesFromHexField(res?.qrn, n, INFO.name));
|
|
28
|
+
remaining -= n;
|
|
29
|
+
}
|
|
30
|
+
return { bytes: concatBytes(chunks), sources: [INFO] };
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=lfdr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lfdr.js","sourceRoot":"","sources":["../../src/providers/lfdr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAG3D,MAAM,IAAI,GAAsB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;AACjG,iEAAiE;AACjE,MAAM,eAAe,GAAG,IAAI,CAAA;AAC5B,MAAM,gBAAgB,GAAG,+BAA+B,CAAA;AAYxD;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,OAAoB,EAAE;IACzC,MAAM,EAAE,OAAO,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAA;IAE7D,OAAO,cAAc,CAAC;QACpB,GAAG,IAAI;QACP,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO;YAC5B,MAAM,MAAM,GAAiB,EAAE,CAAA;YAC/B,KAAK,IAAI,SAAS,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,GAAI,CAAC;gBAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;gBAC9C,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;gBACvE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAe,GAAG,OAAO,IAAI,KAAK,EAAE,EAAE;oBAC/D,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,OAAO,EAAE,MAAM;oBACvB,SAAS;iBACV,CAAC,CAAA;gBACF,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBACtD,SAAS,IAAI,CAAC,CAAA;YAChB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;QACxD,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ConditioningOptions } from '../internal/condition.js';
|
|
2
|
+
import type { EntropyProvider } from '../types.js';
|
|
3
|
+
export interface SampleSource {
|
|
4
|
+
/** A fresh PCM sample iterable per session; stop capturing in the generator's finally. */
|
|
5
|
+
samples(signal?: AbortSignal): AsyncIterable<Float32Array | Int16Array>;
|
|
6
|
+
close?(): void | Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export interface MicrophoneOptions extends ConditioningOptions {
|
|
9
|
+
/** Injected PCM samples (Node, tests). Default: getUserMedia audio (browser only). */
|
|
10
|
+
source?: SampleSource;
|
|
11
|
+
/** LSBs kept per 16-bit sample. Default 1. */
|
|
12
|
+
bitsPerSample?: 1 | 2 | 4;
|
|
13
|
+
/** Audio discarded at session start. Default 200. */
|
|
14
|
+
warmupMs?: number;
|
|
15
|
+
/** Used to convert warmupMs into a sample count. Default 48_000. */
|
|
16
|
+
sampleRate?: number;
|
|
17
|
+
}
|
|
18
|
+
/** Extract the lowest `bitsPerSample` bits of each sample (Float32 scaled to int16 first). */
|
|
19
|
+
export declare function sampleLsbBits(samples: Float32Array | Int16Array, bitsPerSample: 1 | 2 | 4): number[];
|
|
20
|
+
/**
|
|
21
|
+
* Microphone ADC noise — the least significant bits of the audio samples.
|
|
22
|
+
* MEMS microphones and browser DSP can interfere; keep expectations modest
|
|
23
|
+
* and rely on the health tests to catch dead or processed inputs.
|
|
24
|
+
*/
|
|
25
|
+
export declare function micEntropy(opts?: MicrophoneOptions): EntropyProvider;
|
|
26
|
+
//# sourceMappingURL=microphone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../src/providers/microphone.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAEnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,0FAA0F;IAC1F,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,YAAY,GAAG,UAAU,CAAC,CAAA;IACvE,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,sFAAsF;IACtF,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAC3B,OAAO,EAAE,YAAY,GAAG,UAAU,EAClC,aAAa,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GACvB,MAAM,EAAE,CAaV;AA+DD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,eAAe,CAqCxE"}
|