@digitalwalletcorp/utils 0.4.2 → 0.5.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/lib/crypto-util-B5K2CmE2.js +70 -0
- package/lib/crypto-util-B5K2CmE2.js.map +1 -0
- package/lib/crypto-util-BcHurtbE.cjs +2 -0
- package/lib/crypto-util-BcHurtbE.cjs.map +1 -0
- package/lib/crypto-util.cjs +1 -1
- package/lib/crypto-util.d.cts +19 -0
- package/lib/crypto-util.d.ts +19 -0
- package/lib/crypto-util.js +5 -3
- package/lib/index.cjs +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
- package/src/crypto-util.ts +44 -0
- package/lib/crypto-util-DFJqfmuw.js +0 -46
- package/lib/crypto-util-DFJqfmuw.js.map +0 -1
- package/lib/crypto-util-DeZSGetI.cjs +0 -2
- package/lib/crypto-util-DeZSGetI.cjs.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import c from "crypto-js";
|
|
2
|
+
const u = {
|
|
3
|
+
ascii: "!\"#$%&'()*+,-./0123456789:;<=>?@[]^_`abcdefghijklmnopqrstuvwxyz{|}~",
|
|
4
|
+
number: "0123456789",
|
|
5
|
+
alphabet: "abcdefghijklmnopqrstuvwxyz",
|
|
6
|
+
alphanum: "0123456789abcdefghijklmnopqrstuvwxyz",
|
|
7
|
+
hex: "0123456789abcdef"
|
|
8
|
+
}, d = (e) => globalThis.crypto.getRandomValues(new Uint8Array(e));
|
|
9
|
+
function f(e) {
|
|
10
|
+
return c.SHA256(e).toString().toUpperCase();
|
|
11
|
+
}
|
|
12
|
+
function g(e, r) {
|
|
13
|
+
if (!Number.isInteger(e) || e < 0)
|
|
14
|
+
throw new Error("crypto-util.generateRandomString: length must be a non-negative integer");
|
|
15
|
+
const t = u[r?.charset ?? "ascii"], a = t.toUpperCase();
|
|
16
|
+
let i = r?.case === "upperCase" ? a : r?.case === "lowerCase" ? t : t + a;
|
|
17
|
+
const s = r?.includeChars;
|
|
18
|
+
s && (i += Array.isArray(s) ? s.join("") : s);
|
|
19
|
+
const l = r?.excludeChars;
|
|
20
|
+
if (l) {
|
|
21
|
+
const y = new Set(Array.isArray(l) ? l : Array.from(l));
|
|
22
|
+
i = Array.from(i).filter((h) => !y.has(h)).join("");
|
|
23
|
+
}
|
|
24
|
+
const o = Array.from(new Set(i));
|
|
25
|
+
if (!o.length)
|
|
26
|
+
throw new Error("crypto-util.generateRandomString: no characters left after applying excludeChars");
|
|
27
|
+
const p = Math.floor(256 / o.length) * o.length - 1;
|
|
28
|
+
let n = "";
|
|
29
|
+
do
|
|
30
|
+
for (n = ""; n.length < e; )
|
|
31
|
+
for (const y of d(e - n.length))
|
|
32
|
+
y <= p && (n += o[y % o.length]);
|
|
33
|
+
while (r?.rejectStartsWithZero && n.startsWith("0"));
|
|
34
|
+
return n;
|
|
35
|
+
}
|
|
36
|
+
function S(e, r) {
|
|
37
|
+
try {
|
|
38
|
+
return c.AES.encrypt(e, r).toString();
|
|
39
|
+
} catch {
|
|
40
|
+
throw new Error("crypto-util.encryptAES: plainText contains an unpaired surrogate");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function w(e, r) {
|
|
44
|
+
const t = c.format.OpenSSL.parse(e).ciphertext;
|
|
45
|
+
if (!t.sigBytes || t.sigBytes % 16 !== 0)
|
|
46
|
+
throw new Error("crypto-util.decryptAES: encryptedText is not a valid ciphertext");
|
|
47
|
+
const a = c.AES.decrypt(e, r);
|
|
48
|
+
if (a.sigBytes < 0)
|
|
49
|
+
throw new Error("crypto-util.decryptAES: failed to decrypt. The key may be wrong");
|
|
50
|
+
try {
|
|
51
|
+
return a.toString(c.enc.Utf8);
|
|
52
|
+
} catch {
|
|
53
|
+
throw new Error("crypto-util.decryptAES: failed to decrypt. The key may be wrong");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const A = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
57
|
+
__proto__: null,
|
|
58
|
+
decryptAES: w,
|
|
59
|
+
encryptAES: S,
|
|
60
|
+
generateRandomString: g,
|
|
61
|
+
toSha256: f
|
|
62
|
+
}, Symbol.toStringTag, { value: "Module" }));
|
|
63
|
+
export {
|
|
64
|
+
A as c,
|
|
65
|
+
w as d,
|
|
66
|
+
S as e,
|
|
67
|
+
g,
|
|
68
|
+
f as t
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=crypto-util-B5K2CmE2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-util-B5K2CmE2.js","sources":["../src/crypto-util.ts"],"sourcesContent":["import CryptoJS from 'crypto-js';\n\nconst CHARSETS = {\n ascii: `!\"#$%&'()*+,-./0123456789:;<=>?@[]^_\\`abcdefghijklmnopqrstuvwxyz{|}~`,\n number: '0123456789',\n alphabet: 'abcdefghijklmnopqrstuvwxyz',\n alphanum: '0123456789abcdefghijklmnopqrstuvwxyz',\n hex: '0123456789abcdef'\n} as const;\n\nconst randomBytes = (size: number): Uint8Array => globalThis.crypto.getRandomValues(new Uint8Array(size));\n\n/**\n * 文字列をSHA-256でハッシュ化し、大文字の16進数文字列で返す\n *\n * @param {string} str\n * @returns {string}\n */\nexport function toSha256(str: string): string {\n return CryptoJS.SHA256(str).toString().toUpperCase();\n}\n\n/**\n * ランダムな文字列を生成する\n * 大文字と小文字は別の文字として扱う\n * caseを指定しない場合は生成対象の文字セットに大文字と小文字の両方を含めるため、'a'と'A'の出現率は同じ確率になる\n *\n * @param {number} length 生成する文字列の桁数\n * @param {*} [options]\n * ├ charset 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex' 未指定の場合はASCIIの記号・数字・英字(スペースとバックスラッシュを除く)\n * ├ case 'upperCase' | 'lowerCase' 英字を大文字のみ・小文字のみにする。未指定の場合は大文字小文字混在\n * ├ rejectStartsWithZero trueを指定した場合、0始まりの文字列を生成しない\n * ├ includeChars 文字セットに追加する文字。大文字小文字を区別する\n * ├ excludeChars 文字セットから除外する文字。大文字小文字は区別する\n * @returns {string}\n */\nexport function generateRandomString(length: number, options?: {\n charset?: 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex';\n case?: 'upperCase' | 'lowerCase';\n rejectStartsWithZero?: boolean;\n includeChars?: string | string[];\n excludeChars?: string | string[];\n}): string {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error('crypto-util.generateRandomString: length must be a non-negative integer');\n }\n\n const lower = CHARSETS[options?.charset ?? 'ascii'];\n const upper = lower.toUpperCase();\n let pool = options?.case === 'upperCase'\n ? upper\n : options?.case === 'lowerCase'\n ? lower\n : lower + upper;\n const includeChars = options?.includeChars;\n if (includeChars) {\n // 追加文字の指定がある場合\n pool += Array.isArray(includeChars) ? includeChars.join('') : includeChars;\n }\n const excludeChars = options?.excludeChars;\n if (excludeChars) {\n // 除外文字の指定がある場合\n const excluded = new Set(Array.isArray(excludeChars) ? excludeChars : Array.from(excludeChars));\n pool = Array.from(pool).filter(a => !excluded.has(a)).join('');\n }\n const characters = Array.from(new Set(pool));\n if (!characters.length) {\n throw new Error('crypto-util.generateRandomString: no characters left after applying excludeChars');\n }\n // 256を文字種の数で割り切れる範囲のバイトだけを使い、文字ごとの出現率を揃える\n const maxAcceptableValue = Math.floor(256 / characters.length) * characters.length - 1;\n let result = '';\n do {\n result = '';\n while (result.length < length) {\n for (const byte of randomBytes(length - result.length)) {\n if (byte <= maxAcceptableValue) {\n result += characters[byte % characters.length];\n }\n }\n }\n } while (options?.rejectStartsWithZero && result.startsWith('0'));\n return result;\n}\n\n/**\n * 文字列をAESで暗号化し、Base64の文字列で返す\n * OpenSSL互換のパスフレーズ方式で、saltを毎回ランダムに生成するため同じ入力でも結果は毎回異なる\n *\n * @param {string} plainText\n * @param {string} key パスフレーズ\n * @returns {string}\n */\nexport function encryptAES(plainText: string, key: string): string {\n try {\n return CryptoJS.AES.encrypt(plainText, key).toString();\n } catch {\n // UTF-8に変換できない文字列(サロゲートペアの片割れを含む)はURIErrorになるので、原因が分かるメッセージに置き換える\n throw new Error('crypto-util.encryptAES: plainText contains an unpaired surrogate');\n }\n}\n\n/**\n * encryptAESで暗号化した文字列を復号する\n * 暗号文の形式が不正な場合と、復号に失敗したことが分かる場合は例外を投げる\n * (鍵違いは確実には検出できない。復号結果がたまたまパディングとUTF-8として成立すると、空文字や意味のない文字列が返ることがある)\n *\n * @param {string} encryptedText\n * @param {string} key パスフレーズ\n * @returns {string}\n */\nexport function decryptAES(encryptedText: string, key: string): string {\n const ciphertext = CryptoJS.format.OpenSSL.parse(encryptedText).ciphertext;\n if (!ciphertext.sigBytes || ciphertext.sigBytes % 16 !== 0) {\n throw new Error('crypto-util.decryptAES: encryptedText is not a valid ciphertext');\n }\n const decrypted = CryptoJS.AES.decrypt(encryptedText, key);\n // 鍵が違うとパディングが壊れて長さが負になる\n if (decrypted.sigBytes < 0) {\n throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');\n }\n try {\n return decrypted.toString(CryptoJS.enc.Utf8);\n } catch {\n // パディングは成立したが復号結果がUTF-8として不正な場合も鍵違い\n throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');\n }\n}\n"],"names":["CHARSETS","randomBytes","size","toSha256","str","CryptoJS","generateRandomString","length","options","lower","upper","pool","includeChars","excludeChars","excluded","a","characters","maxAcceptableValue","result","byte","encryptAES","plainText","key","decryptAES","encryptedText","ciphertext","decrypted"],"mappings":";AAEA,MAAMA,IAAW;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AACP,GAEMC,IAAc,CAACC,MAA6B,WAAW,OAAO,gBAAgB,IAAI,WAAWA,CAAI,CAAC;AAQjG,SAASC,EAASC,GAAqB;AAC5C,SAAOC,EAAS,OAAOD,CAAG,EAAE,SAAA,EAAW,YAAA;AACzC;AAgBO,SAASE,EAAqBC,GAAgBC,GAM1C;AACT,MAAI,CAAC,OAAO,UAAUD,CAAM,KAAKA,IAAS;AACxC,UAAM,IAAI,MAAM,yEAAyE;AAG3F,QAAME,IAAQT,EAASQ,GAAS,WAAW,OAAO,GAC5CE,IAAQD,EAAM,YAAA;AACpB,MAAIE,IAAOH,GAAS,SAAS,cACzBE,IACAF,GAAS,SAAS,cAChBC,IACAA,IAAQC;AACd,QAAME,IAAeJ,GAAS;AAC9B,EAAII,MAEFD,KAAQ,MAAM,QAAQC,CAAY,IAAIA,EAAa,KAAK,EAAE,IAAIA;AAEhE,QAAMC,IAAeL,GAAS;AAC9B,MAAIK,GAAc;AAEhB,UAAMC,IAAW,IAAI,IAAI,MAAM,QAAQD,CAAY,IAAIA,IAAe,MAAM,KAAKA,CAAY,CAAC;AAC9F,IAAAF,IAAO,MAAM,KAAKA,CAAI,EAAE,OAAO,CAAAI,MAAK,CAACD,EAAS,IAAIC,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/D;AACA,QAAMC,IAAa,MAAM,KAAK,IAAI,IAAIL,CAAI,CAAC;AAC3C,MAAI,CAACK,EAAW;AACd,UAAM,IAAI,MAAM,kFAAkF;AAGpG,QAAMC,IAAqB,KAAK,MAAM,MAAMD,EAAW,MAAM,IAAIA,EAAW,SAAS;AACrF,MAAIE,IAAS;AACb;AAEE,SADAA,IAAS,IACFA,EAAO,SAASX;AACrB,iBAAWY,KAAQlB,EAAYM,IAASW,EAAO,MAAM;AACnD,QAAIC,KAAQF,MACVC,KAAUF,EAAWG,IAAOH,EAAW,MAAM;AAAA,SAI5CR,GAAS,wBAAwBU,EAAO,WAAW,GAAG;AAC/D,SAAOA;AACT;AAUO,SAASE,EAAWC,GAAmBC,GAAqB;AACjE,MAAI;AACF,WAAOjB,EAAS,IAAI,QAAQgB,GAAWC,CAAG,EAAE,SAAA;AAAA,EAC9C,QAAQ;AAEN,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACF;AAWO,SAASC,EAAWC,GAAuBF,GAAqB;AACrE,QAAMG,IAAapB,EAAS,OAAO,QAAQ,MAAMmB,CAAa,EAAE;AAChE,MAAI,CAACC,EAAW,YAAYA,EAAW,WAAW,OAAO;AACvD,UAAM,IAAI,MAAM,iEAAiE;AAEnF,QAAMC,IAAYrB,EAAS,IAAI,QAAQmB,GAAeF,CAAG;AAEzD,MAAII,EAAU,WAAW;AACvB,UAAM,IAAI,MAAM,iEAAiE;AAEnF,MAAI;AACF,WAAOA,EAAU,SAASrB,EAAS,IAAI,IAAI;AAAA,EAC7C,QAAQ;AAEN,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AACF;;;;;;;;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const c=require("crypto-js"),S={ascii:"!\"#$%&'()*+,-./0123456789:;<=>?@[]^_`abcdefghijklmnopqrstuvwxyz{|}~",number:"0123456789",alphabet:"abcdefghijklmnopqrstuvwxyz",alphanum:"0123456789abcdefghijklmnopqrstuvwxyz",hex:"0123456789abcdef"},w=e=>globalThis.crypto.getRandomValues(new Uint8Array(e));function p(e){return c.SHA256(e).toString().toUpperCase()}function h(e,r){if(!Number.isInteger(e)||e<0)throw new Error("crypto-util.generateRandomString: length must be a non-negative integer");const t=S[r?.charset??"ascii"],o=t.toUpperCase();let i=r?.case==="upperCase"?o:r?.case==="lowerCase"?t:t+o;const s=r?.includeChars;s&&(i+=Array.isArray(s)?s.join(""):s);const l=r?.excludeChars;if(l){const y=new Set(Array.isArray(l)?l:Array.from(l));i=Array.from(i).filter(f=>!y.has(f)).join("")}const a=Array.from(new Set(i));if(!a.length)throw new Error("crypto-util.generateRandomString: no characters left after applying excludeChars");const g=Math.floor(256/a.length)*a.length-1;let n="";do for(n="";n.length<e;)for(const y of w(e-n.length))y<=g&&(n+=a[y%a.length]);while(r?.rejectStartsWithZero&&n.startsWith("0"));return n}function u(e,r){try{return c.AES.encrypt(e,r).toString()}catch{throw new Error("crypto-util.encryptAES: plainText contains an unpaired surrogate")}}function d(e,r){const t=c.format.OpenSSL.parse(e).ciphertext;if(!t.sigBytes||t.sigBytes%16!==0)throw new Error("crypto-util.decryptAES: encryptedText is not a valid ciphertext");const o=c.AES.decrypt(e,r);if(o.sigBytes<0)throw new Error("crypto-util.decryptAES: failed to decrypt. The key may be wrong");try{return o.toString(c.enc.Utf8)}catch{throw new Error("crypto-util.decryptAES: failed to decrypt. The key may be wrong")}}const m=Object.freeze(Object.defineProperty({__proto__:null,decryptAES:d,encryptAES:u,generateRandomString:h,toSha256:p},Symbol.toStringTag,{value:"Module"}));exports.cryptoUtil=m;exports.decryptAES=d;exports.encryptAES=u;exports.generateRandomString=h;exports.toSha256=p;
|
|
2
|
+
//# sourceMappingURL=crypto-util-BcHurtbE.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto-util-BcHurtbE.cjs","sources":["../src/crypto-util.ts"],"sourcesContent":["import CryptoJS from 'crypto-js';\n\nconst CHARSETS = {\n ascii: `!\"#$%&'()*+,-./0123456789:;<=>?@[]^_\\`abcdefghijklmnopqrstuvwxyz{|}~`,\n number: '0123456789',\n alphabet: 'abcdefghijklmnopqrstuvwxyz',\n alphanum: '0123456789abcdefghijklmnopqrstuvwxyz',\n hex: '0123456789abcdef'\n} as const;\n\nconst randomBytes = (size: number): Uint8Array => globalThis.crypto.getRandomValues(new Uint8Array(size));\n\n/**\n * 文字列をSHA-256でハッシュ化し、大文字の16進数文字列で返す\n *\n * @param {string} str\n * @returns {string}\n */\nexport function toSha256(str: string): string {\n return CryptoJS.SHA256(str).toString().toUpperCase();\n}\n\n/**\n * ランダムな文字列を生成する\n * 大文字と小文字は別の文字として扱う\n * caseを指定しない場合は生成対象の文字セットに大文字と小文字の両方を含めるため、'a'と'A'の出現率は同じ確率になる\n *\n * @param {number} length 生成する文字列の桁数\n * @param {*} [options]\n * ├ charset 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex' 未指定の場合はASCIIの記号・数字・英字(スペースとバックスラッシュを除く)\n * ├ case 'upperCase' | 'lowerCase' 英字を大文字のみ・小文字のみにする。未指定の場合は大文字小文字混在\n * ├ rejectStartsWithZero trueを指定した場合、0始まりの文字列を生成しない\n * ├ includeChars 文字セットに追加する文字。大文字小文字を区別する\n * ├ excludeChars 文字セットから除外する文字。大文字小文字は区別する\n * @returns {string}\n */\nexport function generateRandomString(length: number, options?: {\n charset?: 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex';\n case?: 'upperCase' | 'lowerCase';\n rejectStartsWithZero?: boolean;\n includeChars?: string | string[];\n excludeChars?: string | string[];\n}): string {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error('crypto-util.generateRandomString: length must be a non-negative integer');\n }\n\n const lower = CHARSETS[options?.charset ?? 'ascii'];\n const upper = lower.toUpperCase();\n let pool = options?.case === 'upperCase'\n ? upper\n : options?.case === 'lowerCase'\n ? lower\n : lower + upper;\n const includeChars = options?.includeChars;\n if (includeChars) {\n // 追加文字の指定がある場合\n pool += Array.isArray(includeChars) ? includeChars.join('') : includeChars;\n }\n const excludeChars = options?.excludeChars;\n if (excludeChars) {\n // 除外文字の指定がある場合\n const excluded = new Set(Array.isArray(excludeChars) ? excludeChars : Array.from(excludeChars));\n pool = Array.from(pool).filter(a => !excluded.has(a)).join('');\n }\n const characters = Array.from(new Set(pool));\n if (!characters.length) {\n throw new Error('crypto-util.generateRandomString: no characters left after applying excludeChars');\n }\n // 256を文字種の数で割り切れる範囲のバイトだけを使い、文字ごとの出現率を揃える\n const maxAcceptableValue = Math.floor(256 / characters.length) * characters.length - 1;\n let result = '';\n do {\n result = '';\n while (result.length < length) {\n for (const byte of randomBytes(length - result.length)) {\n if (byte <= maxAcceptableValue) {\n result += characters[byte % characters.length];\n }\n }\n }\n } while (options?.rejectStartsWithZero && result.startsWith('0'));\n return result;\n}\n\n/**\n * 文字列をAESで暗号化し、Base64の文字列で返す\n * OpenSSL互換のパスフレーズ方式で、saltを毎回ランダムに生成するため同じ入力でも結果は毎回異なる\n *\n * @param {string} plainText\n * @param {string} key パスフレーズ\n * @returns {string}\n */\nexport function encryptAES(plainText: string, key: string): string {\n try {\n return CryptoJS.AES.encrypt(plainText, key).toString();\n } catch {\n // UTF-8に変換できない文字列(サロゲートペアの片割れを含む)はURIErrorになるので、原因が分かるメッセージに置き換える\n throw new Error('crypto-util.encryptAES: plainText contains an unpaired surrogate');\n }\n}\n\n/**\n * encryptAESで暗号化した文字列を復号する\n * 暗号文の形式が不正な場合と、復号に失敗したことが分かる場合は例外を投げる\n * (鍵違いは確実には検出できない。復号結果がたまたまパディングとUTF-8として成立すると、空文字や意味のない文字列が返ることがある)\n *\n * @param {string} encryptedText\n * @param {string} key パスフレーズ\n * @returns {string}\n */\nexport function decryptAES(encryptedText: string, key: string): string {\n const ciphertext = CryptoJS.format.OpenSSL.parse(encryptedText).ciphertext;\n if (!ciphertext.sigBytes || ciphertext.sigBytes % 16 !== 0) {\n throw new Error('crypto-util.decryptAES: encryptedText is not a valid ciphertext');\n }\n const decrypted = CryptoJS.AES.decrypt(encryptedText, key);\n // 鍵が違うとパディングが壊れて長さが負になる\n if (decrypted.sigBytes < 0) {\n throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');\n }\n try {\n return decrypted.toString(CryptoJS.enc.Utf8);\n } catch {\n // パディングは成立したが復号結果がUTF-8として不正な場合も鍵違い\n throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');\n }\n}\n"],"names":["CHARSETS","randomBytes","size","toSha256","str","CryptoJS","generateRandomString","length","options","lower","upper","pool","includeChars","excludeChars","excluded","a","characters","maxAcceptableValue","result","byte","encryptAES","plainText","key","decryptAES","encryptedText","ciphertext","decrypted"],"mappings":"0CAEMA,EAAW,CACf,MAAO,uEACP,OAAQ,aACR,SAAU,6BACV,SAAU,uCACV,IAAK,kBACP,EAEMC,EAAeC,GAA6B,WAAW,OAAO,gBAAgB,IAAI,WAAWA,CAAI,CAAC,EAQjG,SAASC,EAASC,EAAqB,CAC5C,OAAOC,EAAS,OAAOD,CAAG,EAAE,SAAA,EAAW,YAAA,CACzC,CAgBO,SAASE,EAAqBC,EAAgBC,EAM1C,CACT,GAAI,CAAC,OAAO,UAAUD,CAAM,GAAKA,EAAS,EACxC,MAAM,IAAI,MAAM,yEAAyE,EAG3F,MAAME,EAAQT,EAASQ,GAAS,SAAW,OAAO,EAC5CE,EAAQD,EAAM,YAAA,EACpB,IAAIE,EAAOH,GAAS,OAAS,YACzBE,EACAF,GAAS,OAAS,YAChBC,EACAA,EAAQC,EACd,MAAME,EAAeJ,GAAS,aAC1BI,IAEFD,GAAQ,MAAM,QAAQC,CAAY,EAAIA,EAAa,KAAK,EAAE,EAAIA,GAEhE,MAAMC,EAAeL,GAAS,aAC9B,GAAIK,EAAc,CAEhB,MAAMC,EAAW,IAAI,IAAI,MAAM,QAAQD,CAAY,EAAIA,EAAe,MAAM,KAAKA,CAAY,CAAC,EAC9FF,EAAO,MAAM,KAAKA,CAAI,EAAE,OAAOI,GAAK,CAACD,EAAS,IAAIC,CAAC,CAAC,EAAE,KAAK,EAAE,CAC/D,CACA,MAAMC,EAAa,MAAM,KAAK,IAAI,IAAIL,CAAI,CAAC,EAC3C,GAAI,CAACK,EAAW,OACd,MAAM,IAAI,MAAM,kFAAkF,EAGpG,MAAMC,EAAqB,KAAK,MAAM,IAAMD,EAAW,MAAM,EAAIA,EAAW,OAAS,EACrF,IAAIE,EAAS,GACb,EAEE,KADAA,EAAS,GACFA,EAAO,OAASX,GACrB,UAAWY,KAAQlB,EAAYM,EAASW,EAAO,MAAM,EAC/CC,GAAQF,IACVC,GAAUF,EAAWG,EAAOH,EAAW,MAAM,SAI5CR,GAAS,sBAAwBU,EAAO,WAAW,GAAG,GAC/D,OAAOA,CACT,CAUO,SAASE,EAAWC,EAAmBC,EAAqB,CACjE,GAAI,CACF,OAAOjB,EAAS,IAAI,QAAQgB,EAAWC,CAAG,EAAE,SAAA,CAC9C,MAAQ,CAEN,MAAM,IAAI,MAAM,kEAAkE,CACpF,CACF,CAWO,SAASC,EAAWC,EAAuBF,EAAqB,CACrE,MAAMG,EAAapB,EAAS,OAAO,QAAQ,MAAMmB,CAAa,EAAE,WAChE,GAAI,CAACC,EAAW,UAAYA,EAAW,SAAW,KAAO,EACvD,MAAM,IAAI,MAAM,iEAAiE,EAEnF,MAAMC,EAAYrB,EAAS,IAAI,QAAQmB,EAAeF,CAAG,EAEzD,GAAII,EAAU,SAAW,EACvB,MAAM,IAAI,MAAM,iEAAiE,EAEnF,GAAI,CACF,OAAOA,EAAU,SAASrB,EAAS,IAAI,IAAI,CAC7C,MAAQ,CAEN,MAAM,IAAI,MAAM,iEAAiE,CACnF,CACF"}
|
package/lib/crypto-util.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("crypto-js");const e=require("./crypto-util-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("crypto-js");const e=require("./crypto-util-BcHurtbE.cjs");exports.decryptAES=e.decryptAES;exports.encryptAES=e.encryptAES;exports.generateRandomString=e.generateRandomString;exports.toSha256=e.toSha256;
|
|
2
2
|
//# sourceMappingURL=crypto-util.cjs.map
|
package/lib/crypto-util.d.cts
CHANGED
|
@@ -26,3 +26,22 @@ export declare function generateRandomString(length: number, options?: {
|
|
|
26
26
|
includeChars?: string | string[];
|
|
27
27
|
excludeChars?: string | string[];
|
|
28
28
|
}): string;
|
|
29
|
+
/**
|
|
30
|
+
* 文字列をAESで暗号化し、Base64の文字列で返す
|
|
31
|
+
* OpenSSL互換のパスフレーズ方式で、saltを毎回ランダムに生成するため同じ入力でも結果は毎回異なる
|
|
32
|
+
*
|
|
33
|
+
* @param {string} plainText
|
|
34
|
+
* @param {string} key パスフレーズ
|
|
35
|
+
* @returns {string}
|
|
36
|
+
*/
|
|
37
|
+
export declare function encryptAES(plainText: string, key: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* encryptAESで暗号化した文字列を復号する
|
|
40
|
+
* 暗号文の形式が不正な場合と、復号に失敗したことが分かる場合は例外を投げる
|
|
41
|
+
* (鍵違いは確実には検出できない。復号結果がたまたまパディングとUTF-8として成立すると、空文字や意味のない文字列が返ることがある)
|
|
42
|
+
*
|
|
43
|
+
* @param {string} encryptedText
|
|
44
|
+
* @param {string} key パスフレーズ
|
|
45
|
+
* @returns {string}
|
|
46
|
+
*/
|
|
47
|
+
export declare function decryptAES(encryptedText: string, key: string): string;
|
package/lib/crypto-util.d.ts
CHANGED
|
@@ -26,3 +26,22 @@ export declare function generateRandomString(length: number, options?: {
|
|
|
26
26
|
includeChars?: string | string[];
|
|
27
27
|
excludeChars?: string | string[];
|
|
28
28
|
}): string;
|
|
29
|
+
/**
|
|
30
|
+
* 文字列をAESで暗号化し、Base64の文字列で返す
|
|
31
|
+
* OpenSSL互換のパスフレーズ方式で、saltを毎回ランダムに生成するため同じ入力でも結果は毎回異なる
|
|
32
|
+
*
|
|
33
|
+
* @param {string} plainText
|
|
34
|
+
* @param {string} key パスフレーズ
|
|
35
|
+
* @returns {string}
|
|
36
|
+
*/
|
|
37
|
+
export declare function encryptAES(plainText: string, key: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* encryptAESで暗号化した文字列を復号する
|
|
40
|
+
* 暗号文の形式が不正な場合と、復号に失敗したことが分かる場合は例外を投げる
|
|
41
|
+
* (鍵違いは確実には検出できない。復号結果がたまたまパディングとUTF-8として成立すると、空文字や意味のない文字列が返ることがある)
|
|
42
|
+
*
|
|
43
|
+
* @param {string} encryptedText
|
|
44
|
+
* @param {string} key パスフレーズ
|
|
45
|
+
* @returns {string}
|
|
46
|
+
*/
|
|
47
|
+
export declare function decryptAES(encryptedText: string, key: string): string;
|
package/lib/crypto-util.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import "crypto-js";
|
|
2
|
-
import {
|
|
2
|
+
import { d as r, e as o, g as n, t as p } from "./crypto-util-B5K2CmE2.js";
|
|
3
3
|
export {
|
|
4
|
-
r as
|
|
5
|
-
|
|
4
|
+
r as decryptAES,
|
|
5
|
+
o as encryptAES,
|
|
6
|
+
n as generateRandomString,
|
|
7
|
+
p as toSha256
|
|
6
8
|
};
|
|
7
9
|
//# sourceMappingURL=crypto-util.js.map
|
package/lib/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./crypto-util-BcHurtbE.cjs"),i=require("./date-util-DG-ujlhH.cjs"),e=require("./decimal.cjs"),l=require("./file-util-D09BvDYY.cjs"),r=require("./html-util-ClGIpzW1.cjs"),U=require("./json-util-5mq7fsX_.cjs"),o=require("./number-util-BaSf1wWH.cjs"),c=require("./object-util-6uts5Xax.cjs"),n=require("./string-util-w2I5EYuY.cjs");exports.CryptoUtil=t.cryptoUtil;exports.DateUtil=i.dateUtil;exports.Decimal=e.Decimal;exports.FileUtil=l.fileUtil;exports.HtmlUtil=r.htmlUtil;exports.JsonUtil=U.jsonUtil;exports.NumberUtil=o.numberUtil;exports.ObjectUtil=c.objectUtil;exports.StringUtil=n.stringUtil;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/lib/index.js
CHANGED
package/package.json
CHANGED
package/src/crypto-util.ts
CHANGED
|
@@ -82,3 +82,47 @@ export function generateRandomString(length: number, options?: {
|
|
|
82
82
|
} while (options?.rejectStartsWithZero && result.startsWith('0'));
|
|
83
83
|
return result;
|
|
84
84
|
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* 文字列をAESで暗号化し、Base64の文字列で返す
|
|
88
|
+
* OpenSSL互換のパスフレーズ方式で、saltを毎回ランダムに生成するため同じ入力でも結果は毎回異なる
|
|
89
|
+
*
|
|
90
|
+
* @param {string} plainText
|
|
91
|
+
* @param {string} key パスフレーズ
|
|
92
|
+
* @returns {string}
|
|
93
|
+
*/
|
|
94
|
+
export function encryptAES(plainText: string, key: string): string {
|
|
95
|
+
try {
|
|
96
|
+
return CryptoJS.AES.encrypt(plainText, key).toString();
|
|
97
|
+
} catch {
|
|
98
|
+
// UTF-8に変換できない文字列(サロゲートペアの片割れを含む)はURIErrorになるので、原因が分かるメッセージに置き換える
|
|
99
|
+
throw new Error('crypto-util.encryptAES: plainText contains an unpaired surrogate');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* encryptAESで暗号化した文字列を復号する
|
|
105
|
+
* 暗号文の形式が不正な場合と、復号に失敗したことが分かる場合は例外を投げる
|
|
106
|
+
* (鍵違いは確実には検出できない。復号結果がたまたまパディングとUTF-8として成立すると、空文字や意味のない文字列が返ることがある)
|
|
107
|
+
*
|
|
108
|
+
* @param {string} encryptedText
|
|
109
|
+
* @param {string} key パスフレーズ
|
|
110
|
+
* @returns {string}
|
|
111
|
+
*/
|
|
112
|
+
export function decryptAES(encryptedText: string, key: string): string {
|
|
113
|
+
const ciphertext = CryptoJS.format.OpenSSL.parse(encryptedText).ciphertext;
|
|
114
|
+
if (!ciphertext.sigBytes || ciphertext.sigBytes % 16 !== 0) {
|
|
115
|
+
throw new Error('crypto-util.decryptAES: encryptedText is not a valid ciphertext');
|
|
116
|
+
}
|
|
117
|
+
const decrypted = CryptoJS.AES.decrypt(encryptedText, key);
|
|
118
|
+
// 鍵が違うとパディングが壊れて長さが負になる
|
|
119
|
+
if (decrypted.sigBytes < 0) {
|
|
120
|
+
throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');
|
|
121
|
+
}
|
|
122
|
+
try {
|
|
123
|
+
return decrypted.toString(CryptoJS.enc.Utf8);
|
|
124
|
+
} catch {
|
|
125
|
+
// パディングは成立したが復号結果がUTF-8として不正な場合も鍵違い
|
|
126
|
+
throw new Error('crypto-util.decryptAES: failed to decrypt. The key may be wrong');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import f from "crypto-js";
|
|
2
|
-
const g = {
|
|
3
|
-
ascii: "!\"#$%&'()*+,-./0123456789:;<=>?@[]^_`abcdefghijklmnopqrstuvwxyz{|}~",
|
|
4
|
-
number: "0123456789",
|
|
5
|
-
alphabet: "abcdefghijklmnopqrstuvwxyz",
|
|
6
|
-
alphanum: "0123456789abcdefghijklmnopqrstuvwxyz",
|
|
7
|
-
hex: "0123456789abcdef"
|
|
8
|
-
}, p = (e) => globalThis.crypto.getRandomValues(new Uint8Array(e));
|
|
9
|
-
function y(e) {
|
|
10
|
-
return f.SHA256(e).toString().toUpperCase();
|
|
11
|
-
}
|
|
12
|
-
function d(e, r) {
|
|
13
|
-
if (!Number.isInteger(e) || e < 0)
|
|
14
|
-
throw new Error("crypto-util.generateRandomString: length must be a non-negative integer");
|
|
15
|
-
const s = g[r?.charset ?? "ascii"], i = s.toUpperCase();
|
|
16
|
-
let n = r?.case === "upperCase" ? i : r?.case === "lowerCase" ? s : s + i;
|
|
17
|
-
const o = r?.includeChars;
|
|
18
|
-
o && (n += Array.isArray(o) ? o.join("") : o);
|
|
19
|
-
const c = r?.excludeChars;
|
|
20
|
-
if (c) {
|
|
21
|
-
const l = new Set(Array.isArray(c) ? c : Array.from(c));
|
|
22
|
-
n = Array.from(n).filter((u) => !l.has(u)).join("");
|
|
23
|
-
}
|
|
24
|
-
const a = Array.from(new Set(n));
|
|
25
|
-
if (!a.length)
|
|
26
|
-
throw new Error("crypto-util.generateRandomString: no characters left after applying excludeChars");
|
|
27
|
-
const h = Math.floor(256 / a.length) * a.length - 1;
|
|
28
|
-
let t = "";
|
|
29
|
-
do
|
|
30
|
-
for (t = ""; t.length < e; )
|
|
31
|
-
for (const l of p(e - t.length))
|
|
32
|
-
l <= h && (t += a[l % a.length]);
|
|
33
|
-
while (r?.rejectStartsWithZero && t.startsWith("0"));
|
|
34
|
-
return t;
|
|
35
|
-
}
|
|
36
|
-
const b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
37
|
-
__proto__: null,
|
|
38
|
-
generateRandomString: d,
|
|
39
|
-
toSha256: y
|
|
40
|
-
}, Symbol.toStringTag, { value: "Module" }));
|
|
41
|
-
export {
|
|
42
|
-
b as c,
|
|
43
|
-
d as g,
|
|
44
|
-
y as t
|
|
45
|
-
};
|
|
46
|
-
//# sourceMappingURL=crypto-util-DFJqfmuw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-util-DFJqfmuw.js","sources":["../src/crypto-util.ts"],"sourcesContent":["import CryptoJS from 'crypto-js';\n\nconst CHARSETS = {\n ascii: `!\"#$%&'()*+,-./0123456789:;<=>?@[]^_\\`abcdefghijklmnopqrstuvwxyz{|}~`,\n number: '0123456789',\n alphabet: 'abcdefghijklmnopqrstuvwxyz',\n alphanum: '0123456789abcdefghijklmnopqrstuvwxyz',\n hex: '0123456789abcdef'\n} as const;\n\nconst randomBytes = (size: number): Uint8Array => globalThis.crypto.getRandomValues(new Uint8Array(size));\n\n/**\n * 文字列をSHA-256でハッシュ化し、大文字の16進数文字列で返す\n *\n * @param {string} str\n * @returns {string}\n */\nexport function toSha256(str: string): string {\n return CryptoJS.SHA256(str).toString().toUpperCase();\n}\n\n/**\n * ランダムな文字列を生成する\n * 大文字と小文字は別の文字として扱う\n * caseを指定しない場合は生成対象の文字セットに大文字と小文字の両方を含めるため、'a'と'A'の出現率は同じ確率になる\n *\n * @param {number} length 生成する文字列の桁数\n * @param {*} [options]\n * ├ charset 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex' 未指定の場合はASCIIの記号・数字・英字(スペースとバックスラッシュを除く)\n * ├ case 'upperCase' | 'lowerCase' 英字を大文字のみ・小文字のみにする。未指定の場合は大文字小文字混在\n * ├ rejectStartsWithZero trueを指定した場合、0始まりの文字列を生成しない\n * ├ includeChars 文字セットに追加する文字。大文字小文字を区別する\n * ├ excludeChars 文字セットから除外する文字。大文字小文字は区別する\n * @returns {string}\n */\nexport function generateRandomString(length: number, options?: {\n charset?: 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex';\n case?: 'upperCase' | 'lowerCase';\n rejectStartsWithZero?: boolean;\n includeChars?: string | string[];\n excludeChars?: string | string[];\n}): string {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error('crypto-util.generateRandomString: length must be a non-negative integer');\n }\n\n const lower = CHARSETS[options?.charset ?? 'ascii'];\n const upper = lower.toUpperCase();\n let pool = options?.case === 'upperCase'\n ? upper\n : options?.case === 'lowerCase'\n ? lower\n : lower + upper;\n const includeChars = options?.includeChars;\n if (includeChars) {\n // 追加文字の指定がある場合\n pool += Array.isArray(includeChars) ? includeChars.join('') : includeChars;\n }\n const excludeChars = options?.excludeChars;\n if (excludeChars) {\n // 除外文字の指定がある場合\n const excluded = new Set(Array.isArray(excludeChars) ? excludeChars : Array.from(excludeChars));\n pool = Array.from(pool).filter(a => !excluded.has(a)).join('');\n }\n const characters = Array.from(new Set(pool));\n if (!characters.length) {\n throw new Error('crypto-util.generateRandomString: no characters left after applying excludeChars');\n }\n // 256を文字種の数で割り切れる範囲のバイトだけを使い、文字ごとの出現率を揃える\n const maxAcceptableValue = Math.floor(256 / characters.length) * characters.length - 1;\n let result = '';\n do {\n result = '';\n while (result.length < length) {\n for (const byte of randomBytes(length - result.length)) {\n if (byte <= maxAcceptableValue) {\n result += characters[byte % characters.length];\n }\n }\n }\n } while (options?.rejectStartsWithZero && result.startsWith('0'));\n return result;\n}\n"],"names":["CHARSETS","randomBytes","size","toSha256","str","CryptoJS","generateRandomString","length","options","lower","upper","pool","includeChars","excludeChars","excluded","a","characters","maxAcceptableValue","result","byte"],"mappings":";AAEA,MAAMA,IAAW;AAAA,EACf,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,KAAK;AACP,GAEMC,IAAc,CAACC,MAA6B,WAAW,OAAO,gBAAgB,IAAI,WAAWA,CAAI,CAAC;AAQjG,SAASC,EAASC,GAAqB;AAC5C,SAAOC,EAAS,OAAOD,CAAG,EAAE,SAAA,EAAW,YAAA;AACzC;AAgBO,SAASE,EAAqBC,GAAgBC,GAM1C;AACT,MAAI,CAAC,OAAO,UAAUD,CAAM,KAAKA,IAAS;AACxC,UAAM,IAAI,MAAM,yEAAyE;AAG3F,QAAME,IAAQT,EAASQ,GAAS,WAAW,OAAO,GAC5CE,IAAQD,EAAM,YAAA;AACpB,MAAIE,IAAOH,GAAS,SAAS,cACzBE,IACAF,GAAS,SAAS,cAChBC,IACAA,IAAQC;AACd,QAAME,IAAeJ,GAAS;AAC9B,EAAII,MAEFD,KAAQ,MAAM,QAAQC,CAAY,IAAIA,EAAa,KAAK,EAAE,IAAIA;AAEhE,QAAMC,IAAeL,GAAS;AAC9B,MAAIK,GAAc;AAEhB,UAAMC,IAAW,IAAI,IAAI,MAAM,QAAQD,CAAY,IAAIA,IAAe,MAAM,KAAKA,CAAY,CAAC;AAC9F,IAAAF,IAAO,MAAM,KAAKA,CAAI,EAAE,OAAO,CAAAI,MAAK,CAACD,EAAS,IAAIC,CAAC,CAAC,EAAE,KAAK,EAAE;AAAA,EAC/D;AACA,QAAMC,IAAa,MAAM,KAAK,IAAI,IAAIL,CAAI,CAAC;AAC3C,MAAI,CAACK,EAAW;AACd,UAAM,IAAI,MAAM,kFAAkF;AAGpG,QAAMC,IAAqB,KAAK,MAAM,MAAMD,EAAW,MAAM,IAAIA,EAAW,SAAS;AACrF,MAAIE,IAAS;AACb;AAEE,SADAA,IAAS,IACFA,EAAO,SAASX;AACrB,iBAAWY,KAAQlB,EAAYM,IAASW,EAAO,MAAM;AACnD,QAAIC,KAAQF,MACVC,KAAUF,EAAWG,IAAOH,EAAW,MAAM;AAAA,SAI5CR,GAAS,wBAAwBU,EAAO,WAAW,GAAG;AAC/D,SAAOA;AACT;;;;;;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";const y=require("crypto-js"),d={ascii:"!\"#$%&'()*+,-./0123456789:;<=>?@[]^_`abcdefghijklmnopqrstuvwxyz{|}~",number:"0123456789",alphabet:"abcdefghijklmnopqrstuvwxyz",alphanum:"0123456789abcdefghijklmnopqrstuvwxyz",hex:"0123456789abcdef"},p=e=>globalThis.crypto.getRandomValues(new Uint8Array(e));function h(e){return y.SHA256(e).toString().toUpperCase()}function u(e,r){if(!Number.isInteger(e)||e<0)throw new Error("crypto-util.generateRandomString: length must be a non-negative integer");const s=d[r?.charset??"ascii"],i=s.toUpperCase();let n=r?.case==="upperCase"?i:r?.case==="lowerCase"?s:s+i;const o=r?.includeChars;o&&(n+=Array.isArray(o)?o.join(""):o);const c=r?.excludeChars;if(c){const l=new Set(Array.isArray(c)?c:Array.from(c));n=Array.from(n).filter(f=>!l.has(f)).join("")}const a=Array.from(new Set(n));if(!a.length)throw new Error("crypto-util.generateRandomString: no characters left after applying excludeChars");const g=Math.floor(256/a.length)*a.length-1;let t="";do for(t="";t.length<e;)for(const l of p(e-t.length))l<=g&&(t+=a[l%a.length]);while(r?.rejectStartsWithZero&&t.startsWith("0"));return t}const m=Object.freeze(Object.defineProperty({__proto__:null,generateRandomString:u,toSha256:h},Symbol.toStringTag,{value:"Module"}));exports.cryptoUtil=m;exports.generateRandomString=u;exports.toSha256=h;
|
|
2
|
-
//# sourceMappingURL=crypto-util-DeZSGetI.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crypto-util-DeZSGetI.cjs","sources":["../src/crypto-util.ts"],"sourcesContent":["import CryptoJS from 'crypto-js';\n\nconst CHARSETS = {\n ascii: `!\"#$%&'()*+,-./0123456789:;<=>?@[]^_\\`abcdefghijklmnopqrstuvwxyz{|}~`,\n number: '0123456789',\n alphabet: 'abcdefghijklmnopqrstuvwxyz',\n alphanum: '0123456789abcdefghijklmnopqrstuvwxyz',\n hex: '0123456789abcdef'\n} as const;\n\nconst randomBytes = (size: number): Uint8Array => globalThis.crypto.getRandomValues(new Uint8Array(size));\n\n/**\n * 文字列をSHA-256でハッシュ化し、大文字の16進数文字列で返す\n *\n * @param {string} str\n * @returns {string}\n */\nexport function toSha256(str: string): string {\n return CryptoJS.SHA256(str).toString().toUpperCase();\n}\n\n/**\n * ランダムな文字列を生成する\n * 大文字と小文字は別の文字として扱う\n * caseを指定しない場合は生成対象の文字セットに大文字と小文字の両方を含めるため、'a'と'A'の出現率は同じ確率になる\n *\n * @param {number} length 生成する文字列の桁数\n * @param {*} [options]\n * ├ charset 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex' 未指定の場合はASCIIの記号・数字・英字(スペースとバックスラッシュを除く)\n * ├ case 'upperCase' | 'lowerCase' 英字を大文字のみ・小文字のみにする。未指定の場合は大文字小文字混在\n * ├ rejectStartsWithZero trueを指定した場合、0始まりの文字列を生成しない\n * ├ includeChars 文字セットに追加する文字。大文字小文字を区別する\n * ├ excludeChars 文字セットから除外する文字。大文字小文字は区別する\n * @returns {string}\n */\nexport function generateRandomString(length: number, options?: {\n charset?: 'ascii' | 'number' | 'alphabet' | 'alphanum' | 'hex';\n case?: 'upperCase' | 'lowerCase';\n rejectStartsWithZero?: boolean;\n includeChars?: string | string[];\n excludeChars?: string | string[];\n}): string {\n if (!Number.isInteger(length) || length < 0) {\n throw new Error('crypto-util.generateRandomString: length must be a non-negative integer');\n }\n\n const lower = CHARSETS[options?.charset ?? 'ascii'];\n const upper = lower.toUpperCase();\n let pool = options?.case === 'upperCase'\n ? upper\n : options?.case === 'lowerCase'\n ? lower\n : lower + upper;\n const includeChars = options?.includeChars;\n if (includeChars) {\n // 追加文字の指定がある場合\n pool += Array.isArray(includeChars) ? includeChars.join('') : includeChars;\n }\n const excludeChars = options?.excludeChars;\n if (excludeChars) {\n // 除外文字の指定がある場合\n const excluded = new Set(Array.isArray(excludeChars) ? excludeChars : Array.from(excludeChars));\n pool = Array.from(pool).filter(a => !excluded.has(a)).join('');\n }\n const characters = Array.from(new Set(pool));\n if (!characters.length) {\n throw new Error('crypto-util.generateRandomString: no characters left after applying excludeChars');\n }\n // 256を文字種の数で割り切れる範囲のバイトだけを使い、文字ごとの出現率を揃える\n const maxAcceptableValue = Math.floor(256 / characters.length) * characters.length - 1;\n let result = '';\n do {\n result = '';\n while (result.length < length) {\n for (const byte of randomBytes(length - result.length)) {\n if (byte <= maxAcceptableValue) {\n result += characters[byte % characters.length];\n }\n }\n }\n } while (options?.rejectStartsWithZero && result.startsWith('0'));\n return result;\n}\n"],"names":["CHARSETS","randomBytes","size","toSha256","str","CryptoJS","generateRandomString","length","options","lower","upper","pool","includeChars","excludeChars","excluded","a","characters","maxAcceptableValue","result","byte"],"mappings":"0CAEMA,EAAW,CACf,MAAO,uEACP,OAAQ,aACR,SAAU,6BACV,SAAU,uCACV,IAAK,kBACP,EAEMC,EAAeC,GAA6B,WAAW,OAAO,gBAAgB,IAAI,WAAWA,CAAI,CAAC,EAQjG,SAASC,EAASC,EAAqB,CAC5C,OAAOC,EAAS,OAAOD,CAAG,EAAE,SAAA,EAAW,YAAA,CACzC,CAgBO,SAASE,EAAqBC,EAAgBC,EAM1C,CACT,GAAI,CAAC,OAAO,UAAUD,CAAM,GAAKA,EAAS,EACxC,MAAM,IAAI,MAAM,yEAAyE,EAG3F,MAAME,EAAQT,EAASQ,GAAS,SAAW,OAAO,EAC5CE,EAAQD,EAAM,YAAA,EACpB,IAAIE,EAAOH,GAAS,OAAS,YACzBE,EACAF,GAAS,OAAS,YAChBC,EACAA,EAAQC,EACd,MAAME,EAAeJ,GAAS,aAC1BI,IAEFD,GAAQ,MAAM,QAAQC,CAAY,EAAIA,EAAa,KAAK,EAAE,EAAIA,GAEhE,MAAMC,EAAeL,GAAS,aAC9B,GAAIK,EAAc,CAEhB,MAAMC,EAAW,IAAI,IAAI,MAAM,QAAQD,CAAY,EAAIA,EAAe,MAAM,KAAKA,CAAY,CAAC,EAC9FF,EAAO,MAAM,KAAKA,CAAI,EAAE,OAAOI,GAAK,CAACD,EAAS,IAAIC,CAAC,CAAC,EAAE,KAAK,EAAE,CAC/D,CACA,MAAMC,EAAa,MAAM,KAAK,IAAI,IAAIL,CAAI,CAAC,EAC3C,GAAI,CAACK,EAAW,OACd,MAAM,IAAI,MAAM,kFAAkF,EAGpG,MAAMC,EAAqB,KAAK,MAAM,IAAMD,EAAW,MAAM,EAAIA,EAAW,OAAS,EACrF,IAAIE,EAAS,GACb,EAEE,KADAA,EAAS,GACFA,EAAO,OAASX,GACrB,UAAWY,KAAQlB,EAAYM,EAASW,EAAO,MAAM,EAC/CC,GAAQF,IACVC,GAAUF,EAAWG,EAAOH,EAAW,MAAM,SAI5CR,GAAS,sBAAwBU,EAAO,WAAW,GAAG,GAC/D,OAAOA,CACT"}
|