@nr1e/commons 0.0.0-snapshot-20251228031344 → 0.0.0-snapshot-20251228033901
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/encryption/crypto-generator.d.mts +3 -0
- package/dist/encryption/crypto-generator.d.mts.map +1 -0
- package/dist/encryption/crypto-generator.mjs +8 -0
- package/dist/encryption/crypto-generator.mjs.map +1 -0
- package/dist/encryption/crypto-generator.test.d.mts +2 -0
- package/dist/encryption/crypto-generator.test.d.mts.map +1 -0
- package/dist/encryption/crypto-generator.test.mjs +13 -0
- package/dist/encryption/crypto-generator.test.mjs.map +1 -0
- package/dist/encryption/encryption.d.mts +11 -0
- package/dist/encryption/encryption.d.mts.map +1 -0
- package/dist/encryption/encryption.mjs +47 -0
- package/dist/encryption/encryption.mjs.map +1 -0
- package/dist/encryption/encryption.test.d.mts +2 -0
- package/dist/encryption/encryption.test.d.mts.map +1 -0
- package/dist/encryption/encryption.test.mjs +19 -0
- package/dist/encryption/encryption.test.mjs.map +1 -0
- package/dist/encryption/index.d.mts +4 -0
- package/dist/encryption/index.d.mts.map +1 -0
- package/dist/encryption/index.mjs +4 -0
- package/dist/encryption/index.mjs.map +1 -0
- package/dist/encryption/new-format.test.d.mts +2 -0
- package/dist/encryption/new-format.test.d.mts.map +1 -0
- package/dist/encryption/new-format.test.mjs +127 -0
- package/dist/encryption/new-format.test.mjs.map +1 -0
- package/dist/encryption/rsa-encryption.browser.d.mts +36 -0
- package/dist/encryption/rsa-encryption.browser.d.mts.map +1 -0
- package/dist/encryption/rsa-encryption.browser.mjs +140 -0
- package/dist/encryption/rsa-encryption.browser.mjs.map +1 -0
- package/dist/encryption/rsa-encryption.d.mts +89 -0
- package/dist/encryption/rsa-encryption.d.mts.map +1 -0
- package/dist/encryption/rsa-encryption.mjs +254 -0
- package/dist/encryption/rsa-encryption.mjs.map +1 -0
- package/dist/encryption/rsa-encryption.test.d.mts +2 -0
- package/dist/encryption/rsa-encryption.test.d.mts.map +1 -0
- package/dist/encryption/rsa-encryption.test.mjs +324 -0
- package/dist/encryption/rsa-encryption.test.mjs.map +1 -0
- package/package.json +5 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { generateKeyPairSync as cryptoGenerateKeyPairSync, generateKeyPair as cryptoGenerateKeyPair, publicEncrypt, privateDecrypt, constants, createPublicKey, createPrivateKey, } from 'crypto';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
const generateKeyPairAsync = promisify(cryptoGenerateKeyPair);
|
|
4
|
+
/**
|
|
5
|
+
* Convert raw base64 key (without PEM headers) to PEM format
|
|
6
|
+
* @param base64Key - Raw base64 encoded key (no headers)
|
|
7
|
+
* @param type - Type of key (PUBLIC or PRIVATE)
|
|
8
|
+
* @returns PEM formatted key
|
|
9
|
+
*/
|
|
10
|
+
function rawBase64ToPem(base64Key, type = 'PUBLIC') {
|
|
11
|
+
const pemHeader = `-----BEGIN ${type} KEY-----`;
|
|
12
|
+
const pemFooter = `-----END ${type} KEY-----`;
|
|
13
|
+
// Format as PEM with line breaks every 64 characters
|
|
14
|
+
const formatted = base64Key.match(/.{1,64}/g)?.join('\n') || base64Key;
|
|
15
|
+
return `${pemHeader}\n${formatted}\n${pemFooter}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Normalize a key to PEM format
|
|
19
|
+
* Handles three formats:
|
|
20
|
+
* 1. Already in PEM format (with -----BEGIN headers)
|
|
21
|
+
* 2. Base64 encoded PEM (decode first, then use as PEM)
|
|
22
|
+
* 3. Raw base64 key material (needs PEM headers added)
|
|
23
|
+
* @param key - Key in any supported format
|
|
24
|
+
* @param type - Type of key (PUBLIC or PRIVATE)
|
|
25
|
+
* @returns PEM formatted key
|
|
26
|
+
*/
|
|
27
|
+
function normalizeKeyToPem(key, type) {
|
|
28
|
+
// Already in PEM format
|
|
29
|
+
if (key.includes('-----BEGIN')) {
|
|
30
|
+
return key;
|
|
31
|
+
}
|
|
32
|
+
// Try to decode as base64 to see if it contains PEM
|
|
33
|
+
try {
|
|
34
|
+
const decoded = Buffer.from(key, 'base64').toString('utf8');
|
|
35
|
+
if (decoded.includes('-----BEGIN')) {
|
|
36
|
+
// It was base64 encoded PEM
|
|
37
|
+
return decoded;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// Not valid base64 or not PEM inside, continue
|
|
42
|
+
}
|
|
43
|
+
// Raw base64 key material - add PEM headers
|
|
44
|
+
return rawBase64ToPem(key, type);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate an RSA key pair synchronously
|
|
48
|
+
* @param options - Options for key generation
|
|
49
|
+
* @returns RSA key pair in the specified format
|
|
50
|
+
*/
|
|
51
|
+
export function generateKeyPairSync(options = {}) {
|
|
52
|
+
const { keySize = 2048, format = 'pem' } = options;
|
|
53
|
+
const { publicKey, privateKey } = cryptoGenerateKeyPairSync('rsa', {
|
|
54
|
+
modulusLength: keySize,
|
|
55
|
+
publicKeyEncoding: {
|
|
56
|
+
type: 'spki',
|
|
57
|
+
format: 'pem',
|
|
58
|
+
},
|
|
59
|
+
privateKeyEncoding: {
|
|
60
|
+
type: 'pkcs8',
|
|
61
|
+
format: 'pem',
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (format === 'base64') {
|
|
65
|
+
return {
|
|
66
|
+
publicKey: Buffer.from(publicKey).toString('base64'),
|
|
67
|
+
privateKey: Buffer.from(privateKey).toString('base64'),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { publicKey, privateKey };
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Generate an RSA key pair asynchronously
|
|
74
|
+
* @param options - Options for key generation
|
|
75
|
+
* @returns Promise resolving to RSA key pair in the specified format
|
|
76
|
+
*/
|
|
77
|
+
export async function generateKeyPair(options = {}) {
|
|
78
|
+
const { keySize = 2048, format = 'pem' } = options;
|
|
79
|
+
const { publicKey, privateKey } = await generateKeyPairAsync('rsa', {
|
|
80
|
+
modulusLength: keySize,
|
|
81
|
+
publicKeyEncoding: {
|
|
82
|
+
type: 'spki',
|
|
83
|
+
format: 'pem',
|
|
84
|
+
},
|
|
85
|
+
privateKeyEncoding: {
|
|
86
|
+
type: 'pkcs8',
|
|
87
|
+
format: 'pem',
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
if (format === 'base64') {
|
|
91
|
+
return {
|
|
92
|
+
publicKey: Buffer.from(publicKey).toString('base64'),
|
|
93
|
+
privateKey: Buffer.from(privateKey).toString('base64'),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return { publicKey, privateKey };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Encrypt data using an RSA public key
|
|
100
|
+
* Supports three key formats:
|
|
101
|
+
* 1. PEM format (with -----BEGIN PUBLIC KEY-----)
|
|
102
|
+
* 2. Base64 encoded PEM
|
|
103
|
+
* 3. Raw base64 key material (without PEM headers)
|
|
104
|
+
* @param data - Data to encrypt (string or object)
|
|
105
|
+
* @param publicKey - RSA public key in any supported format
|
|
106
|
+
* @param options - Encryption options
|
|
107
|
+
* @returns Encrypted data as base64 string
|
|
108
|
+
*/
|
|
109
|
+
export function encryptWithPublicKey(data, publicKey, options = {}) {
|
|
110
|
+
const { encoding = 'base64' } = options;
|
|
111
|
+
// Convert data to string if it's an object
|
|
112
|
+
const dataString = typeof data === 'object' ? JSON.stringify(data) : data;
|
|
113
|
+
const dataBuffer = Buffer.from(dataString, 'utf8');
|
|
114
|
+
// Normalize key to PEM format
|
|
115
|
+
const keyToUse = normalizeKeyToPem(publicKey, 'PUBLIC');
|
|
116
|
+
// Encrypt using OAEP padding with SHA-256
|
|
117
|
+
const encrypted = publicEncrypt({
|
|
118
|
+
key: keyToUse,
|
|
119
|
+
padding: constants.RSA_PKCS1_OAEP_PADDING,
|
|
120
|
+
oaepHash: 'sha256',
|
|
121
|
+
}, dataBuffer);
|
|
122
|
+
return encrypted.toString(encoding);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Decrypt data using an RSA private key
|
|
126
|
+
* Supports three key formats:
|
|
127
|
+
* 1. PEM format (with -----BEGIN PRIVATE KEY-----)
|
|
128
|
+
* 2. Base64 encoded PEM
|
|
129
|
+
* 3. Raw base64 key material (without PEM headers)
|
|
130
|
+
* @param encryptedData - Encrypted data as base64 string
|
|
131
|
+
* @param privateKey - RSA private key in any supported format
|
|
132
|
+
* @param options - Decryption options
|
|
133
|
+
* @returns Decrypted data as string or parsed object
|
|
134
|
+
*/
|
|
135
|
+
export function decryptWithPrivateKey(encryptedData, privateKey, options = {}) {
|
|
136
|
+
const { encoding = 'base64' } = options;
|
|
137
|
+
// Convert encrypted data from base64 to buffer
|
|
138
|
+
const encryptedBuffer = Buffer.from(encryptedData, encoding);
|
|
139
|
+
// Normalize key to PEM format
|
|
140
|
+
const keyToUse = normalizeKeyToPem(privateKey, 'PRIVATE');
|
|
141
|
+
// Decrypt using OAEP padding with SHA-256
|
|
142
|
+
const decrypted = privateDecrypt({
|
|
143
|
+
key: keyToUse,
|
|
144
|
+
padding: constants.RSA_PKCS1_OAEP_PADDING,
|
|
145
|
+
oaepHash: 'sha256',
|
|
146
|
+
}, encryptedBuffer);
|
|
147
|
+
const decryptedString = decrypted.toString('utf8');
|
|
148
|
+
// Try to parse as JSON, return string if it fails
|
|
149
|
+
try {
|
|
150
|
+
return JSON.parse(decryptedString);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return decryptedString;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Export RSA keys to different formats
|
|
158
|
+
* @param keyPair - RSA key pair
|
|
159
|
+
* @param format - Target format
|
|
160
|
+
* @returns Key pair in the specified format
|
|
161
|
+
*/
|
|
162
|
+
export function exportKeys(keyPair, format) {
|
|
163
|
+
if (format === 'base64') {
|
|
164
|
+
// Convert PEM to base64 if needed
|
|
165
|
+
if (keyPair.publicKey.includes('-----BEGIN')) {
|
|
166
|
+
return {
|
|
167
|
+
publicKey: Buffer.from(keyPair.publicKey).toString('base64'),
|
|
168
|
+
privateKey: Buffer.from(keyPair.privateKey).toString('base64'),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return keyPair;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
// Convert to PEM if needed
|
|
175
|
+
return {
|
|
176
|
+
publicKey: normalizeKeyToPem(keyPair.publicKey, 'PUBLIC'),
|
|
177
|
+
privateKey: normalizeKeyToPem(keyPair.privateKey, 'PRIVATE'),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Import RSA keys from strings to KeyObject instances
|
|
183
|
+
* @param publicKey - Public key string (PEM, base64 encoded PEM, or raw base64)
|
|
184
|
+
* @param privateKey - Private key string (PEM, base64 encoded PEM, or raw base64)
|
|
185
|
+
* @returns KeyObject instances for the keys
|
|
186
|
+
*/
|
|
187
|
+
export function importKeys(publicKey, privateKey) {
|
|
188
|
+
const pubKeyPem = normalizeKeyToPem(publicKey, 'PUBLIC');
|
|
189
|
+
const privKeyPem = normalizeKeyToPem(privateKey, 'PRIVATE');
|
|
190
|
+
return {
|
|
191
|
+
publicKey: createPublicKey(pubKeyPem),
|
|
192
|
+
privateKey: createPrivateKey(privKeyPem),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Validate if a string is a valid RSA public key
|
|
197
|
+
* @param key - Key string to validate
|
|
198
|
+
* @returns True if valid public key
|
|
199
|
+
*/
|
|
200
|
+
export function isValidPublicKey(key) {
|
|
201
|
+
try {
|
|
202
|
+
const keyPem = normalizeKeyToPem(key, 'PUBLIC');
|
|
203
|
+
// Check if it's actually a private key
|
|
204
|
+
if (keyPem.includes('PRIVATE KEY')) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
createPublicKey(keyPem);
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Validate if a string is a valid RSA private key
|
|
216
|
+
* @param key - Key string to validate
|
|
217
|
+
* @returns True if valid private key
|
|
218
|
+
*/
|
|
219
|
+
export function isValidPrivateKey(key) {
|
|
220
|
+
try {
|
|
221
|
+
const keyPem = normalizeKeyToPem(key, 'PRIVATE');
|
|
222
|
+
createPrivateKey(keyPem);
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get the key size of an RSA key
|
|
231
|
+
* @param key - RSA key (public or private) in any supported format
|
|
232
|
+
* @returns Key size in bits
|
|
233
|
+
*/
|
|
234
|
+
export function getKeySize(key) {
|
|
235
|
+
let keyPem;
|
|
236
|
+
// Determine if it's a public or private key
|
|
237
|
+
if (key.includes('PRIVATE') ||
|
|
238
|
+
(!key.includes('BEGIN') && key.length > 1000)) {
|
|
239
|
+
keyPem = normalizeKeyToPem(key, 'PRIVATE');
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
keyPem = normalizeKeyToPem(key, 'PUBLIC');
|
|
243
|
+
}
|
|
244
|
+
let keyObject;
|
|
245
|
+
if (keyPem.includes('PUBLIC KEY')) {
|
|
246
|
+
keyObject = createPublicKey(keyPem);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
keyObject = createPrivateKey(keyPem);
|
|
250
|
+
}
|
|
251
|
+
const keyDetails = keyObject.asymmetricKeyDetails;
|
|
252
|
+
return keyDetails?.modulusLength || 0;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=rsa-encryption.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-encryption.mjs","sourceRoot":"","sources":["../../src/encryption/rsa-encryption.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-encryption.test.d.mts","sourceRoot":"","sources":["../../src/encryption/rsa-encryption.test.mts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { generateKeyPair, generateKeyPairSync, encryptWithPublicKey, decryptWithPrivateKey, exportKeys, importKeys, isValidPublicKey, isValidPrivateKey, getKeySize, } from './rsa-encryption.mjs';
|
|
3
|
+
describe('RSA Encryption', () => {
|
|
4
|
+
let testKeyPair;
|
|
5
|
+
beforeAll(() => {
|
|
6
|
+
// Generate a test key pair for use in multiple tests
|
|
7
|
+
testKeyPair = generateKeyPairSync();
|
|
8
|
+
});
|
|
9
|
+
describe('generateKeyPairSync', () => {
|
|
10
|
+
it('should generate a valid RSA key pair with default options', () => {
|
|
11
|
+
const keyPair = generateKeyPairSync();
|
|
12
|
+
expect(keyPair).toBeDefined();
|
|
13
|
+
expect(keyPair.publicKey).toBeDefined();
|
|
14
|
+
expect(keyPair.privateKey).toBeDefined();
|
|
15
|
+
expect(keyPair.publicKey).toContain('-----BEGIN PUBLIC KEY-----');
|
|
16
|
+
expect(keyPair.privateKey).toContain('-----BEGIN PRIVATE KEY-----');
|
|
17
|
+
});
|
|
18
|
+
it('should generate a 2048-bit key pair by default', () => {
|
|
19
|
+
const keyPair = generateKeyPairSync();
|
|
20
|
+
const keySize = getKeySize(keyPair.publicKey);
|
|
21
|
+
expect(keySize).toBe(2048);
|
|
22
|
+
});
|
|
23
|
+
it('should generate a 3072-bit key pair when specified', () => {
|
|
24
|
+
const keyPair = generateKeyPairSync({ keySize: 3072 });
|
|
25
|
+
const keySize = getKeySize(keyPair.publicKey);
|
|
26
|
+
expect(keySize).toBe(3072);
|
|
27
|
+
});
|
|
28
|
+
it('should generate a 4096-bit key pair when specified', () => {
|
|
29
|
+
const keyPair = generateKeyPairSync({ keySize: 4096 });
|
|
30
|
+
const keySize = getKeySize(keyPair.publicKey);
|
|
31
|
+
expect(keySize).toBe(4096);
|
|
32
|
+
});
|
|
33
|
+
it('should generate keys in base64 format when specified', () => {
|
|
34
|
+
const keyPair = generateKeyPairSync({ format: 'base64' });
|
|
35
|
+
expect(keyPair.publicKey).toBeDefined();
|
|
36
|
+
expect(keyPair.privateKey).toBeDefined();
|
|
37
|
+
expect(keyPair.publicKey).not.toContain('-----BEGIN');
|
|
38
|
+
expect(keyPair.privateKey).not.toContain('-----BEGIN');
|
|
39
|
+
// Should be valid base64
|
|
40
|
+
expect(() => Buffer.from(keyPair.publicKey, 'base64')).not.toThrow();
|
|
41
|
+
expect(() => Buffer.from(keyPair.privateKey, 'base64')).not.toThrow();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('generateKeyPair (async)', () => {
|
|
45
|
+
it('should generate a valid RSA key pair asynchronously', async () => {
|
|
46
|
+
const keyPair = await generateKeyPair();
|
|
47
|
+
expect(keyPair).toBeDefined();
|
|
48
|
+
expect(keyPair.publicKey).toBeDefined();
|
|
49
|
+
expect(keyPair.privateKey).toBeDefined();
|
|
50
|
+
expect(keyPair.publicKey).toContain('-----BEGIN PUBLIC KEY-----');
|
|
51
|
+
expect(keyPair.privateKey).toContain('-----BEGIN PRIVATE KEY-----');
|
|
52
|
+
});
|
|
53
|
+
it('should generate keys in base64 format when specified', async () => {
|
|
54
|
+
const keyPair = await generateKeyPair({ format: 'base64' });
|
|
55
|
+
expect(keyPair.publicKey).not.toContain('-----BEGIN');
|
|
56
|
+
expect(keyPair.privateKey).not.toContain('-----BEGIN');
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('encryptWithPublicKey and decryptWithPrivateKey', () => {
|
|
60
|
+
it('should encrypt and decrypt a string successfully', () => {
|
|
61
|
+
const originalData = 'Hello, World!';
|
|
62
|
+
const encrypted = encryptWithPublicKey(originalData, testKeyPair.publicKey);
|
|
63
|
+
expect(encrypted).toBeDefined();
|
|
64
|
+
expect(encrypted).not.toBe(originalData);
|
|
65
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
66
|
+
expect(decrypted).toBe(originalData);
|
|
67
|
+
});
|
|
68
|
+
it('should encrypt and decrypt an object successfully', () => {
|
|
69
|
+
const originalData = {
|
|
70
|
+
name: 'John Doe',
|
|
71
|
+
age: 30,
|
|
72
|
+
email: 'john@example.com',
|
|
73
|
+
nested: {
|
|
74
|
+
key: 'value',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
const encrypted = encryptWithPublicKey(originalData, testKeyPair.publicKey);
|
|
78
|
+
expect(encrypted).toBeDefined();
|
|
79
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
80
|
+
expect(decrypted).toEqual(originalData);
|
|
81
|
+
});
|
|
82
|
+
it('should handle base64 encoded keys', () => {
|
|
83
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
84
|
+
const originalData = 'Test with base64 keys';
|
|
85
|
+
const encrypted = encryptWithPublicKey(originalData, base64KeyPair.publicKey);
|
|
86
|
+
const decrypted = decryptWithPrivateKey(encrypted, base64KeyPair.privateKey);
|
|
87
|
+
expect(decrypted).toBe(originalData);
|
|
88
|
+
});
|
|
89
|
+
it('should handle raw base64 keys without PEM headers', () => {
|
|
90
|
+
// Generate a key pair and extract the raw base64 (simulate the new format)
|
|
91
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
92
|
+
// Extract raw base64 from PEM by removing headers and newlines
|
|
93
|
+
const rawPublicKey = pemKeyPair.publicKey
|
|
94
|
+
.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
95
|
+
.replace('-----END PUBLIC KEY-----', '')
|
|
96
|
+
.replace(/\s/g, '');
|
|
97
|
+
const rawPrivateKey = pemKeyPair.privateKey
|
|
98
|
+
.replace('-----BEGIN PRIVATE KEY-----', '')
|
|
99
|
+
.replace('-----END PRIVATE KEY-----', '')
|
|
100
|
+
.replace(/\s/g, '');
|
|
101
|
+
const originalData = 'Test with raw base64 keys';
|
|
102
|
+
// Should work with raw base64 format
|
|
103
|
+
const encrypted = encryptWithPublicKey(originalData, rawPublicKey);
|
|
104
|
+
const decrypted = decryptWithPrivateKey(encrypted, rawPrivateKey);
|
|
105
|
+
expect(decrypted).toBe(originalData);
|
|
106
|
+
});
|
|
107
|
+
it('should handle the new environment format (raw base64 without PEM headers)', () => {
|
|
108
|
+
// Test with the actual format from the dev environment
|
|
109
|
+
const rawPublicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1M6wSqLb6VDlo1E1zQet/F8ubAhvdcLLe8CKd66w154qZ4b0mYNSmw7DXR+wNz4k8VkP9Cxi/SxxHqj+PLYugHWftN/OFsSUASWRr0jiywQ5pbEngMU56Wy90iZmu9ngimdwinmuOjIuDFVyQNGb8E9k1YcTUMqhbgV7OPjn2n6YuJje5A/bLXzrF9qwXxDlLz3Idc8oRDjL42/erifhV7jPk6yFGD7TxHYAtaFP9Q6sQzNvPX3z4xJkTsRCDoFXGu5jCWxWKtXZTT7Jgpxo5PWjR05aNSQu87UBDNM1a3cJygFGdi4k9lhVfK9NRLwX3IrGJx0EYpS70e6SYwmxawIDAQAB';
|
|
110
|
+
const rawPrivateKey = 'MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDUzrBKotvpUOWjUTXNB638Xy5sCG91wst7wIp3rrDXnipnhvSZg1KbDsNdH7A3PiTxWQ/0LGL9LHEeqP48ti6AdZ+0384WxJQBJZGvSOLLBDmlsSeAxTnpbL3SJma72eCKZ3CKea46Mi4MVXJA0ZvwT2TVhxNQyqFuBXs4+Ofafpi4mN7kD9stfOsX2rBfEOUvPch1zyhEOMvjb96uJ+FXuM+TrIUYPtPEdgC1oU/1DqxDM289ffPjEmROxEIOgVca7mMJbFYq1dlNPsmCnGjk9aNHTlo1JC7ztQEM0zVrdwnKAUZ2LiT2WFV8r01EvBfcisYnHQRilLvR7pJjCbFrAgMBAAECggEAFNVnTOdEwEK7OJHqwnfOALcQxGLPBqhbY3ImHDFt/q3tWNVNfPnuTF/VoHhJuB7NXxNpDG6MAl0ndej1etwbEVhymjKO6ou0MaiL6q0oBtgTDLWbOHAWi1OqAbjgteNOqD4YNnZTKD9hYrO6y725ln0vUfg3W+F6jFrdBWbYy/sLFC6LiPjBo5UrtYwsFXS63JiOs+wuZGRWDlaOpA26ptGQFh4hIoQ494Lwz5G92w0zKTPh1qGLa+vpB9NlUWpJdZPVbN3GL7q3/N2qwt26VwgR2UB/wdM7lA7m4OltqcYykz8bJa+dm9U/qwME3i7GGhqtSml6ugWE7XsBK47QgQKBgQD2RNK7EnhTKs08j5O8+yLR9ZTFdKsmx6kdXddQ9v//y5IxlYeoQDZ+o6pyWdLixfWg6O4ipMlG+5WOG5Gvxqf/avpUc25aCF157dLLaagDUCoJbsmnw13vDl/xE4HfADJSk8vlhU2MX6z+uYR7t286HbJ9Z0XZnDAo55qoPV0SlwKBgQDdN2FIi9Wr6D1vioQsJLINbTwIQIv5Khko/RzS4MwApdaKiL+0mUFUqPBAX4jxdihv9wl8shtgZZleB+283JzmDouO4I7H4pf8HhQ6Fg/1q66EucgCJvY7xkVN6BGN1RblcDx3GAdoQF7o8k1ME9uynkFTZjGdjEnNh2C8jwL2TQKBgEuy8hfA4K2n3Xh9JcuUYqqpU3aymx2LiAdX3iSsGBrXx3NoZE+qlVWuF2mZBMLiWNOCZhjOEHS6Rsls3gZrCR7xEku9Q7F3Gsys9vvB2XxTOui1XlUsL4aZI5KmDWiv1cgeWDGQHTtF+ZY/DmM9CnqRwFjd0tHGOeOI9bg7TI23AoGBANk9dGzQ3fGm7QYnqirLkos69ZRJBuyWmgS1pGO23L/aHDkJl/Gb+xtPmDgvWYV+erGRkSCCq/3baGR+Nsqcf/ww1n5mKfFDpeuyAj0Uw3GHuqee5jqu1mrXB+I8/1ggpg6FTOvLjiKj7FCo+p22dq8PWKm1Fw5X4XZT9vzVGJyVAoGAfWcHjfYtBZF7j7V1AorL6mDaD7fpDEl/JQxwYpFwryAtSlPFrylXvvxb0R9h2cGdknNSAZhUkl+D+ceIH9iz3mwHT7uncNqwyi7OomOJSeWbsisw2II8vmGdSnEQDKKwZAfJ6nF8BGq6+HuRzD/Y0sujE31CSkRJbMRRgUVmPfU=';
|
|
111
|
+
const originalData = 'Test with new environment format';
|
|
112
|
+
// Should work with the new raw base64 format from environment
|
|
113
|
+
const encrypted = encryptWithPublicKey(originalData, rawPublicKey);
|
|
114
|
+
const decrypted = decryptWithPrivateKey(encrypted, rawPrivateKey);
|
|
115
|
+
expect(decrypted).toBe(originalData);
|
|
116
|
+
});
|
|
117
|
+
it('should handle maximum allowed string size', () => {
|
|
118
|
+
// For 2048-bit key with OAEP padding, max is approximately 190 bytes
|
|
119
|
+
const maxString = 'x'.repeat(190);
|
|
120
|
+
const encrypted = encryptWithPublicKey(maxString, testKeyPair.publicKey);
|
|
121
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
122
|
+
expect(decrypted).toBe(maxString);
|
|
123
|
+
});
|
|
124
|
+
it('should throw error when data is too large for key size', () => {
|
|
125
|
+
// Exceeding the maximum size for 2048-bit key
|
|
126
|
+
const tooLargeString = 'x'.repeat(250);
|
|
127
|
+
expect(() => {
|
|
128
|
+
encryptWithPublicKey(tooLargeString, testKeyPair.publicKey);
|
|
129
|
+
}).toThrow('data too large for key size');
|
|
130
|
+
});
|
|
131
|
+
it('should throw error when decrypting with wrong key', () => {
|
|
132
|
+
const wrongKeyPair = generateKeyPairSync();
|
|
133
|
+
const originalData = 'Secret message';
|
|
134
|
+
const encrypted = encryptWithPublicKey(originalData, testKeyPair.publicKey);
|
|
135
|
+
expect(() => {
|
|
136
|
+
decryptWithPrivateKey(encrypted, wrongKeyPair.privateKey);
|
|
137
|
+
}).toThrow();
|
|
138
|
+
}, 30000);
|
|
139
|
+
it('should throw error when encrypting with invalid key', () => {
|
|
140
|
+
const invalidKey = 'not-a-valid-key';
|
|
141
|
+
expect(() => {
|
|
142
|
+
encryptWithPublicKey('test', invalidKey);
|
|
143
|
+
}).toThrow();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('exportKeys', () => {
|
|
147
|
+
it('should export PEM keys to base64 format', () => {
|
|
148
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
149
|
+
const base64KeyPair = exportKeys(pemKeyPair, 'base64');
|
|
150
|
+
expect(base64KeyPair.publicKey).not.toContain('-----BEGIN');
|
|
151
|
+
expect(base64KeyPair.privateKey).not.toContain('-----BEGIN');
|
|
152
|
+
// Should be valid base64
|
|
153
|
+
expect(() => Buffer.from(base64KeyPair.publicKey, 'base64')).not.toThrow();
|
|
154
|
+
expect(() => Buffer.from(base64KeyPair.privateKey, 'base64')).not.toThrow();
|
|
155
|
+
});
|
|
156
|
+
it('should export base64 keys to PEM format', () => {
|
|
157
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
158
|
+
const pemKeyPair = exportKeys(base64KeyPair, 'pem');
|
|
159
|
+
expect(pemKeyPair.publicKey).toContain('-----BEGIN PUBLIC KEY-----');
|
|
160
|
+
expect(pemKeyPair.privateKey).toContain('-----BEGIN PRIVATE KEY-----');
|
|
161
|
+
});
|
|
162
|
+
it('should return same keys if already in requested format', () => {
|
|
163
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
164
|
+
const exportedPem = exportKeys(pemKeyPair, 'pem');
|
|
165
|
+
expect(exportedPem).toEqual(pemKeyPair);
|
|
166
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
167
|
+
const exportedBase64 = exportKeys(base64KeyPair, 'base64');
|
|
168
|
+
expect(exportedBase64).toEqual(base64KeyPair);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('importKeys', () => {
|
|
172
|
+
it('should import PEM keys successfully', () => {
|
|
173
|
+
const keyObjects = importKeys(testKeyPair.publicKey, testKeyPair.privateKey);
|
|
174
|
+
expect(keyObjects).toBeDefined();
|
|
175
|
+
expect(keyObjects.publicKey).toBeDefined();
|
|
176
|
+
expect(keyObjects.privateKey).toBeDefined();
|
|
177
|
+
expect(keyObjects.publicKey.type).toBe('public');
|
|
178
|
+
expect(keyObjects.privateKey.type).toBe('private');
|
|
179
|
+
});
|
|
180
|
+
it('should import base64 keys successfully', () => {
|
|
181
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
182
|
+
const keyObjects = importKeys(base64KeyPair.publicKey, base64KeyPair.privateKey);
|
|
183
|
+
expect(keyObjects).toBeDefined();
|
|
184
|
+
expect(keyObjects.publicKey.type).toBe('public');
|
|
185
|
+
expect(keyObjects.privateKey.type).toBe('private');
|
|
186
|
+
});
|
|
187
|
+
it('should import raw base64 keys without PEM headers', () => {
|
|
188
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
189
|
+
// Extract raw base64
|
|
190
|
+
const rawPublicKey = pemKeyPair.publicKey
|
|
191
|
+
.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
192
|
+
.replace('-----END PUBLIC KEY-----', '')
|
|
193
|
+
.replace(/\s/g, '');
|
|
194
|
+
const rawPrivateKey = pemKeyPair.privateKey
|
|
195
|
+
.replace('-----BEGIN PRIVATE KEY-----', '')
|
|
196
|
+
.replace('-----END PRIVATE KEY-----', '')
|
|
197
|
+
.replace(/\s/g, '');
|
|
198
|
+
const keyObjects = importKeys(rawPublicKey, rawPrivateKey);
|
|
199
|
+
expect(keyObjects).toBeDefined();
|
|
200
|
+
expect(keyObjects.publicKey.type).toBe('public');
|
|
201
|
+
expect(keyObjects.privateKey.type).toBe('private');
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('isValidPublicKey', () => {
|
|
205
|
+
it('should return true for valid PEM public key', () => {
|
|
206
|
+
expect(isValidPublicKey(testKeyPair.publicKey)).toBe(true);
|
|
207
|
+
});
|
|
208
|
+
it('should return true for valid base64 public key', () => {
|
|
209
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
210
|
+
expect(isValidPublicKey(base64KeyPair.publicKey)).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
it('should return true for raw base64 public key without PEM headers', () => {
|
|
213
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
214
|
+
const rawPublicKey = pemKeyPair.publicKey
|
|
215
|
+
.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
216
|
+
.replace('-----END PUBLIC KEY-----', '')
|
|
217
|
+
.replace(/\s/g, '');
|
|
218
|
+
expect(isValidPublicKey(rawPublicKey)).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
it('should return false for invalid key', () => {
|
|
221
|
+
expect(isValidPublicKey('invalid-key')).toBe(false);
|
|
222
|
+
expect(isValidPublicKey('')).toBe(false);
|
|
223
|
+
expect(isValidPublicKey('-----BEGIN PUBLIC KEY-----\ninvalid\n-----END PUBLIC KEY-----')).toBe(false);
|
|
224
|
+
});
|
|
225
|
+
it('should return false for private key', () => {
|
|
226
|
+
expect(isValidPublicKey(testKeyPair.privateKey)).toBe(false);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('isValidPrivateKey', () => {
|
|
230
|
+
it('should return true for valid PEM private key', () => {
|
|
231
|
+
expect(isValidPrivateKey(testKeyPair.privateKey)).toBe(true);
|
|
232
|
+
});
|
|
233
|
+
it('should return true for valid base64 private key', () => {
|
|
234
|
+
const base64KeyPair = generateKeyPairSync({ format: 'base64' });
|
|
235
|
+
expect(isValidPrivateKey(base64KeyPair.privateKey)).toBe(true);
|
|
236
|
+
});
|
|
237
|
+
it('should return true for raw base64 private key without PEM headers', () => {
|
|
238
|
+
const pemKeyPair = generateKeyPairSync({ format: 'pem' });
|
|
239
|
+
const rawPrivateKey = pemKeyPair.privateKey
|
|
240
|
+
.replace('-----BEGIN PRIVATE KEY-----', '')
|
|
241
|
+
.replace('-----END PRIVATE KEY-----', '')
|
|
242
|
+
.replace(/\s/g, '');
|
|
243
|
+
expect(isValidPrivateKey(rawPrivateKey)).toBe(true);
|
|
244
|
+
});
|
|
245
|
+
it('should return false for invalid key', () => {
|
|
246
|
+
expect(isValidPrivateKey('invalid-key')).toBe(false);
|
|
247
|
+
expect(isValidPrivateKey('')).toBe(false);
|
|
248
|
+
expect(isValidPrivateKey('-----BEGIN PRIVATE KEY-----\ninvalid\n-----END PRIVATE KEY-----')).toBe(false);
|
|
249
|
+
});
|
|
250
|
+
it('should return false for public key', () => {
|
|
251
|
+
expect(isValidPrivateKey(testKeyPair.publicKey)).toBe(false);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('getKeySize', () => {
|
|
255
|
+
it('should return correct key size for 2048-bit key', () => {
|
|
256
|
+
const keyPair = generateKeyPairSync({ keySize: 2048 });
|
|
257
|
+
expect(getKeySize(keyPair.publicKey)).toBe(2048);
|
|
258
|
+
expect(getKeySize(keyPair.privateKey)).toBe(2048);
|
|
259
|
+
});
|
|
260
|
+
it('should return correct key size for 3072-bit key', () => {
|
|
261
|
+
const keyPair = generateKeyPairSync({ keySize: 3072 });
|
|
262
|
+
expect(getKeySize(keyPair.publicKey)).toBe(3072);
|
|
263
|
+
expect(getKeySize(keyPair.privateKey)).toBe(3072);
|
|
264
|
+
});
|
|
265
|
+
it('should return correct key size for 4096-bit key', () => {
|
|
266
|
+
const keyPair = generateKeyPairSync({ keySize: 4096 });
|
|
267
|
+
expect(getKeySize(keyPair.publicKey)).toBe(4096);
|
|
268
|
+
expect(getKeySize(keyPair.privateKey)).toBe(4096);
|
|
269
|
+
});
|
|
270
|
+
it('should handle base64 encoded keys', () => {
|
|
271
|
+
const base64KeyPair = generateKeyPairSync({
|
|
272
|
+
keySize: 2048,
|
|
273
|
+
format: 'base64',
|
|
274
|
+
});
|
|
275
|
+
expect(getKeySize(base64KeyPair.publicKey)).toBe(2048);
|
|
276
|
+
expect(getKeySize(base64KeyPair.privateKey)).toBe(2048);
|
|
277
|
+
});
|
|
278
|
+
it('should handle raw base64 keys without PEM headers', () => {
|
|
279
|
+
const pemKeyPair = generateKeyPairSync({ keySize: 2048, format: 'pem' });
|
|
280
|
+
const rawPublicKey = pemKeyPair.publicKey
|
|
281
|
+
.replace('-----BEGIN PUBLIC KEY-----', '')
|
|
282
|
+
.replace('-----END PUBLIC KEY-----', '')
|
|
283
|
+
.replace(/\s/g, '');
|
|
284
|
+
const rawPrivateKey = pemKeyPair.privateKey
|
|
285
|
+
.replace('-----BEGIN PRIVATE KEY-----', '')
|
|
286
|
+
.replace('-----END PRIVATE KEY-----', '')
|
|
287
|
+
.replace(/\s/g, '');
|
|
288
|
+
expect(getKeySize(rawPublicKey)).toBe(2048);
|
|
289
|
+
expect(getKeySize(rawPrivateKey)).toBe(2048);
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
describe('Edge cases and error handling', () => {
|
|
293
|
+
it('should handle empty string encryption', () => {
|
|
294
|
+
const encrypted = encryptWithPublicKey('', testKeyPair.publicKey);
|
|
295
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
296
|
+
expect(decrypted).toBe('');
|
|
297
|
+
});
|
|
298
|
+
it('should handle special characters', () => {
|
|
299
|
+
const specialChars = '!@#$%^&*()_+-=[]{}|;\':",./<>?`~\n\t\r';
|
|
300
|
+
const encrypted = encryptWithPublicKey(specialChars, testKeyPair.publicKey);
|
|
301
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
302
|
+
expect(decrypted).toBe(specialChars);
|
|
303
|
+
});
|
|
304
|
+
it('should handle Unicode characters', () => {
|
|
305
|
+
const unicode = '你好世界 🌍 مرحبا بالعالم';
|
|
306
|
+
const encrypted = encryptWithPublicKey(unicode, testKeyPair.publicKey);
|
|
307
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
308
|
+
expect(decrypted).toBe(unicode);
|
|
309
|
+
});
|
|
310
|
+
it('should handle null values in objects', () => {
|
|
311
|
+
const dataWithNull = { key: null, value: 'test' };
|
|
312
|
+
const encrypted = encryptWithPublicKey(dataWithNull, testKeyPair.publicKey);
|
|
313
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
314
|
+
expect(decrypted).toEqual(dataWithNull);
|
|
315
|
+
});
|
|
316
|
+
it('should handle arrays', () => {
|
|
317
|
+
const arrayData = [1, 2, 3, 'test', { nested: true }];
|
|
318
|
+
const encrypted = encryptWithPublicKey(arrayData, testKeyPair.publicKey);
|
|
319
|
+
const decrypted = decryptWithPrivateKey(encrypted, testKeyPair.privateKey);
|
|
320
|
+
expect(decrypted).toEqual(arrayData);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
}, 30000);
|
|
324
|
+
//# sourceMappingURL=rsa-encryption.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rsa-encryption.test.mjs","sourceRoot":"","sources":["../../src/encryption/rsa-encryption.test.mts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nr1e/commons",
|
|
3
3
|
"description": "Common utilities for TypeScript projects",
|
|
4
|
-
"version": "0.0.0-snapshot-
|
|
4
|
+
"version": "0.0.0-snapshot-20251228033901",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "NR1E, Inc.",
|
|
7
7
|
"publishConfig": {
|
|
@@ -35,6 +35,10 @@
|
|
|
35
35
|
"import": "./dist/bitsnbytes/index.mjs",
|
|
36
36
|
"types": "./dist/bitsnbytes/index.d.mts"
|
|
37
37
|
},
|
|
38
|
+
"./encryption": {
|
|
39
|
+
"import": "./dist/encryption/index.mjs",
|
|
40
|
+
"types": "./dist/encryption/index.d.mts"
|
|
41
|
+
},
|
|
38
42
|
"./errors": {
|
|
39
43
|
"import": "./dist/errors/index.mjs",
|
|
40
44
|
"types": "./dist/errors/index.d.mts"
|