ayiin 2.0.50 → 2.0.52
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/dist/methods/index.d.ts +2 -1
- package/dist/methods/index.js +2 -0
- package/dist/methods/token.d.ts +10 -0
- package/dist/methods/token.js +91 -0
- package/package.json +1 -1
package/dist/methods/index.d.ts
CHANGED
|
@@ -8,9 +8,10 @@ import Objects from "./objects";
|
|
|
8
8
|
import Random from "./random";
|
|
9
9
|
import ResponseApi from "./response";
|
|
10
10
|
import Strings from "./strings";
|
|
11
|
+
import Token from "./token";
|
|
11
12
|
import Validation from "./validation";
|
|
12
13
|
declare class Methods {
|
|
13
14
|
}
|
|
14
|
-
interface Methods extends Async, Crypt, Currency, Dates, Files, Limiter, Objects, Random, ResponseApi, Strings, Validation {
|
|
15
|
+
interface Methods extends Async, Crypt, Currency, Dates, Files, Limiter, Objects, Random, ResponseApi, Strings, Token, Validation {
|
|
15
16
|
}
|
|
16
17
|
export default Methods;
|
package/dist/methods/index.js
CHANGED
|
@@ -13,6 +13,7 @@ const objects_1 = __importDefault(require("./objects"));
|
|
|
13
13
|
const random_1 = __importDefault(require("./random"));
|
|
14
14
|
const response_1 = __importDefault(require("./response"));
|
|
15
15
|
const strings_1 = __importDefault(require("./strings"));
|
|
16
|
+
const token_1 = __importDefault(require("./token"));
|
|
16
17
|
const validation_1 = __importDefault(require("./validation"));
|
|
17
18
|
class Methods {
|
|
18
19
|
}
|
|
@@ -27,5 +28,6 @@ Object.assign(Methods.prototype, new objects_1.default());
|
|
|
27
28
|
Object.assign(Methods.prototype, new random_1.default());
|
|
28
29
|
Object.assign(Methods.prototype, new response_1.default());
|
|
29
30
|
Object.assign(Methods.prototype, new strings_1.default());
|
|
31
|
+
Object.assign(Methods.prototype, new token_1.default());
|
|
30
32
|
Object.assign(Methods.prototype, new validation_1.default());
|
|
31
33
|
exports.default = Methods;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
declare class Token {
|
|
2
|
+
private chars;
|
|
3
|
+
private base62Encode;
|
|
4
|
+
private base62Decode;
|
|
5
|
+
private generateKeystream;
|
|
6
|
+
private baseCryptToken;
|
|
7
|
+
generateToken: (text: string, key: string) => string;
|
|
8
|
+
verifyToken: (token: string, key: string) => string | null;
|
|
9
|
+
}
|
|
10
|
+
export default Token;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
7
|
+
class Token {
|
|
8
|
+
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
9
|
+
// Base62 encode: buffer → base62 string
|
|
10
|
+
base62Encode(buffer) {
|
|
11
|
+
let digits = [0];
|
|
12
|
+
for (const byte of buffer) {
|
|
13
|
+
let carry = byte;
|
|
14
|
+
for (let j = 0; j < digits.length; j++) {
|
|
15
|
+
const val = digits[j] * 256 + carry;
|
|
16
|
+
digits[j] = val % 62;
|
|
17
|
+
carry = Math.floor(val / 62);
|
|
18
|
+
}
|
|
19
|
+
while (carry > 0) {
|
|
20
|
+
digits.push(carry % 62);
|
|
21
|
+
carry = Math.floor(carry / 62);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return (digits
|
|
25
|
+
.reverse()
|
|
26
|
+
.map((d) => this.chars[d])
|
|
27
|
+
.join("") || "0");
|
|
28
|
+
}
|
|
29
|
+
// Base62 decode: string → buffer
|
|
30
|
+
base62Decode(str) {
|
|
31
|
+
let digits = [0];
|
|
32
|
+
for (const c of str) {
|
|
33
|
+
let carry = this.chars.indexOf(c);
|
|
34
|
+
for (let j = 0; j < digits.length; j++) {
|
|
35
|
+
const val = digits[j] * 62 + carry;
|
|
36
|
+
digits[j] = val & 0xff;
|
|
37
|
+
carry = val >> 8;
|
|
38
|
+
}
|
|
39
|
+
while (carry > 0) {
|
|
40
|
+
digits.push(carry & 0xff);
|
|
41
|
+
carry >>= 8;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return Buffer.from(digits.reverse());
|
|
45
|
+
}
|
|
46
|
+
generateKeystream(key, length) {
|
|
47
|
+
const result = Buffer.alloc(length);
|
|
48
|
+
let pos = 0;
|
|
49
|
+
let counter = 0;
|
|
50
|
+
while (pos < length) {
|
|
51
|
+
const hash = crypto_1.default.createHash("sha256");
|
|
52
|
+
hash.update(key);
|
|
53
|
+
hash.update(Buffer.from(counter.toString()));
|
|
54
|
+
const digest = hash.digest();
|
|
55
|
+
const copy = Math.min(length - pos, digest.length);
|
|
56
|
+
digest.copy(result, pos, 0, copy);
|
|
57
|
+
pos += copy;
|
|
58
|
+
counter++;
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
baseCryptToken(input, key) {
|
|
63
|
+
const keystream = this.generateKeystream(key, input.length);
|
|
64
|
+
const output = Buffer.alloc(input.length);
|
|
65
|
+
for (let i = 0; i < input.length; i++) {
|
|
66
|
+
output[i] = input[i] ^ keystream[i];
|
|
67
|
+
}
|
|
68
|
+
return output;
|
|
69
|
+
}
|
|
70
|
+
generateToken = (text, key) => {
|
|
71
|
+
const input = Buffer.from(text, "utf8");
|
|
72
|
+
const encrypted = this.baseCryptToken(input, key);
|
|
73
|
+
const cipher = this.base62Encode(encrypted);
|
|
74
|
+
const hmac = crypto_1.default.createHmac("sha256", key).update(cipher).digest();
|
|
75
|
+
const signature = this.base62Encode(hmac);
|
|
76
|
+
return `${cipher}.${signature}`;
|
|
77
|
+
};
|
|
78
|
+
verifyToken = (token, key) => {
|
|
79
|
+
const [cipher, signature] = token.split(".");
|
|
80
|
+
if (!cipher || !signature)
|
|
81
|
+
return null;
|
|
82
|
+
const hmac = crypto_1.default.createHmac("sha256", key).update(cipher).digest();
|
|
83
|
+
const expected = this.base62Encode(hmac);
|
|
84
|
+
if (expected !== signature)
|
|
85
|
+
return null;
|
|
86
|
+
const input = this.base62Decode(cipher);
|
|
87
|
+
const decrypted = this.baseCryptToken(input, key);
|
|
88
|
+
return decrypted.toString("utf8");
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
exports.default = Token;
|