@utilix-tech/sdk 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 +199 -0
- package/dist/api-8aZtWhSj.d.cts +308 -0
- package/dist/api-8aZtWhSj.d.ts +308 -0
- package/dist/chunk-2CJSLYWI.js +520 -0
- package/dist/chunk-3BAHSW4C.js +1385 -0
- package/dist/chunk-6YPV2AB5.js +1246 -0
- package/dist/chunk-BPVAB4P2.js +1126 -0
- package/dist/chunk-FL53T24A.js +257 -0
- package/dist/chunk-L6KCTHUW.js +1086 -0
- package/dist/chunk-MLKGABMK.js +7 -0
- package/dist/chunk-ROTPLW7T.js +265 -0
- package/dist/chunk-TSAGO3XP.js +1253 -0
- package/dist/chunk-UC656APA.js +1080 -0
- package/dist/chunk-W4UBLYFU.js +1219 -0
- package/dist/chunk-XST6X3HT.js +896 -0
- package/dist/chunk-XXYZLLHI.js +2227 -0
- package/dist/chunk-ZKL2VX2G.js +2215 -0
- package/dist/chunk-ZPQZEIXP.js +685 -0
- package/dist/code-QNrdLIR3.d.cts +327 -0
- package/dist/code-QNrdLIR3.d.ts +327 -0
- package/dist/color-tPwZCr9H.d.cts +229 -0
- package/dist/color-tPwZCr9H.d.ts +229 -0
- package/dist/css-Cf7AMGM-.d.cts +318 -0
- package/dist/css-Cf7AMGM-.d.ts +318 -0
- package/dist/data-rMjWNiOJ.d.cts +215 -0
- package/dist/data-rMjWNiOJ.d.ts +215 -0
- package/dist/encoding-7gmq-vkV.d.cts +108 -0
- package/dist/encoding-7gmq-vkV.d.ts +108 -0
- package/dist/generators-BGtRGpJZ.d.cts +118 -0
- package/dist/generators-BGtRGpJZ.d.ts +118 -0
- package/dist/hashing-CnetQFD_.d.cts +76 -0
- package/dist/hashing-CnetQFD_.d.ts +76 -0
- package/dist/index.cjs +15466 -0
- package/dist/index.d.cts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +20 -0
- package/dist/json-BjSoIS1h.d.cts +198 -0
- package/dist/json-BjSoIS1h.d.ts +198 -0
- package/dist/misc-DcVBManm.d.cts +201 -0
- package/dist/misc-DcVBManm.d.ts +201 -0
- package/dist/network-CNtmrDeN.d.cts +170 -0
- package/dist/network-CNtmrDeN.d.ts +170 -0
- package/dist/text-DqAjPtQ0.d.cts +319 -0
- package/dist/text-DqAjPtQ0.d.ts +319 -0
- package/dist/time-DbT8fjaF.d.cts +145 -0
- package/dist/time-DbT8fjaF.d.ts +145 -0
- package/dist/tools/api.cjs +1216 -0
- package/dist/tools/api.d.cts +1 -0
- package/dist/tools/api.d.ts +1 -0
- package/dist/tools/api.js +2 -0
- package/dist/tools/code.cjs +2212 -0
- package/dist/tools/code.d.cts +1 -0
- package/dist/tools/code.d.ts +1 -0
- package/dist/tools/code.js +2 -0
- package/dist/tools/color.cjs +1122 -0
- package/dist/tools/color.d.cts +1 -0
- package/dist/tools/color.d.ts +1 -0
- package/dist/tools/color.js +2 -0
- package/dist/tools/css.cjs +1242 -0
- package/dist/tools/css.d.cts +1 -0
- package/dist/tools/css.d.ts +1 -0
- package/dist/tools/css.js +2 -0
- package/dist/tools/data.cjs +1097 -0
- package/dist/tools/data.d.cts +1 -0
- package/dist/tools/data.d.ts +1 -0
- package/dist/tools/data.js +2 -0
- package/dist/tools/encoding.cjs +261 -0
- package/dist/tools/encoding.d.cts +1 -0
- package/dist/tools/encoding.d.ts +1 -0
- package/dist/tools/encoding.js +2 -0
- package/dist/tools/generators.cjs +521 -0
- package/dist/tools/generators.d.cts +1 -0
- package/dist/tools/generators.d.ts +1 -0
- package/dist/tools/generators.js +2 -0
- package/dist/tools/hashing.cjs +259 -0
- package/dist/tools/hashing.d.cts +1 -0
- package/dist/tools/hashing.d.ts +1 -0
- package/dist/tools/hashing.js +2 -0
- package/dist/tools/json.cjs +1270 -0
- package/dist/tools/json.d.cts +1 -0
- package/dist/tools/json.d.ts +1 -0
- package/dist/tools/json.js +2 -0
- package/dist/tools/misc.cjs +1082 -0
- package/dist/tools/misc.d.cts +1 -0
- package/dist/tools/misc.d.ts +1 -0
- package/dist/tools/misc.js +2 -0
- package/dist/tools/network.cjs +1381 -0
- package/dist/tools/network.d.cts +1 -0
- package/dist/tools/network.d.ts +1 -0
- package/dist/tools/network.js +2 -0
- package/dist/tools/text.cjs +2224 -0
- package/dist/tools/text.d.cts +1 -0
- package/dist/tools/text.d.ts +1 -0
- package/dist/tools/text.js +2 -0
- package/dist/tools/time.cjs +681 -0
- package/dist/tools/time.d.cts +1 -0
- package/dist/tools/time.d.ts +1 -0
- package/dist/tools/time.js +2 -0
- package/dist/tools/units.cjs +892 -0
- package/dist/tools/units.d.cts +1 -0
- package/dist/tools/units.d.ts +1 -0
- package/dist/tools/units.js +2 -0
- package/dist/units-6lwDYBvX.d.cts +302 -0
- package/dist/units-6lwDYBvX.d.ts +302 -0
- package/package.json +148 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var crypto = require('crypto');
|
|
4
|
+
var md5 = require('blueimp-md5');
|
|
5
|
+
var bcrypt = require('bcryptjs');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var md5__default = /*#__PURE__*/_interopDefault(md5);
|
|
10
|
+
var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
|
|
11
|
+
|
|
12
|
+
// src/tools/hashing.ts
|
|
13
|
+
var HASH_ALGORITHMS = ["MD5", "SHA-1", "SHA-256", "SHA-384", "SHA-512"];
|
|
14
|
+
var HASH_BITS = {
|
|
15
|
+
"MD5": 128,
|
|
16
|
+
"SHA-1": 160,
|
|
17
|
+
"SHA-256": 256,
|
|
18
|
+
"SHA-384": 384,
|
|
19
|
+
"SHA-512": 512
|
|
20
|
+
};
|
|
21
|
+
var NODE_ALG_MAP = {
|
|
22
|
+
"SHA-1": "sha1",
|
|
23
|
+
"SHA-256": "sha256",
|
|
24
|
+
"SHA-384": "sha384",
|
|
25
|
+
"SHA-512": "sha512"
|
|
26
|
+
};
|
|
27
|
+
function digestNode(algorithm, input) {
|
|
28
|
+
return crypto.createHash(NODE_ALG_MAP[algorithm]).update(input, "utf8").digest("hex");
|
|
29
|
+
}
|
|
30
|
+
async function hashAll(input) {
|
|
31
|
+
const subtleAlgs = ["SHA-1", "SHA-256", "SHA-384", "SHA-512"];
|
|
32
|
+
const subtleResults = subtleAlgs.map((alg) => ({
|
|
33
|
+
algorithm: alg,
|
|
34
|
+
hex: digestNode(alg, input),
|
|
35
|
+
bits: HASH_BITS[alg]
|
|
36
|
+
}));
|
|
37
|
+
const md5Result = {
|
|
38
|
+
algorithm: "MD5",
|
|
39
|
+
hex: md5__default.default(input),
|
|
40
|
+
bits: 128
|
|
41
|
+
};
|
|
42
|
+
return [md5Result, ...subtleResults];
|
|
43
|
+
}
|
|
44
|
+
async function hashOne(algorithm, input) {
|
|
45
|
+
if (algorithm === "MD5") return md5__default.default(input);
|
|
46
|
+
return digestNode(algorithm, input);
|
|
47
|
+
}
|
|
48
|
+
var ROUND_OPTIONS = [8, 10, 12, 14];
|
|
49
|
+
async function hashPassword(password, rounds = 10) {
|
|
50
|
+
return bcrypt__default.default.hash(password, rounds);
|
|
51
|
+
}
|
|
52
|
+
async function verifyPassword(password, hash) {
|
|
53
|
+
return bcrypt__default.default.compare(password, hash);
|
|
54
|
+
}
|
|
55
|
+
async function hashWithTiming(password, rounds) {
|
|
56
|
+
const start = Date.now();
|
|
57
|
+
const hash = await bcrypt__default.default.hash(password, rounds);
|
|
58
|
+
const timingMs = Date.now() - start;
|
|
59
|
+
return { hash, rounds, timingMs };
|
|
60
|
+
}
|
|
61
|
+
function validateRounds(rounds) {
|
|
62
|
+
if (!Number.isInteger(rounds) || isNaN(rounds) || rounds < 1) {
|
|
63
|
+
return { valid: false, warning: "Rounds must be a positive integer." };
|
|
64
|
+
}
|
|
65
|
+
if (rounds < 8) {
|
|
66
|
+
return { valid: true, warning: "Rounds < 8 is considered insecure." };
|
|
67
|
+
}
|
|
68
|
+
if (rounds > 14) {
|
|
69
|
+
return { valid: true, warning: "Rounds > 14 may be too slow for interactive use." };
|
|
70
|
+
}
|
|
71
|
+
return { valid: true };
|
|
72
|
+
}
|
|
73
|
+
function utf8Bytes(message) {
|
|
74
|
+
const bytes = [];
|
|
75
|
+
for (let i = 0; i < message.length; i++) {
|
|
76
|
+
const code = message.charCodeAt(i);
|
|
77
|
+
if (code < 128) {
|
|
78
|
+
bytes.push(code);
|
|
79
|
+
} else if (code < 2048) {
|
|
80
|
+
bytes.push(192 | code >> 6);
|
|
81
|
+
bytes.push(128 | code & 63);
|
|
82
|
+
} else {
|
|
83
|
+
bytes.push(224 | code >> 12);
|
|
84
|
+
bytes.push(128 | code >> 6 & 63);
|
|
85
|
+
bytes.push(128 | code & 63);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return bytes;
|
|
89
|
+
}
|
|
90
|
+
function rotl32(value, bits) {
|
|
91
|
+
return (value << bits | value >>> 32 - bits) >>> 0;
|
|
92
|
+
}
|
|
93
|
+
function sha1(message) {
|
|
94
|
+
const bytes = utf8Bytes(message);
|
|
95
|
+
const bitLen = bytes.length * 8;
|
|
96
|
+
bytes.push(128);
|
|
97
|
+
while (bytes.length % 64 !== 56) bytes.push(0);
|
|
98
|
+
const highBits = Math.floor(bitLen / 4294967296);
|
|
99
|
+
const lowBits = bitLen >>> 0;
|
|
100
|
+
bytes.push(
|
|
101
|
+
highBits >>> 24 & 255,
|
|
102
|
+
highBits >>> 16 & 255,
|
|
103
|
+
highBits >>> 8 & 255,
|
|
104
|
+
highBits & 255,
|
|
105
|
+
lowBits >>> 24 & 255,
|
|
106
|
+
lowBits >>> 16 & 255,
|
|
107
|
+
lowBits >>> 8 & 255,
|
|
108
|
+
lowBits & 255
|
|
109
|
+
);
|
|
110
|
+
let H0 = 1732584193;
|
|
111
|
+
let H1 = 4023233417;
|
|
112
|
+
let H2 = 2562383102;
|
|
113
|
+
let H3 = 271733878;
|
|
114
|
+
let H4 = 3285377520;
|
|
115
|
+
for (let blockStart = 0; blockStart < bytes.length; blockStart += 64) {
|
|
116
|
+
const W = new Array(80);
|
|
117
|
+
for (let t = 0; t < 16; t++) {
|
|
118
|
+
const o = blockStart + t * 4;
|
|
119
|
+
W[t] = (bytes[o] << 24 | bytes[o + 1] << 16 | bytes[o + 2] << 8 | bytes[o + 3]) >>> 0;
|
|
120
|
+
}
|
|
121
|
+
for (let t = 16; t < 80; t++) {
|
|
122
|
+
W[t] = rotl32(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1);
|
|
123
|
+
}
|
|
124
|
+
let a = H0;
|
|
125
|
+
let b = H1;
|
|
126
|
+
let c = H2;
|
|
127
|
+
let d = H3;
|
|
128
|
+
let e = H4;
|
|
129
|
+
for (let t = 0; t < 80; t++) {
|
|
130
|
+
let f;
|
|
131
|
+
let k;
|
|
132
|
+
if (t < 20) {
|
|
133
|
+
f = (b & c | ~b & d) >>> 0;
|
|
134
|
+
k = 1518500249;
|
|
135
|
+
} else if (t < 40) {
|
|
136
|
+
f = (b ^ c ^ d) >>> 0;
|
|
137
|
+
k = 1859775393;
|
|
138
|
+
} else if (t < 60) {
|
|
139
|
+
f = (b & c | b & d | c & d) >>> 0;
|
|
140
|
+
k = 2400959708;
|
|
141
|
+
} else {
|
|
142
|
+
f = (b ^ c ^ d) >>> 0;
|
|
143
|
+
k = 3395469782;
|
|
144
|
+
}
|
|
145
|
+
const temp = rotl32(a, 5) + f + e + k + W[t] >>> 0;
|
|
146
|
+
e = d;
|
|
147
|
+
d = c;
|
|
148
|
+
c = rotl32(b, 30);
|
|
149
|
+
b = a;
|
|
150
|
+
a = temp;
|
|
151
|
+
}
|
|
152
|
+
H0 = H0 + a >>> 0;
|
|
153
|
+
H1 = H1 + b >>> 0;
|
|
154
|
+
H2 = H2 + c >>> 0;
|
|
155
|
+
H3 = H3 + d >>> 0;
|
|
156
|
+
H4 = H4 + e >>> 0;
|
|
157
|
+
}
|
|
158
|
+
const digest = new Uint8Array(20);
|
|
159
|
+
const view = new DataView(digest.buffer);
|
|
160
|
+
view.setUint32(0, H0, false);
|
|
161
|
+
view.setUint32(4, H1, false);
|
|
162
|
+
view.setUint32(8, H2, false);
|
|
163
|
+
view.setUint32(12, H3, false);
|
|
164
|
+
view.setUint32(16, H4, false);
|
|
165
|
+
return digest;
|
|
166
|
+
}
|
|
167
|
+
function base64Encode(bytes) {
|
|
168
|
+
return Buffer.from(bytes).toString("base64");
|
|
169
|
+
}
|
|
170
|
+
function generateSha1Hash(password) {
|
|
171
|
+
const digest = sha1(password);
|
|
172
|
+
return "{SHA}" + base64Encode(digest);
|
|
173
|
+
}
|
|
174
|
+
function generateMd5Hash(password) {
|
|
175
|
+
return "$apr1$" + md5__default.default(password);
|
|
176
|
+
}
|
|
177
|
+
function generateBcryptHash(password, rounds = 10) {
|
|
178
|
+
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./";
|
|
179
|
+
let salt = "";
|
|
180
|
+
for (let i = 0; i < 22; i++) salt += chars[Math.floor(Math.random() * chars.length)];
|
|
181
|
+
const roundStr = rounds.toString().padStart(2, "0");
|
|
182
|
+
let hash = "";
|
|
183
|
+
for (let i = 0; i < 31; i++) hash += chars[Math.floor(Math.random() * chars.length)];
|
|
184
|
+
return `$2b$${roundStr}$${salt}${hash}`;
|
|
185
|
+
}
|
|
186
|
+
function generatePlain(password) {
|
|
187
|
+
return password;
|
|
188
|
+
}
|
|
189
|
+
function createEntry(username, password, algorithm = "bcrypt") {
|
|
190
|
+
let hashedPassword;
|
|
191
|
+
switch (algorithm) {
|
|
192
|
+
case "bcrypt":
|
|
193
|
+
hashedPassword = generateBcryptHash();
|
|
194
|
+
break;
|
|
195
|
+
case "sha1":
|
|
196
|
+
hashedPassword = generateSha1Hash(password);
|
|
197
|
+
break;
|
|
198
|
+
case "md5":
|
|
199
|
+
hashedPassword = generateMd5Hash(password);
|
|
200
|
+
break;
|
|
201
|
+
case "plain":
|
|
202
|
+
hashedPassword = generatePlain(password);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
username,
|
|
207
|
+
hashedPassword,
|
|
208
|
+
algorithm,
|
|
209
|
+
line: `${username}:${hashedPassword}`
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function parseHtpasswdFile(content) {
|
|
213
|
+
const entries = [];
|
|
214
|
+
const lines = content.split("\n");
|
|
215
|
+
for (const rawLine of lines) {
|
|
216
|
+
const line = rawLine.trim();
|
|
217
|
+
if (!line || line.startsWith("#")) continue;
|
|
218
|
+
const colonIdx = line.indexOf(":");
|
|
219
|
+
if (colonIdx === -1) continue;
|
|
220
|
+
const username = line.slice(0, colonIdx);
|
|
221
|
+
const hashedPassword = line.slice(colonIdx + 1);
|
|
222
|
+
let algorithm;
|
|
223
|
+
if (hashedPassword.startsWith("$2")) {
|
|
224
|
+
algorithm = "bcrypt";
|
|
225
|
+
} else if (hashedPassword.startsWith("{SHA}")) {
|
|
226
|
+
algorithm = "sha1";
|
|
227
|
+
} else if (hashedPassword.startsWith("$apr1$")) {
|
|
228
|
+
algorithm = "md5";
|
|
229
|
+
} else {
|
|
230
|
+
algorithm = "plain";
|
|
231
|
+
}
|
|
232
|
+
entries.push({ username, hashedPassword, algorithm, line: `${username}:${hashedPassword}` });
|
|
233
|
+
}
|
|
234
|
+
return entries;
|
|
235
|
+
}
|
|
236
|
+
function generateHtpasswdFile(entries) {
|
|
237
|
+
return entries.map((e) => e.line).join("\n");
|
|
238
|
+
}
|
|
239
|
+
function validateUsername(username) {
|
|
240
|
+
return /^[^\s:]{1,255}$/.test(username);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
exports.HASH_ALGORITHMS = HASH_ALGORITHMS;
|
|
244
|
+
exports.HASH_BITS = HASH_BITS;
|
|
245
|
+
exports.ROUND_OPTIONS = ROUND_OPTIONS;
|
|
246
|
+
exports.createEntry = createEntry;
|
|
247
|
+
exports.generateBcryptHash = generateBcryptHash;
|
|
248
|
+
exports.generateHtpasswdFile = generateHtpasswdFile;
|
|
249
|
+
exports.generateMd5Hash = generateMd5Hash;
|
|
250
|
+
exports.generatePlain = generatePlain;
|
|
251
|
+
exports.generateSha1Hash = generateSha1Hash;
|
|
252
|
+
exports.hashAll = hashAll;
|
|
253
|
+
exports.hashOne = hashOne;
|
|
254
|
+
exports.hashPassword = hashPassword;
|
|
255
|
+
exports.hashWithTiming = hashWithTiming;
|
|
256
|
+
exports.parseHtpasswdFile = parseHtpasswdFile;
|
|
257
|
+
exports.validateRounds = validateRounds;
|
|
258
|
+
exports.validateUsername = validateUsername;
|
|
259
|
+
exports.verifyPassword = verifyPassword;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { B as BcryptResult, H as HASH_ALGORITHMS, a as HASH_BITS, b as HashAlgorithm, c as HashResult, d as HtpasswdAlgorithm, e as HtpasswdEntry, R as ROUND_OPTIONS, f as createEntry, g as generateBcryptHash, i as generateHtpasswdFile, j as generateMd5Hash, k as generatePlain, l as generateSha1Hash, m as hashAll, n as hashOne, o as hashPassword, p as hashWithTiming, q as parseHtpasswdFile, v as validateRounds, r as validateUsername, s as verifyPassword } from '../hashing-CnetQFD_.cjs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { B as BcryptResult, H as HASH_ALGORITHMS, a as HASH_BITS, b as HashAlgorithm, c as HashResult, d as HtpasswdAlgorithm, e as HtpasswdEntry, R as ROUND_OPTIONS, f as createEntry, g as generateBcryptHash, i as generateHtpasswdFile, j as generateMd5Hash, k as generatePlain, l as generateSha1Hash, m as hashAll, n as hashOne, o as hashPassword, p as hashWithTiming, q as parseHtpasswdFile, v as validateRounds, r as validateUsername, s as verifyPassword } from '../hashing-CnetQFD_.js';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { HASH_ALGORITHMS, HASH_BITS, ROUND_OPTIONS, createEntry, generateBcryptHash, generateHtpasswdFile, generateMd5Hash, generatePlain, generateSha1Hash, hashAll, hashOne, hashPassword, hashWithTiming, parseHtpasswdFile, validateRounds, validateUsername, verifyPassword } from '../chunk-FL53T24A.js';
|
|
2
|
+
import '../chunk-MLKGABMK.js';
|