@ddunigma/node 3.0.2 → 3.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/README.md +73 -21
- package/dist/BrowserAdapter-BHHWPUTB.js +2 -0
- package/dist/BrowserAdapter-M7PUHVGS.cjs +2 -0
- package/dist/NodeAdapter-JB2EZ3T4.js +2 -0
- package/dist/NodeAdapter-JRRSYUJT.cjs +2 -0
- package/dist/ObfuscationLayer-D-xl5d7P.d.ts +205 -0
- package/dist/ObfuscationLayer-DAVKTnHf.d.cts +205 -0
- package/dist/browser.cjs +1 -6
- package/dist/browser.d.cts +18 -202
- package/dist/browser.d.ts +18 -202
- package/dist/browser.js +1 -6
- package/dist/chunk-5RZDTEOZ.js +2 -0
- package/dist/chunk-JUBMOKKH.js +2 -0
- package/dist/chunk-JZSHJ6KN.cjs +9 -0
- package/dist/chunk-KEWLOPEV.js +9 -0
- package/dist/chunk-M6LY6DIE.js +2 -0
- package/dist/chunk-NFMYVNOG.cjs +2 -0
- package/dist/chunk-NY4FGVF3.cjs +2 -0
- package/dist/chunk-PHMARSJE.cjs +2 -0
- package/dist/chunk-QR43FNIY.js +2 -0
- package/dist/chunk-TJTDYO65.cjs +2 -0
- package/dist/{core-BccIjoLZ.d.cts → core-DYSnygnp.d.cts} +68 -59
- package/dist/{core-BccIjoLZ.d.ts → core-DYSnygnp.d.ts} +68 -59
- package/dist/core.cjs +1 -6
- package/dist/core.d.cts +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/core.js +1 -6
- package/dist/index.cjs +1 -6
- package/dist/index.d.cts +17 -14
- package/dist/index.d.ts +17 -14
- package/dist/index.js +1 -6
- package/dist/wasm/codec.wasm +0 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ V2 추가사항
|
|
|
10
10
|
|
|
11
11
|
### Credits
|
|
12
12
|
|
|
13
|
-
-
|
|
13
|
+
- Origin implementation by:
|
|
14
14
|
- [@i3ls](https://github.com/i3l3)
|
|
15
15
|
- [@gunu3371](https://github.com/gunu3371)
|
|
16
16
|
- Original Repository: [ddunigma](https://github.com/i3l3/ddunigma)
|
|
@@ -36,7 +36,7 @@ ddu.encode("안녕하세요"); // "뎯땩잇땨뎪뎨잇잉뎯욱잇우뎯땨읶
|
|
|
36
36
|
ddu.decode("뎯땩잇땨뎪뎨잇잉뎯욱잇우뎯땨읶뎨뎯땩듂잊"); // "안녕하세요"
|
|
37
37
|
|
|
38
38
|
// V1 (구버전 호환, 8개 문자 쌍 방식)
|
|
39
|
-
const dduV1 = new Ddu64(
|
|
39
|
+
const dduV1 = new Ddu64({ dduSetSymbol: DduSetSymbol.DDU_V1 });
|
|
40
40
|
dduV1.encode("안녕하세요"); // ".우땨땨이?땨뜌.이.뜌이?이!.우우땨이?우뜌.우땨뜌이이.뜌.우땨땨!이이야"
|
|
41
41
|
dduV1.decode(".우땨땨이?땨뜌.이.뜌이?이!.우우땨이?우뜌.우땨뜌이이.뜌.우땨땨!이이야"); // "안녕하세요"
|
|
42
42
|
```
|
|
@@ -51,7 +51,7 @@ const input = new Uint8Array([0, 1, 127, 128, 255]);
|
|
|
51
51
|
|
|
52
52
|
const encoded = ddu.encode(input);
|
|
53
53
|
const bytes = ddu.decodeToUint8Array(encoded);
|
|
54
|
-
const buffer = ddu.decodeToBuffer(encoded); // Node.js
|
|
54
|
+
const buffer = ddu.decodeToBuffer(encoded); // Node.js entry only
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
## Presets
|
|
@@ -62,10 +62,12 @@ import { Ddu64, DduSetSymbol } from "@ddunigma/node";
|
|
|
62
62
|
// 기본값 - 한글 종성 결합 64문자
|
|
63
63
|
new Ddu64();
|
|
64
64
|
|
|
65
|
-
// 구버전 호환 8문자
|
|
65
|
+
// 구버전 호환 8문자 (아래 두 방법 모두 사용가능)
|
|
66
|
+
new Ddu64({ dduSetSymbol: DduSetSymbol.DDU_V1 });
|
|
66
67
|
new Ddu64(undefined, undefined, { dduSetSymbol: DduSetSymbol.DDU_V1 });
|
|
67
68
|
|
|
68
|
-
// 영문+숫자 64문자
|
|
69
|
+
// 영문+숫자 64문자 (아래 두 방법 모두 사용가능)
|
|
70
|
+
new Ddu64({ dduSetSymbol: DduSetSymbol.ONECHARSET });
|
|
69
71
|
new Ddu64(undefined, undefined, { dduSetSymbol: DduSetSymbol.ONECHARSET });
|
|
70
72
|
```
|
|
71
73
|
|
|
@@ -114,7 +116,7 @@ const chars = CharsetBuilder.fromUnicodeRange(0x4e00, 0x4e3f)
|
|
|
114
116
|
## Compression
|
|
115
117
|
|
|
116
118
|
```typescript
|
|
117
|
-
const ddu = new Ddu64(
|
|
119
|
+
const ddu = new Ddu64({
|
|
118
120
|
compress: true, // 압축 활성화
|
|
119
121
|
compressionAlgorithm: "deflate", // "deflate" | "brotli"
|
|
120
122
|
compressionLevel: 6, // deflate: 0-9, brotli: 0-11
|
|
@@ -125,12 +127,14 @@ const decoded = ddu.decode(encoded);
|
|
|
125
127
|
```
|
|
126
128
|
|
|
127
129
|
압축은 원본보다 작아질 때만 적용됩니다. 압축 결과가 더 크면 비압축으로 저장됩니다.
|
|
130
|
+
브라우저 진입점은 `deflate-raw`를 지원하는 CompressionStream/DecompressionStream 런타임에서 압축을 사용합니다.
|
|
131
|
+
브라우저 Brotli는 런타임 지원 여부를 feature detection으로 확인하며, Web API 특성상 `compressionLevel`은 적용되지 않을 수 있습니다.
|
|
128
132
|
|
|
129
133
|
## Encryption
|
|
130
134
|
|
|
131
135
|
```typescript
|
|
132
136
|
// SHA-256 키 파생 (기본)
|
|
133
|
-
const ddu = new Ddu64(
|
|
137
|
+
const ddu = new Ddu64({
|
|
134
138
|
encryptionKey: "my-secret-key",
|
|
135
139
|
});
|
|
136
140
|
|
|
@@ -138,7 +142,7 @@ const encoded = ddu.encode("secret message");
|
|
|
138
142
|
const decoded = ddu.decode(encoded); // 같은 키로만 복호화 가능
|
|
139
143
|
|
|
140
144
|
// PBKDF2 키 파생
|
|
141
|
-
const dduPbkdf2 = new Ddu64(
|
|
145
|
+
const dduPbkdf2 = new Ddu64({
|
|
142
146
|
encryptionKey: "user password",
|
|
143
147
|
keyDerivation: {
|
|
144
148
|
algorithm: "pbkdf2",
|
|
@@ -149,10 +153,13 @@ const dduPbkdf2 = new Ddu64(undefined, undefined, {
|
|
|
149
153
|
});
|
|
150
154
|
```
|
|
151
155
|
|
|
156
|
+
PBKDF2 `iterations`는 기본값이 `210_000`이며, `10_000` 미만의 양수는 `10_000`으로 보정됩니다.
|
|
157
|
+
0 이하 또는 유한하지 않은 값은 기본값으로 대체됩니다.
|
|
158
|
+
|
|
152
159
|
## Checksum
|
|
153
160
|
|
|
154
161
|
```typescript
|
|
155
|
-
const ddu = new Ddu64(
|
|
162
|
+
const ddu = new Ddu64({ checksum: true });
|
|
156
163
|
|
|
157
164
|
const encoded = ddu.encode("data"); // CRC32 체크섬 포함
|
|
158
165
|
const decoded = ddu.decode(encoded); // 무결성 검증 후 반환
|
|
@@ -172,7 +179,7 @@ const encoded = ddu.encode("URL safe text");
|
|
|
172
179
|
## Chunking
|
|
173
180
|
|
|
174
181
|
```typescript
|
|
175
|
-
const ddu = new Ddu64(
|
|
182
|
+
const ddu = new Ddu64({
|
|
176
183
|
chunkSize: 76,
|
|
177
184
|
chunkSeparator: "\n",
|
|
178
185
|
});
|
|
@@ -184,7 +191,7 @@ const encoded = ddu.encode("long data ".repeat(100));
|
|
|
184
191
|
## Obfuscation (한글 난독화)
|
|
185
192
|
|
|
186
193
|
```typescript
|
|
187
|
-
const ddu = new Ddu64(
|
|
194
|
+
const ddu = new Ddu64({
|
|
188
195
|
encryptionKey: "secret",
|
|
189
196
|
obfuscate: true, // 암호화 필수
|
|
190
197
|
});
|
|
@@ -205,13 +212,14 @@ const decoded = await ddu.decodeAsync(encoded);
|
|
|
205
212
|
```
|
|
206
213
|
|
|
207
214
|
Node.js에서도 async 메서드를 사용할 수 있습니다. 브라우저 진입점(`@ddunigma/node/browser`)은 Node.js 내장 모듈을 임포트하지 않습니다.
|
|
215
|
+
코어 진입점(`@ddunigma/node/core`)은 기본 인코딩/디코딩만 포함하며, 압축/암호화가 필요하면 명시적으로 어댑터를 전달하세요.
|
|
208
216
|
|
|
209
217
|
## Web Streams
|
|
210
218
|
|
|
211
219
|
```typescript
|
|
212
220
|
import { Ddu64, createReadableEncodeStream, createReadableDecodeStream } from "@ddunigma/node";
|
|
213
221
|
|
|
214
|
-
const ddu = new Ddu64(
|
|
222
|
+
const ddu = new Ddu64({
|
|
215
223
|
compress: true,
|
|
216
224
|
encryptionKey: "stream-key",
|
|
217
225
|
});
|
|
@@ -228,21 +236,22 @@ const decodedStream = encodedStream.pipeThrough(createReadableDecodeStream(ddu))
|
|
|
228
236
|
```typescript
|
|
229
237
|
import { Ddu64, preloadWasm } from "@ddunigma/node";
|
|
230
238
|
|
|
231
|
-
await preloadWasm(); //
|
|
239
|
+
await preloadWasm(); // 동기 encode/decode hot path에서 WASM을 쓰려면 먼저 완료되어야 함
|
|
232
240
|
|
|
233
|
-
const ddu = new Ddu64(
|
|
241
|
+
const ddu = new Ddu64({
|
|
234
242
|
wasmThreshold: 4096, // 이 크기 이상일 때 WASM 사용
|
|
235
243
|
});
|
|
236
244
|
|
|
237
245
|
const encoded = ddu.encode(new Uint8Array(1024 * 1024));
|
|
238
246
|
```
|
|
239
247
|
|
|
240
|
-
|
|
248
|
+
`encode()`/`decode()`의 동기 hot path는 이미 로드된 WASM만 사용합니다.
|
|
249
|
+
`preloadWasm()`이 완료되지 않았거나 WASM을 사용할 수 없으면 JavaScript로 폴백됩니다.
|
|
241
250
|
|
|
242
251
|
## Progress Callback
|
|
243
252
|
|
|
244
253
|
```typescript
|
|
245
|
-
const ddu = new Ddu64(
|
|
254
|
+
const ddu = new Ddu64({ compress: true });
|
|
246
255
|
|
|
247
256
|
ddu.encode("data", {
|
|
248
257
|
onProgress: ({ percent, stage }) => {
|
|
@@ -255,7 +264,7 @@ ddu.encode("data", {
|
|
|
255
264
|
## Stats
|
|
256
265
|
|
|
257
266
|
```typescript
|
|
258
|
-
const ddu = new Ddu64(
|
|
267
|
+
const ddu = new Ddu64({ compress: true });
|
|
259
268
|
const stats = ddu.getStats("A".repeat(1000));
|
|
260
269
|
|
|
261
270
|
// { originalSize, encodedSize, compressedSize, compressionRatio, expansionRatio, charsetSize, bitLength }
|
|
@@ -264,7 +273,7 @@ const stats = ddu.getStats("A".repeat(1000));
|
|
|
264
273
|
## Size Limits
|
|
265
274
|
|
|
266
275
|
```typescript
|
|
267
|
-
const ddu = new Ddu64(
|
|
276
|
+
const ddu = new Ddu64({
|
|
268
277
|
maxDecodedBytes: 10 * 1024 * 1024, // 디코딩 최대 크기 (기본 64MB)
|
|
269
278
|
maxDecompressedBytes: 50 * 1024 * 1024, // 압축해제 최대 크기 (기본 64MB)
|
|
270
279
|
});
|
|
@@ -274,6 +283,8 @@ const ddu = new Ddu64(undefined, undefined, {
|
|
|
274
283
|
|
|
275
284
|
## API
|
|
276
285
|
|
|
286
|
+
### Node Entry
|
|
287
|
+
|
|
277
288
|
```typescript
|
|
278
289
|
class Ddu64 {
|
|
279
290
|
encode(data: string | Uint8Array, options?: DduOptions): string;
|
|
@@ -288,15 +299,56 @@ class Ddu64 {
|
|
|
288
299
|
|
|
289
300
|
getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
|
|
290
301
|
getCharSetInfo(): CharSetInfo;
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Browser Entry
|
|
306
|
+
|
|
307
|
+
```typescript
|
|
308
|
+
class Ddu64 {
|
|
309
|
+
encode(data: string | Uint8Array, options?: DduOptions): string;
|
|
310
|
+
decode(encoded: string, options?: DduOptions): string;
|
|
311
|
+
decodeToUint8Array(encoded: string, options?: DduOptions): Uint8Array;
|
|
312
|
+
|
|
313
|
+
encodeAsync(data: string | Uint8Array, options?: DduOptions): Promise<string>;
|
|
314
|
+
decodeAsync(encoded: string, options?: DduOptions): Promise<string>;
|
|
315
|
+
decodeToUint8ArrayAsync(encoded: string, options?: DduOptions): Promise<Uint8Array>;
|
|
316
|
+
|
|
317
|
+
getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
|
|
318
|
+
getCharSetInfo(): CharSetInfo;
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
브라우저 진입점(`@ddunigma/node/browser`)은 `Buffer` API를 노출하지 않습니다.
|
|
323
|
+
|
|
324
|
+
### Core Entry
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
class Ddu64 {
|
|
328
|
+
encode(data: string | Uint8Array, options?: DduOptions): string;
|
|
329
|
+
decode(encoded: string, options?: DduOptions): string;
|
|
330
|
+
decodeToUint8Array(encoded: string, options?: DduOptions): Uint8Array;
|
|
331
|
+
|
|
332
|
+
encodeAsync(data: string | Uint8Array, options?: DduOptions): Promise<string>;
|
|
333
|
+
decodeAsync(encoded: string, options?: DduOptions): Promise<string>;
|
|
334
|
+
decodeToUint8ArrayAsync(encoded: string, options?: DduOptions): Promise<Uint8Array>;
|
|
291
335
|
|
|
292
|
-
|
|
336
|
+
getStats(data: string | Uint8Array, options?: DduOptions): DduEncodeStats;
|
|
337
|
+
getCharSetInfo(): CharSetInfo;
|
|
293
338
|
}
|
|
294
339
|
```
|
|
295
340
|
|
|
341
|
+
코어 진입점(`@ddunigma/node/core`)은 플랫폼 어댑터를 자동 로드하지 않습니다.
|
|
342
|
+
압축 또는 암호화가 필요한 async 호출에는 `adapter`를 명시적으로 전달하세요.
|
|
343
|
+
|
|
296
344
|
## Constructor Options
|
|
297
345
|
|
|
298
346
|
```typescript
|
|
299
|
-
|
|
347
|
+
// 옵션만 전달 (권장)
|
|
348
|
+
new Ddu64(options?);
|
|
349
|
+
|
|
350
|
+
// charset 직접 지정
|
|
351
|
+
new Ddu64(dduChar, paddingChar, options?);
|
|
300
352
|
```
|
|
301
353
|
|
|
302
354
|
| Option | Type | Default | 설명 |
|
|
@@ -342,7 +394,7 @@ new Ddu64(dduChar?, paddingChar?, options?);
|
|
|
342
394
|
| Import Path | 용도 |
|
|
343
395
|
| ------------------------ | ------------------------------------- |
|
|
344
396
|
| `@ddunigma/node` | Node.js 전체 기능 (동기+비동기) |
|
|
345
|
-
| `@ddunigma/node/browser` | 브라우저 최적화 (
|
|
397
|
+
| `@ddunigma/node/browser` | 브라우저 최적화 (BrowserAdapter 기본) |
|
|
346
398
|
| `@ddunigma/node/core` | 최소 코어 (인코딩/디코딩만) |
|
|
347
399
|
|
|
348
400
|
## Build & Test
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkNFMYVNOG_cjs=require('./chunk-NFMYVNOG.cjs');require('./chunk-NY4FGVF3.cjs');Object.defineProperty(exports,"BrowserAdapter",{enumerable:true,get:function(){return chunkNFMYVNOG_cjs.a}});//# sourceMappingURL=BrowserAdapter-M7PUHVGS.cjs.map
|
|
2
|
+
//# sourceMappingURL=BrowserAdapter-M7PUHVGS.cjs.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkTJTDYO65_cjs=require('./chunk-TJTDYO65.cjs');require('./chunk-NY4FGVF3.cjs');Object.defineProperty(exports,"NodeAdapter",{enumerable:true,get:function(){return chunkTJTDYO65_cjs.a}});//# sourceMappingURL=NodeAdapter-JRRSYUJT.cjs.map
|
|
2
|
+
//# sourceMappingURL=NodeAdapter-JRRSYUJT.cjs.map
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { P as PlatformAdapter, i as KeyDerivationOptions, D as Ddu64Core, e as DduOptions, O as ObfuscationLayer } from './core-DYSnygnp.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 브라우저 플랫폼 어댑터 구현.
|
|
5
|
+
* 암호화 연산에 Web Crypto API(SubtleCrypto)를 사용하고
|
|
6
|
+
* 압축에 CompressionStream/DecompressionStream을 사용합니다.
|
|
7
|
+
*
|
|
8
|
+
* 이 어댑터는 동기 암호화 또는 압축 연산을 지원하지 않습니다.
|
|
9
|
+
* Brotli는 CompressionStream/DecompressionStream에서 지원되는 런타임에서만 사용할 수 있습니다.
|
|
10
|
+
*
|
|
11
|
+
* @module adapters/BrowserAdapter
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Web API를 사용하여 PlatformAdapter를 구현하는 BrowserAdapter:
|
|
16
|
+
* - AES-256-GCM 및 SHA-256을 위한 Web Crypto API(SubtleCrypto)
|
|
17
|
+
* - 안전한 랜덤 바이트를 위한 crypto.getRandomValues
|
|
18
|
+
* - deflate-raw 압축을 위한 CompressionStream/DecompressionStream
|
|
19
|
+
* - 런타임이 지원하는 경우 Brotli 압축
|
|
20
|
+
*/
|
|
21
|
+
declare class BrowserAdapter implements PlatformAdapter {
|
|
22
|
+
readonly supportsSyncCrypto = false;
|
|
23
|
+
readonly supportsSyncCompression = false;
|
|
24
|
+
readonly supportsBrotli: boolean;
|
|
25
|
+
readonly runtime: "browser";
|
|
26
|
+
/**
|
|
27
|
+
* UTF-8 키 문자열에서 SHA-256을 통해 256비트 키를 파생합니다.
|
|
28
|
+
* UTF-8 인코딩된 키에 SubtleCrypto.digest('SHA-256', ...)를 사용합니다.
|
|
29
|
+
*/
|
|
30
|
+
deriveKey(key: string, options?: KeyDerivationOptions): Promise<Uint8Array>;
|
|
31
|
+
/**
|
|
32
|
+
* 12바이트 IV를 사용하여 AES-256-GCM으로 데이터를 암호화합니다.
|
|
33
|
+
* 와이어 포맷 반환: IV(12바이트) + authTag(16바이트) + 암호문.
|
|
34
|
+
*
|
|
35
|
+
* 참고: Web Crypto는 authTag를 암호문에 추가하므로,
|
|
36
|
+
* 마지막 16바이트를 authTag로 추출하고 와이어 포맷에 맞게 재배치합니다.
|
|
37
|
+
*/
|
|
38
|
+
encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
|
|
39
|
+
/**
|
|
40
|
+
* AES-256-GCM 페이로드를 복호화합니다.
|
|
41
|
+
* 와이어 포맷 기대: IV(12바이트) + authTag(16바이트) + 암호문.
|
|
42
|
+
* 복호화 전에 Web Crypto 형식(암호문 + authTag)으로 재구성합니다.
|
|
43
|
+
*/
|
|
44
|
+
decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
|
|
45
|
+
/**
|
|
46
|
+
* 암호학적으로 안전한 랜덤 바이트를 생성합니다.
|
|
47
|
+
*/
|
|
48
|
+
randomBytes(length: number): Uint8Array;
|
|
49
|
+
/**
|
|
50
|
+
* CompressionStream을 통해 deflate로 데이터를 압축합니다.
|
|
51
|
+
* Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
|
|
52
|
+
*/
|
|
53
|
+
deflate(data: Uint8Array, _level?: number): Promise<Uint8Array>;
|
|
54
|
+
/**
|
|
55
|
+
* DecompressionStream을 통해 deflate 데이터를 압축 해제합니다.
|
|
56
|
+
* Node.js zlib.inflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
|
|
57
|
+
* maxBytes가 지정되면 제한을 적용합니다.
|
|
58
|
+
*/
|
|
59
|
+
inflate(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
|
|
60
|
+
/**
|
|
61
|
+
* CompressionStream을 통해 Brotli로 데이터를 압축합니다.
|
|
62
|
+
* 브라우저 Web API는 Brotli 품질 레벨을 받지 않으므로 level 값은 무시됩니다.
|
|
63
|
+
*/
|
|
64
|
+
brotliCompress(data: Uint8Array, _level?: number): Promise<Uint8Array>;
|
|
65
|
+
/**
|
|
66
|
+
* DecompressionStream을 통해 Brotli 데이터를 압축 해제합니다.
|
|
67
|
+
*/
|
|
68
|
+
brotliDecompress(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
|
|
69
|
+
/**
|
|
70
|
+
* CompressionStream에 적합한 deflate 형식을 결정합니다.
|
|
71
|
+
* Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw'만 사용합니다.
|
|
72
|
+
*/
|
|
73
|
+
private getDeflateFormat;
|
|
74
|
+
private writeAndReadStream;
|
|
75
|
+
private readAllChunks;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Runtime detection helpers with no platform-specific imports.
|
|
80
|
+
*
|
|
81
|
+
* @module adapters/runtime
|
|
82
|
+
*/
|
|
83
|
+
/** 감지된 런타임 환경 식별자 */
|
|
84
|
+
type RuntimeId = "node" | "browser" | "edge" | "deno" | "bun" | "unknown";
|
|
85
|
+
/**
|
|
86
|
+
* 현재 JavaScript 런타임 환경을 감지합니다.
|
|
87
|
+
*
|
|
88
|
+
* 감지는 순수하게 globalThis 검사에 기반하며 Node.js 내장 모듈을 임포트하지 않습니다.
|
|
89
|
+
*/
|
|
90
|
+
declare function detectRuntime(): RuntimeId;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* ddunigma Web Streams API 구현.
|
|
94
|
+
*
|
|
95
|
+
* Web Streams API(globalThis.TransformStream)를 사용하는
|
|
96
|
+
* TransformStream 기반 인코딩/디코딩 파이프라인을 제공합니다.
|
|
97
|
+
* 모든 최신 브라우저와 Node.js에서 사용 가능합니다.
|
|
98
|
+
*
|
|
99
|
+
* 스트리밍 모드:
|
|
100
|
+
* - 압축/암호화/체크섬 비활성화 + 2의 제곱수 charset: 진정한 청크 단위 스트리밍
|
|
101
|
+
* - 그 외: 전체 축적 후 일괄 처리 (알고리즘/와이어 포맷 제약)
|
|
102
|
+
*
|
|
103
|
+
* 스트림 헤더 형식: [pad]DDS1[D|B|N][1|0][pad]
|
|
104
|
+
* D=deflate, B=brotli, N=없음 (압축), 1/0 (암호화).
|
|
105
|
+
*
|
|
106
|
+
* @module streams/WebStreams
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 바이너리 데이터를 charset 인코딩 문자열로 변환하는
|
|
111
|
+
* Web Streams API TransformStream을 생성합니다.
|
|
112
|
+
*
|
|
113
|
+
* 압축/암호화/체크섬이 비활성화되고 charset이 2의 제곱수일 때 각 청크를 즉시 인코딩합니다.
|
|
114
|
+
* 그 외에는 전체 데이터를 축적한 후 flush에서 처리합니다.
|
|
115
|
+
*
|
|
116
|
+
* @param encoder - 인코딩에 사용할 Ddu64Core 인스턴스
|
|
117
|
+
* @param options - 인코딩 옵션 (compress, encrypt, compressionAlgorithm 등)
|
|
118
|
+
* @returns TransformStream<Uint8Array, string>
|
|
119
|
+
*/
|
|
120
|
+
declare function createReadableEncodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<Uint8Array, string>;
|
|
121
|
+
/**
|
|
122
|
+
* charset 인코딩 문자열을 바이너리 데이터로 역변환하는
|
|
123
|
+
* Web Streams API TransformStream을 생성합니다.
|
|
124
|
+
*
|
|
125
|
+
* 스트림은 DDS1 스트림 헤더를 파싱하여 압축 및 암호화 설정을 감지한 후
|
|
126
|
+
* 페이로드를 그에 맞게 디코딩합니다.
|
|
127
|
+
*
|
|
128
|
+
* 압축/암호화/체크섬이 없고 charset이 2의 제곱수인 스트림은 헤더 파싱 후 각 청크를 즉시 디코딩합니다.
|
|
129
|
+
* 그 외에는 전체 페이로드를 축적 후 일괄 디코딩합니다.
|
|
130
|
+
*
|
|
131
|
+
* @param encoder - 디코딩에 사용할 Ddu64Core 인스턴스
|
|
132
|
+
* @param options - 디코딩 옵션
|
|
133
|
+
* @returns TransformStream<string, Uint8Array>
|
|
134
|
+
*/
|
|
135
|
+
declare function createReadableDecodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<string, Uint8Array>;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 한글 음절 난독화 레이어 구현.
|
|
139
|
+
*
|
|
140
|
+
* 암호화된 charset 인코딩 문자열을 결정론적 전단사 매핑을 사용하여
|
|
141
|
+
* 자연스러운 한국어 음절 블록으로 변환합니다. 매핑은 다음을 보장합니다:
|
|
142
|
+
* - 모든 출력 문자가 유효한 한국어 음절 블록 (U+AC00–U+D7A3)
|
|
143
|
+
* - 단일 문자 빈도가 기대 균등 빈도의 3배를 초과하지 않음
|
|
144
|
+
* - 출력 길이 <= 입력 길이의 1.5배 (실제로는 1:1 매핑)
|
|
145
|
+
*
|
|
146
|
+
* 플랫폼 독립적: Node.js 임포트 없음.
|
|
147
|
+
*
|
|
148
|
+
* @module obfuscation/ObfuscationLayer
|
|
149
|
+
*/
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 한글 음절 매핑을 사용하여 ObfuscationLayer 인터페이스를 구현합니다.
|
|
153
|
+
*
|
|
154
|
+
* 입력 알파벳(인코더가 사용하는 charset 문자)이 주어지면,
|
|
155
|
+
* 이 레이어는 각 문자를 결정론적으로 한글 음절에 매핑합니다.
|
|
156
|
+
* 매핑은 전단사(가역적)이며 위치에 따라 각 문자의 할당된 음절 범위를
|
|
157
|
+
* 순환하여 출력 빈도를 균등하게 분배합니다.
|
|
158
|
+
*/
|
|
159
|
+
declare class HangulObfuscationLayer implements ObfuscationLayer {
|
|
160
|
+
private readonly config;
|
|
161
|
+
/**
|
|
162
|
+
* 새 HangulObfuscationLayer를 생성합니다.
|
|
163
|
+
*
|
|
164
|
+
* @param alphabet - 완전한 입력 알파벳 (charset 문자 + 패딩 문자).
|
|
165
|
+
* 인코딩된 문자열에 나타날 수 있는 모든 고유 문자.
|
|
166
|
+
*/
|
|
167
|
+
constructor(alphabet: string[]);
|
|
168
|
+
/**
|
|
169
|
+
* 암호화된 charset 인코딩 문자열을 한글 음절로 변환합니다.
|
|
170
|
+
*
|
|
171
|
+
* 각 입력 문자는 할당된 범위의 한글 음절에 매핑됩니다.
|
|
172
|
+
* 문자열 내 위치가 범위 내 어떤 음절을 사용할지 결정하여
|
|
173
|
+
* 균등한 빈도 분포를 보장합니다.
|
|
174
|
+
*
|
|
175
|
+
* @param input - 암호화된 charset 인코딩 문자열
|
|
176
|
+
* @returns 한글 음절 블록 문자열 (U+AC00–U+D7A3)
|
|
177
|
+
* @throws 입력에 알파벳에 없는 문자가 포함된 경우 에러
|
|
178
|
+
*/
|
|
179
|
+
obfuscate(input: string): string;
|
|
180
|
+
/**
|
|
181
|
+
* 난독화를 역변환하여 원본 charset 인코딩 문자열을 복원합니다.
|
|
182
|
+
*
|
|
183
|
+
* 각 한글 음절이 어떤 문자의 범위에 속하는지 판별하여
|
|
184
|
+
* 원래 문자로 매핑합니다.
|
|
185
|
+
*
|
|
186
|
+
* @param input - 난독화된 한글 음절 문자열
|
|
187
|
+
* @returns 원본 charset 인코딩 문자열
|
|
188
|
+
* @throws 입력에 유효한 한글 음절 범위 밖의 문자가 포함되거나
|
|
189
|
+
* 알파벳 문자에 매핑되지 않는 문자가 포함된 경우 에러
|
|
190
|
+
*/
|
|
191
|
+
deobfuscate(input: string): string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 주어진 charset 설정에 대한 ObfuscationLayer를 생성합니다.
|
|
195
|
+
*
|
|
196
|
+
* charset 문자와 패딩 문자로부터 완전한 알파벳을 구성한 후
|
|
197
|
+
* 한글 난독화 레이어를 생성합니다.
|
|
198
|
+
*
|
|
199
|
+
* @param charSet - 인코딩에 사용되는 charset 문자
|
|
200
|
+
* @param paddingChar - 패딩 문자
|
|
201
|
+
* @returns ObfuscationLayer 인스턴스
|
|
202
|
+
*/
|
|
203
|
+
declare function createObfuscationLayer(charSet: string[], paddingChar: string): ObfuscationLayer;
|
|
204
|
+
|
|
205
|
+
export { BrowserAdapter as B, HangulObfuscationLayer as H, createReadableDecodeStream as a, createReadableEncodeStream as b, createObfuscationLayer as c, detectRuntime as d };
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { P as PlatformAdapter, i as KeyDerivationOptions, D as Ddu64Core, e as DduOptions, O as ObfuscationLayer } from './core-DYSnygnp.cjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 브라우저 플랫폼 어댑터 구현.
|
|
5
|
+
* 암호화 연산에 Web Crypto API(SubtleCrypto)를 사용하고
|
|
6
|
+
* 압축에 CompressionStream/DecompressionStream을 사용합니다.
|
|
7
|
+
*
|
|
8
|
+
* 이 어댑터는 동기 암호화 또는 압축 연산을 지원하지 않습니다.
|
|
9
|
+
* Brotli는 CompressionStream/DecompressionStream에서 지원되는 런타임에서만 사용할 수 있습니다.
|
|
10
|
+
*
|
|
11
|
+
* @module adapters/BrowserAdapter
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Web API를 사용하여 PlatformAdapter를 구현하는 BrowserAdapter:
|
|
16
|
+
* - AES-256-GCM 및 SHA-256을 위한 Web Crypto API(SubtleCrypto)
|
|
17
|
+
* - 안전한 랜덤 바이트를 위한 crypto.getRandomValues
|
|
18
|
+
* - deflate-raw 압축을 위한 CompressionStream/DecompressionStream
|
|
19
|
+
* - 런타임이 지원하는 경우 Brotli 압축
|
|
20
|
+
*/
|
|
21
|
+
declare class BrowserAdapter implements PlatformAdapter {
|
|
22
|
+
readonly supportsSyncCrypto = false;
|
|
23
|
+
readonly supportsSyncCompression = false;
|
|
24
|
+
readonly supportsBrotli: boolean;
|
|
25
|
+
readonly runtime: "browser";
|
|
26
|
+
/**
|
|
27
|
+
* UTF-8 키 문자열에서 SHA-256을 통해 256비트 키를 파생합니다.
|
|
28
|
+
* UTF-8 인코딩된 키에 SubtleCrypto.digest('SHA-256', ...)를 사용합니다.
|
|
29
|
+
*/
|
|
30
|
+
deriveKey(key: string, options?: KeyDerivationOptions): Promise<Uint8Array>;
|
|
31
|
+
/**
|
|
32
|
+
* 12바이트 IV를 사용하여 AES-256-GCM으로 데이터를 암호화합니다.
|
|
33
|
+
* 와이어 포맷 반환: IV(12바이트) + authTag(16바이트) + 암호문.
|
|
34
|
+
*
|
|
35
|
+
* 참고: Web Crypto는 authTag를 암호문에 추가하므로,
|
|
36
|
+
* 마지막 16바이트를 authTag로 추출하고 와이어 포맷에 맞게 재배치합니다.
|
|
37
|
+
*/
|
|
38
|
+
encrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
|
|
39
|
+
/**
|
|
40
|
+
* AES-256-GCM 페이로드를 복호화합니다.
|
|
41
|
+
* 와이어 포맷 기대: IV(12바이트) + authTag(16바이트) + 암호문.
|
|
42
|
+
* 복호화 전에 Web Crypto 형식(암호문 + authTag)으로 재구성합니다.
|
|
43
|
+
*/
|
|
44
|
+
decrypt(data: Uint8Array, keyHash: Uint8Array): Promise<Uint8Array>;
|
|
45
|
+
/**
|
|
46
|
+
* 암호학적으로 안전한 랜덤 바이트를 생성합니다.
|
|
47
|
+
*/
|
|
48
|
+
randomBytes(length: number): Uint8Array;
|
|
49
|
+
/**
|
|
50
|
+
* CompressionStream을 통해 deflate로 데이터를 압축합니다.
|
|
51
|
+
* Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
|
|
52
|
+
*/
|
|
53
|
+
deflate(data: Uint8Array, _level?: number): Promise<Uint8Array>;
|
|
54
|
+
/**
|
|
55
|
+
* DecompressionStream을 통해 deflate 데이터를 압축 해제합니다.
|
|
56
|
+
* Node.js zlib.inflateRaw와의 상호운용성을 위해 'deflate-raw' 형식만 사용합니다.
|
|
57
|
+
* maxBytes가 지정되면 제한을 적용합니다.
|
|
58
|
+
*/
|
|
59
|
+
inflate(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
|
|
60
|
+
/**
|
|
61
|
+
* CompressionStream을 통해 Brotli로 데이터를 압축합니다.
|
|
62
|
+
* 브라우저 Web API는 Brotli 품질 레벨을 받지 않으므로 level 값은 무시됩니다.
|
|
63
|
+
*/
|
|
64
|
+
brotliCompress(data: Uint8Array, _level?: number): Promise<Uint8Array>;
|
|
65
|
+
/**
|
|
66
|
+
* DecompressionStream을 통해 Brotli 데이터를 압축 해제합니다.
|
|
67
|
+
*/
|
|
68
|
+
brotliDecompress(data: Uint8Array, maxBytes?: number): Promise<Uint8Array>;
|
|
69
|
+
/**
|
|
70
|
+
* CompressionStream에 적합한 deflate 형식을 결정합니다.
|
|
71
|
+
* Node.js zlib.deflateRaw와의 상호운용성을 위해 'deflate-raw'만 사용합니다.
|
|
72
|
+
*/
|
|
73
|
+
private getDeflateFormat;
|
|
74
|
+
private writeAndReadStream;
|
|
75
|
+
private readAllChunks;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Runtime detection helpers with no platform-specific imports.
|
|
80
|
+
*
|
|
81
|
+
* @module adapters/runtime
|
|
82
|
+
*/
|
|
83
|
+
/** 감지된 런타임 환경 식별자 */
|
|
84
|
+
type RuntimeId = "node" | "browser" | "edge" | "deno" | "bun" | "unknown";
|
|
85
|
+
/**
|
|
86
|
+
* 현재 JavaScript 런타임 환경을 감지합니다.
|
|
87
|
+
*
|
|
88
|
+
* 감지는 순수하게 globalThis 검사에 기반하며 Node.js 내장 모듈을 임포트하지 않습니다.
|
|
89
|
+
*/
|
|
90
|
+
declare function detectRuntime(): RuntimeId;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* ddunigma Web Streams API 구현.
|
|
94
|
+
*
|
|
95
|
+
* Web Streams API(globalThis.TransformStream)를 사용하는
|
|
96
|
+
* TransformStream 기반 인코딩/디코딩 파이프라인을 제공합니다.
|
|
97
|
+
* 모든 최신 브라우저와 Node.js에서 사용 가능합니다.
|
|
98
|
+
*
|
|
99
|
+
* 스트리밍 모드:
|
|
100
|
+
* - 압축/암호화/체크섬 비활성화 + 2의 제곱수 charset: 진정한 청크 단위 스트리밍
|
|
101
|
+
* - 그 외: 전체 축적 후 일괄 처리 (알고리즘/와이어 포맷 제약)
|
|
102
|
+
*
|
|
103
|
+
* 스트림 헤더 형식: [pad]DDS1[D|B|N][1|0][pad]
|
|
104
|
+
* D=deflate, B=brotli, N=없음 (압축), 1/0 (암호화).
|
|
105
|
+
*
|
|
106
|
+
* @module streams/WebStreams
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* 바이너리 데이터를 charset 인코딩 문자열로 변환하는
|
|
111
|
+
* Web Streams API TransformStream을 생성합니다.
|
|
112
|
+
*
|
|
113
|
+
* 압축/암호화/체크섬이 비활성화되고 charset이 2의 제곱수일 때 각 청크를 즉시 인코딩합니다.
|
|
114
|
+
* 그 외에는 전체 데이터를 축적한 후 flush에서 처리합니다.
|
|
115
|
+
*
|
|
116
|
+
* @param encoder - 인코딩에 사용할 Ddu64Core 인스턴스
|
|
117
|
+
* @param options - 인코딩 옵션 (compress, encrypt, compressionAlgorithm 등)
|
|
118
|
+
* @returns TransformStream<Uint8Array, string>
|
|
119
|
+
*/
|
|
120
|
+
declare function createReadableEncodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<Uint8Array, string>;
|
|
121
|
+
/**
|
|
122
|
+
* charset 인코딩 문자열을 바이너리 데이터로 역변환하는
|
|
123
|
+
* Web Streams API TransformStream을 생성합니다.
|
|
124
|
+
*
|
|
125
|
+
* 스트림은 DDS1 스트림 헤더를 파싱하여 압축 및 암호화 설정을 감지한 후
|
|
126
|
+
* 페이로드를 그에 맞게 디코딩합니다.
|
|
127
|
+
*
|
|
128
|
+
* 압축/암호화/체크섬이 없고 charset이 2의 제곱수인 스트림은 헤더 파싱 후 각 청크를 즉시 디코딩합니다.
|
|
129
|
+
* 그 외에는 전체 페이로드를 축적 후 일괄 디코딩합니다.
|
|
130
|
+
*
|
|
131
|
+
* @param encoder - 디코딩에 사용할 Ddu64Core 인스턴스
|
|
132
|
+
* @param options - 디코딩 옵션
|
|
133
|
+
* @returns TransformStream<string, Uint8Array>
|
|
134
|
+
*/
|
|
135
|
+
declare function createReadableDecodeStream(encoder: Ddu64Core, options?: DduOptions): TransformStream<string, Uint8Array>;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 한글 음절 난독화 레이어 구현.
|
|
139
|
+
*
|
|
140
|
+
* 암호화된 charset 인코딩 문자열을 결정론적 전단사 매핑을 사용하여
|
|
141
|
+
* 자연스러운 한국어 음절 블록으로 변환합니다. 매핑은 다음을 보장합니다:
|
|
142
|
+
* - 모든 출력 문자가 유효한 한국어 음절 블록 (U+AC00–U+D7A3)
|
|
143
|
+
* - 단일 문자 빈도가 기대 균등 빈도의 3배를 초과하지 않음
|
|
144
|
+
* - 출력 길이 <= 입력 길이의 1.5배 (실제로는 1:1 매핑)
|
|
145
|
+
*
|
|
146
|
+
* 플랫폼 독립적: Node.js 임포트 없음.
|
|
147
|
+
*
|
|
148
|
+
* @module obfuscation/ObfuscationLayer
|
|
149
|
+
*/
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* 한글 음절 매핑을 사용하여 ObfuscationLayer 인터페이스를 구현합니다.
|
|
153
|
+
*
|
|
154
|
+
* 입력 알파벳(인코더가 사용하는 charset 문자)이 주어지면,
|
|
155
|
+
* 이 레이어는 각 문자를 결정론적으로 한글 음절에 매핑합니다.
|
|
156
|
+
* 매핑은 전단사(가역적)이며 위치에 따라 각 문자의 할당된 음절 범위를
|
|
157
|
+
* 순환하여 출력 빈도를 균등하게 분배합니다.
|
|
158
|
+
*/
|
|
159
|
+
declare class HangulObfuscationLayer implements ObfuscationLayer {
|
|
160
|
+
private readonly config;
|
|
161
|
+
/**
|
|
162
|
+
* 새 HangulObfuscationLayer를 생성합니다.
|
|
163
|
+
*
|
|
164
|
+
* @param alphabet - 완전한 입력 알파벳 (charset 문자 + 패딩 문자).
|
|
165
|
+
* 인코딩된 문자열에 나타날 수 있는 모든 고유 문자.
|
|
166
|
+
*/
|
|
167
|
+
constructor(alphabet: string[]);
|
|
168
|
+
/**
|
|
169
|
+
* 암호화된 charset 인코딩 문자열을 한글 음절로 변환합니다.
|
|
170
|
+
*
|
|
171
|
+
* 각 입력 문자는 할당된 범위의 한글 음절에 매핑됩니다.
|
|
172
|
+
* 문자열 내 위치가 범위 내 어떤 음절을 사용할지 결정하여
|
|
173
|
+
* 균등한 빈도 분포를 보장합니다.
|
|
174
|
+
*
|
|
175
|
+
* @param input - 암호화된 charset 인코딩 문자열
|
|
176
|
+
* @returns 한글 음절 블록 문자열 (U+AC00–U+D7A3)
|
|
177
|
+
* @throws 입력에 알파벳에 없는 문자가 포함된 경우 에러
|
|
178
|
+
*/
|
|
179
|
+
obfuscate(input: string): string;
|
|
180
|
+
/**
|
|
181
|
+
* 난독화를 역변환하여 원본 charset 인코딩 문자열을 복원합니다.
|
|
182
|
+
*
|
|
183
|
+
* 각 한글 음절이 어떤 문자의 범위에 속하는지 판별하여
|
|
184
|
+
* 원래 문자로 매핑합니다.
|
|
185
|
+
*
|
|
186
|
+
* @param input - 난독화된 한글 음절 문자열
|
|
187
|
+
* @returns 원본 charset 인코딩 문자열
|
|
188
|
+
* @throws 입력에 유효한 한글 음절 범위 밖의 문자가 포함되거나
|
|
189
|
+
* 알파벳 문자에 매핑되지 않는 문자가 포함된 경우 에러
|
|
190
|
+
*/
|
|
191
|
+
deobfuscate(input: string): string;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 주어진 charset 설정에 대한 ObfuscationLayer를 생성합니다.
|
|
195
|
+
*
|
|
196
|
+
* charset 문자와 패딩 문자로부터 완전한 알파벳을 구성한 후
|
|
197
|
+
* 한글 난독화 레이어를 생성합니다.
|
|
198
|
+
*
|
|
199
|
+
* @param charSet - 인코딩에 사용되는 charset 문자
|
|
200
|
+
* @param paddingChar - 패딩 문자
|
|
201
|
+
* @returns ObfuscationLayer 인스턴스
|
|
202
|
+
*/
|
|
203
|
+
declare function createObfuscationLayer(charSet: string[], paddingChar: string): ObfuscationLayer;
|
|
204
|
+
|
|
205
|
+
export { BrowserAdapter as B, HangulObfuscationLayer as H, createReadableDecodeStream as a, createReadableEncodeStream as b, createObfuscationLayer as c, detectRuntime as d };
|