Skip to content

Commit a8ae25b

Browse files
authored
Merge pull request #48 from VirgilSecurity/v4.0.0-alpha.1
v4.0.0-alpha.1
2 parents e9157e9 + 5bdf972 commit a8ae25b

21 files changed

+232
-212
lines changed

packages/base-crypto/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@virgilsecurity/base-crypto",
3-
"version": "0.1.0",
3+
"version": "0.2.0",
44
"description": "Virgil JavaScript Crypto Library is a high-level cryptographic library that allows you to perform all necessary operations for secure storing and transferring data and everything required to become HIPAA and GDPR compliant.",
55
"main": "./dist/base-crypto.cjs.js",
66
"module": "./dist/base-crypto.es.js",

packages/base-crypto/src/VirgilCrypto.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export class VirgilCrypto {
6161

6262
generateKeysFromKeyMaterial(keyMaterial: Data, type?: KeyPairTypeType[keyof KeyPairTypeType]) {
6363
const keyPairType = type ? type : this.defaultKeyPairType;
64-
const myKeyMaterial = dataToUint8Array(keyMaterial);
64+
const myKeyMaterial = dataToUint8Array(keyMaterial, 'base64');
6565

6666
const keyMaterialRng = new this.foundationModules.KeyMaterialRng();
6767
keyMaterialRng.resetKeyMaterial(myKeyMaterial);
@@ -85,7 +85,7 @@ export class VirgilCrypto {
8585
}
8686

8787
importPrivateKey(rawPrivateKey: Data) {
88-
const myRawPrivateKey = dataToUint8Array(rawPrivateKey);
88+
const myRawPrivateKey = dataToUint8Array(rawPrivateKey, 'base64');
8989

9090
const keyProvider = new this.foundationModules.KeyProvider();
9191
keyProvider.setupDefaults();
@@ -128,7 +128,7 @@ export class VirgilCrypto {
128128
}
129129

130130
importPublicKey(rawPublicKey: Data) {
131-
const myRawPublicKey = dataToUint8Array(rawPublicKey);
131+
const myRawPublicKey = dataToUint8Array(rawPublicKey, 'base64');
132132

133133
const keyProvider = new this.foundationModules.KeyProvider();
134134
keyProvider.setupDefaults();
@@ -162,7 +162,7 @@ export class VirgilCrypto {
162162
}
163163

164164
encrypt(data: Data, publicKey: VirgilPublicKey | VirgilPublicKey[]) {
165-
const myData = dataToUint8Array(data);
165+
const myData = dataToUint8Array(data, 'utf8');
166166
const publicKeys = toArray(publicKey);
167167
validatePublicKeysArray(publicKeys);
168168

@@ -189,11 +189,12 @@ export class VirgilCrypto {
189189
}
190190

191191
decrypt(encryptedData: Data, privateKey: VirgilPrivateKey) {
192-
const myData = dataToUint8Array(encryptedData);
192+
const myData = dataToUint8Array(encryptedData, 'base64');
193193
validatePrivateKey(privateKey);
194194
const lowLevelPrivateKey = getLowLevelPrivateKey(privateKey);
195195

196196
const recipientCipher = new this.foundationModules.RecipientCipher();
197+
recipientCipher.random = this.random;
197198

198199
recipientCipher.startDecryptionWithKey(
199200
privateKey.identifier,
@@ -214,7 +215,7 @@ export class VirgilCrypto {
214215
data: Data,
215216
algorithm: HashAlgorithmType[keyof HashAlgorithmType] = HashAlgorithm.SHA512,
216217
) {
217-
const myData = dataToUint8Array(data);
218+
const myData = dataToUint8Array(data, 'utf8');
218219
let result: Uint8Array;
219220
switch (algorithm) {
220221
case HashAlgorithm.SHA224:
@@ -243,7 +244,7 @@ export class VirgilCrypto {
243244
}
244245

245246
calculateSignature(data: Data, privateKey: VirgilPrivateKey) {
246-
const myData = dataToUint8Array(data);
247+
const myData = dataToUint8Array(data, 'utf8');
247248
validatePrivateKey(privateKey);
248249
const lowLevelPrivateKey = getLowLevelPrivateKey(privateKey);
249250

@@ -264,8 +265,8 @@ export class VirgilCrypto {
264265
}
265266

266267
verifySignature(data: Data, signature: Data, publicKey: VirgilPublicKey) {
267-
const myData = dataToUint8Array(data);
268-
const mySignature = dataToUint8Array(signature);
268+
const myData = dataToUint8Array(data, 'utf8');
269+
const mySignature = dataToUint8Array(signature, 'base64');
269270
validatePublicKey(publicKey);
270271

271272
const verifier = new this.foundationModules.Verifier();
@@ -284,7 +285,7 @@ export class VirgilCrypto {
284285
privateKey: VirgilPrivateKey,
285286
publicKey: VirgilPublicKey | VirgilPublicKey[],
286287
) {
287-
const myData = dataToUint8Array(data);
288+
const myData = dataToUint8Array(data, 'utf8');
288289

289290
validatePrivateKey(privateKey);
290291

@@ -324,7 +325,7 @@ export class VirgilCrypto {
324325
privateKey: VirgilPrivateKey,
325326
publicKey: VirgilPublicKey | VirgilPublicKey[],
326327
) {
327-
const myEncryptedData = dataToUint8Array(encryptedData);
328+
const myEncryptedData = dataToUint8Array(encryptedData, 'base64');
328329

329330
const publicKeys = toArray(publicKey);
330331
validatePublicKeysArray(publicKeys);
@@ -333,6 +334,7 @@ export class VirgilCrypto {
333334
const lowLevelPrivateKey = getLowLevelPrivateKey(privateKey);
334335

335336
const recipientCipher = new this.foundationModules.RecipientCipher();
337+
recipientCipher.random = this.random;
336338

337339
recipientCipher.startDecryptionWithKey(
338340
privateKey.identifier,
@@ -386,7 +388,7 @@ export class VirgilCrypto {
386388
privateKey: VirgilPrivateKey,
387389
publicKey: VirgilPublicKey | VirgilPublicKey[],
388390
) {
389-
const myData = dataToUint8Array(data);
391+
const myData = dataToUint8Array(data, 'utf8');
390392

391393
validatePrivateKey(privateKey);
392394

@@ -430,8 +432,8 @@ export class VirgilCrypto {
430432
privateKey: VirgilPrivateKey,
431433
publicKey: VirgilPublicKey | VirgilPublicKey[],
432434
) {
433-
const myEncryptedData = dataToUint8Array(encryptedData);
434-
const myMetadata = dataToUint8Array(metadata);
435+
const myEncryptedData = dataToUint8Array(encryptedData, 'base64');
436+
const myMetadata = dataToUint8Array(metadata, 'base64');
435437

436438
validatePrivateKey(privateKey);
437439
const lowLevelPrivateKey = getLowLevelPrivateKey(privateKey);
@@ -440,6 +442,7 @@ export class VirgilCrypto {
440442
validatePublicKeysArray(publicKeys);
441443

442444
const recipientCipher = new this.foundationModules.RecipientCipher();
445+
recipientCipher.random = this.random;
443446

444447
recipientCipher.startDecryptionWithKey(privateKey.identifier, lowLevelPrivateKey, myMetadata);
445448
const processDecryption = recipientCipher.processDecryption(myEncryptedData);

packages/base-crypto/src/VirgilStreamCipher.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class VirgilStreamCipher {
3636
});
3737

3838
if (signature) {
39-
const mySignature = dataToUint8Array(signature);
39+
const mySignature = dataToUint8Array(signature, 'base64');
4040
this.messageInfoCustomParams = this.recipientCipher.customParams();
4141
this.messageInfoCustomParams.addData(DATA_SIGNATURE_KEY, mySignature);
4242
}
@@ -52,7 +52,7 @@ export class VirgilStreamCipher {
5252
update(data: Data) {
5353
this.ensureLegalState();
5454
this.ensureIsRunning();
55-
const myData = dataToUint8Array(data);
55+
const myData = dataToUint8Array(data, 'utf8');
5656
return toBuffer(this.recipientCipher.processEncryption(myData));
5757
}
5858

packages/base-crypto/src/VirgilStreamDecipher.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export class VirgilStreamDecipher {
4949

5050
update(data: Data) {
5151
this.ensureLegalState();
52-
const myData = dataToUint8Array(data);
52+
const myData = dataToUint8Array(data, 'utf8');
5353
return toBuffer(this.recipientCipher.processDecryption(myData));
5454
}
5555

packages/base-crypto/src/VirgilStreamSigner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export class VirgilStreamSigner {
2626
'Illegal state. Cannot use signer after the `dispose` method has been called.',
2727
);
2828
}
29-
const myData = dataToUint8Array(data);
29+
const myData = dataToUint8Array(data, 'utf8');
3030
this.signer.appendData(myData);
3131
return this;
3232
}

packages/base-crypto/src/VirgilStreamVerifier.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export class VirgilStreamVerifier {
1111

1212
constructor(signature: Data) {
1313
const foundationModules = getFoundationModules();
14-
const mySignature = dataToUint8Array(signature);
14+
const mySignature = dataToUint8Array(signature, 'base64');
1515
this.verifier = new foundationModules.Verifier();
1616
this.verifier.reset(mySignature);
1717
}
@@ -22,7 +22,7 @@ export class VirgilStreamVerifier {
2222
'Illegal state. Cannot use signer after the `dispose` method has been called.',
2323
);
2424
}
25-
const myData = dataToUint8Array(data);
25+
const myData = dataToUint8Array(data, 'utf8');
2626
this.verifier.appendData(myData);
2727
return this;
2828
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { expect } from 'chai';
2+
import { Buffer as NodeBuffer } from 'buffer';
3+
4+
import { dataToUint8Array } from '../utils';
5+
6+
describe('utils', () => {
7+
describe('dataToUint8Array', () => {
8+
it('returns Uint8Array based on a string that was converted to it using defaultEncoding', () => {
9+
const data = 'data';
10+
const result = dataToUint8Array(data, 'utf8');
11+
const expected = NodeBuffer.from(data, 'utf8');
12+
expect(expected.equals(result)).to.be.true;
13+
});
14+
15+
it('returns Uint8Array based on a string that was converted to it using default encoding (utf-8)', () => {
16+
const data = 'data';
17+
const result = dataToUint8Array(data);
18+
const expected = NodeBuffer.from(data, 'utf8');
19+
expect(expected.equals(result)).to.be.true;
20+
});
21+
22+
it('returns the same Uint8Array if argument is an instance of Uint8Array', () => {
23+
const data = new Uint8Array(0);
24+
const result = dataToUint8Array(data);
25+
expect(result === result).to.be.true;
26+
});
27+
28+
it('throws if first argument is not a string / Data object / Uint8Array', () => {
29+
const error = () => {
30+
// @ts-ignore
31+
dataToUint8Array(123);
32+
};
33+
expect(error).to.throw;
34+
});
35+
36+
it('throws if Data object is invalid', () => {
37+
const error = () => {
38+
// @ts-ignore
39+
dataToUint8Array({ value: 123, encoding: 'utf8' });
40+
};
41+
expect(error).to.throw;
42+
});
43+
});
44+
});

packages/base-crypto/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export interface StringWithEncoding {
1212
encoding: keyof typeof StringEncoding;
1313
}
1414

15-
export type Data = Uint8Array | StringWithEncoding;
15+
export type Data = Uint8Array | StringWithEncoding | string;
1616

1717
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1818
export type LowLevelPrivateKey = any;

packages/base-crypto/src/utils.ts

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,13 @@ import { Buffer as NodeBuffer } from 'buffer';
22

33
import { StringEncoding, Data } from './types';
44

5-
export const dataToUint8Array = (data: Data): Uint8Array => {
5+
export const dataToUint8Array = (
6+
data: Data,
7+
defaultEncoding?: keyof typeof StringEncoding,
8+
): Uint8Array => {
9+
if (typeof data === 'string') {
10+
return NodeBuffer.from(data, defaultEncoding);
11+
}
612
if (data instanceof Uint8Array) {
713
return data;
814
}
@@ -16,16 +22,6 @@ export const dataToUint8Array = (data: Data): Uint8Array => {
1622
throw new TypeError('Invalid format of Data');
1723
};
1824

19-
export const uint8ArrayOrStringToUint8Array = (
20-
value: Uint8Array | string,
21-
encoding: keyof typeof StringEncoding,
22-
) => {
23-
if (typeof value === 'string') {
24-
return dataToUint8Array({ value, encoding });
25-
}
26-
return value;
27-
};
28-
2925
export const toArray = <T>(val?: T | T[]): T[] => {
3026
return val == null ? [] : Array.isArray(val) ? val : [val];
3127
};

0 commit comments

Comments
 (0)