Remove Internet Explorer logic (#723)
This commit is contained in:
parent
554dc8d873
commit
5b7b2a03dd
|
@ -10,7 +10,7 @@ import { LogService } from "jslib-common/abstractions/log.service";
|
||||||
import { PasswordGenerationService } from "jslib-common/abstractions/passwordGeneration.service";
|
import { PasswordGenerationService } from "jslib-common/abstractions/passwordGeneration.service";
|
||||||
import { PlatformUtilsService } from "jslib-common/abstractions/platformUtils.service";
|
import { PlatformUtilsService } from "jslib-common/abstractions/platformUtils.service";
|
||||||
import { StateService } from "jslib-common/abstractions/state.service";
|
import { StateService } from "jslib-common/abstractions/state.service";
|
||||||
import { KdfType } from "jslib-common/enums/kdfType";
|
import { DEFAULT_KDF_ITERATIONS, DEFAULT_KDF_TYPE } from "jslib-common/enums/kdfType";
|
||||||
import { KeysRequest } from "jslib-common/models/request/keysRequest";
|
import { KeysRequest } from "jslib-common/models/request/keysRequest";
|
||||||
import { ReferenceEventRequest } from "jslib-common/models/request/referenceEventRequest";
|
import { ReferenceEventRequest } from "jslib-common/models/request/referenceEventRequest";
|
||||||
import { RegisterRequest } from "jslib-common/models/request/registerRequest";
|
import { RegisterRequest } from "jslib-common/models/request/registerRequest";
|
||||||
|
@ -163,9 +163,8 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn
|
||||||
|
|
||||||
this.name = this.name === "" ? null : this.name;
|
this.name = this.name === "" ? null : this.name;
|
||||||
this.email = this.email.trim().toLowerCase();
|
this.email = this.email.trim().toLowerCase();
|
||||||
const kdf = KdfType.PBKDF2_SHA256;
|
const kdf = DEFAULT_KDF_TYPE;
|
||||||
const useLowerKdf = this.platformUtilsService.isIE();
|
const kdfIterations = DEFAULT_KDF_ITERATIONS;
|
||||||
const kdfIterations = useLowerKdf ? 10000 : 100000;
|
|
||||||
const key = await this.cryptoService.makeKey(
|
const key = await this.cryptoService.makeKey(
|
||||||
this.masterPassword,
|
this.masterPassword,
|
||||||
this.email,
|
this.email,
|
||||||
|
|
|
@ -12,7 +12,7 @@ import { PolicyService } from "jslib-common/abstractions/policy.service";
|
||||||
import { StateService } from "jslib-common/abstractions/state.service";
|
import { StateService } from "jslib-common/abstractions/state.service";
|
||||||
import { SyncService } from "jslib-common/abstractions/sync.service";
|
import { SyncService } from "jslib-common/abstractions/sync.service";
|
||||||
import { HashPurpose } from "jslib-common/enums/hashPurpose";
|
import { HashPurpose } from "jslib-common/enums/hashPurpose";
|
||||||
import { KdfType } from "jslib-common/enums/kdfType";
|
import { DEFAULT_KDF_ITERATIONS, DEFAULT_KDF_TYPE } from "jslib-common/enums/kdfType";
|
||||||
import { Utils } from "jslib-common/misc/utils";
|
import { Utils } from "jslib-common/misc/utils";
|
||||||
import { EncString } from "jslib-common/models/domain/encString";
|
import { EncString } from "jslib-common/models/domain/encString";
|
||||||
import { SymmetricCryptoKey } from "jslib-common/models/domain/symmetricCryptoKey";
|
import { SymmetricCryptoKey } from "jslib-common/models/domain/symmetricCryptoKey";
|
||||||
|
@ -85,9 +85,8 @@ export class SetPasswordComponent extends BaseChangePasswordComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
async setupSubmitActions() {
|
async setupSubmitActions() {
|
||||||
this.kdf = KdfType.PBKDF2_SHA256;
|
this.kdf = DEFAULT_KDF_TYPE;
|
||||||
const useLowerKdf = this.platformUtilsService.isIE();
|
this.kdfIterations = DEFAULT_KDF_ITERATIONS;
|
||||||
this.kdfIterations = useLowerKdf ? 10000 : 100000;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -413,7 +413,7 @@ import { ValidationService } from "./validation.service";
|
||||||
{
|
{
|
||||||
provide: CryptoFunctionServiceAbstraction,
|
provide: CryptoFunctionServiceAbstraction,
|
||||||
useClass: WebCryptoFunctionService,
|
useClass: WebCryptoFunctionService,
|
||||||
deps: ["WINDOW", PlatformUtilsServiceAbstraction],
|
deps: ["WINDOW"],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
provide: EventServiceAbstraction,
|
provide: EventServiceAbstraction,
|
||||||
|
|
|
@ -16,7 +16,6 @@ export abstract class PlatformUtilsService {
|
||||||
isOpera: () => boolean;
|
isOpera: () => boolean;
|
||||||
isVivaldi: () => boolean;
|
isVivaldi: () => boolean;
|
||||||
isSafari: () => boolean;
|
isSafari: () => boolean;
|
||||||
isIE: () => boolean;
|
|
||||||
isMacAppStore: () => boolean;
|
isMacAppStore: () => boolean;
|
||||||
isViewOpen: () => Promise<boolean>;
|
isViewOpen: () => Promise<boolean>;
|
||||||
launchUri: (uri: string, options?: any) => void;
|
launchUri: (uri: string, options?: any) => void;
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
export enum KdfType {
|
export enum KdfType {
|
||||||
PBKDF2_SHA256 = 0,
|
PBKDF2_SHA256 = 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const DEFAULT_KDF_TYPE = KdfType.PBKDF2_SHA256;
|
||||||
|
export const DEFAULT_KDF_ITERATIONS = 100000;
|
||||||
|
export const SEND_KDF_ITERATIONS = 100000;
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {
|
||||||
} from "../abstractions/export.service";
|
} from "../abstractions/export.service";
|
||||||
import { FolderService } from "../abstractions/folder.service";
|
import { FolderService } from "../abstractions/folder.service";
|
||||||
import { CipherType } from "../enums/cipherType";
|
import { CipherType } from "../enums/cipherType";
|
||||||
import { KdfType } from "../enums/kdfType";
|
import { DEFAULT_KDF_ITERATIONS, KdfType } from "../enums/kdfType";
|
||||||
import { Utils } from "../misc/utils";
|
import { Utils } from "../misc/utils";
|
||||||
import { CipherData } from "../models/data/cipherData";
|
import { CipherData } from "../models/data/cipherData";
|
||||||
import { CollectionData } from "../models/data/collectionData";
|
import { CollectionData } from "../models/data/collectionData";
|
||||||
|
@ -54,7 +54,7 @@ export class ExportService implements ExportServiceAbstraction {
|
||||||
: await this.getExport("json");
|
: await this.getExport("json");
|
||||||
|
|
||||||
const salt = Utils.fromBufferToB64(await this.cryptoFunctionService.randomBytes(16));
|
const salt = Utils.fromBufferToB64(await this.cryptoFunctionService.randomBytes(16));
|
||||||
const kdfIterations = 100000;
|
const kdfIterations = DEFAULT_KDF_ITERATIONS;
|
||||||
const key = await this.cryptoService.makePinKey(
|
const key = await this.cryptoService.makePinKey(
|
||||||
password,
|
password,
|
||||||
salt,
|
salt,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { FileUploadService } from "../abstractions/fileUpload.service";
|
||||||
import { I18nService } from "../abstractions/i18n.service";
|
import { I18nService } from "../abstractions/i18n.service";
|
||||||
import { SendService as SendServiceAbstraction } from "../abstractions/send.service";
|
import { SendService as SendServiceAbstraction } from "../abstractions/send.service";
|
||||||
import { StateService } from "../abstractions/state.service";
|
import { StateService } from "../abstractions/state.service";
|
||||||
|
import { SEND_KDF_ITERATIONS } from "../enums/kdfType";
|
||||||
import { SendType } from "../enums/sendType";
|
import { SendType } from "../enums/sendType";
|
||||||
import { Utils } from "../misc/utils";
|
import { Utils } from "../misc/utils";
|
||||||
import { SendData } from "../models/data/sendData";
|
import { SendData } from "../models/data/sendData";
|
||||||
|
@ -55,7 +56,7 @@ export class SendService implements SendServiceAbstraction {
|
||||||
password,
|
password,
|
||||||
model.key,
|
model.key,
|
||||||
"sha256",
|
"sha256",
|
||||||
100000
|
SEND_KDF_ITERATIONS
|
||||||
);
|
);
|
||||||
send.password = Utils.fromBufferToB64(passwordHash);
|
send.password = Utils.fromBufferToB64(passwordHash);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import * as forge from "node-forge";
|
import * as forge from "node-forge";
|
||||||
|
|
||||||
import { CryptoFunctionService } from "../abstractions/cryptoFunction.service";
|
import { CryptoFunctionService } from "../abstractions/cryptoFunction.service";
|
||||||
import { PlatformUtilsService } from "../abstractions/platformUtils.service";
|
|
||||||
import { Utils } from "../misc/utils";
|
import { Utils } from "../misc/utils";
|
||||||
import { DecryptParameters } from "../models/domain/decryptParameters";
|
import { DecryptParameters } from "../models/domain/decryptParameters";
|
||||||
import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey";
|
import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey";
|
||||||
|
@ -9,18 +8,11 @@ import { SymmetricCryptoKey } from "../models/domain/symmetricCryptoKey";
|
||||||
export class WebCryptoFunctionService implements CryptoFunctionService {
|
export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
private crypto: Crypto;
|
private crypto: Crypto;
|
||||||
private subtle: SubtleCrypto;
|
private subtle: SubtleCrypto;
|
||||||
private isIE: boolean;
|
|
||||||
private isOldSafari: boolean;
|
|
||||||
|
|
||||||
constructor(private win: Window, private platformUtilsService: PlatformUtilsService) {
|
constructor(win: Window) {
|
||||||
this.crypto = typeof win.crypto !== "undefined" ? win.crypto : null;
|
this.crypto = typeof win.crypto !== "undefined" ? win.crypto : null;
|
||||||
this.subtle =
|
this.subtle =
|
||||||
!!this.crypto && typeof win.crypto.subtle !== "undefined" ? win.crypto.subtle : null;
|
!!this.crypto && typeof win.crypto.subtle !== "undefined" ? win.crypto.subtle : null;
|
||||||
this.isIE = platformUtilsService.isIE();
|
|
||||||
const ua = win.navigator.userAgent;
|
|
||||||
this.isOldSafari =
|
|
||||||
platformUtilsService.isSafari() &&
|
|
||||||
(ua.indexOf(" Version/10.") > -1 || ua.indexOf(" Version/9.") > -1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async pbkdf2(
|
async pbkdf2(
|
||||||
|
@ -29,20 +21,6 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
algorithm: "sha256" | "sha512",
|
algorithm: "sha256" | "sha512",
|
||||||
iterations: number
|
iterations: number
|
||||||
): Promise<ArrayBuffer> {
|
): Promise<ArrayBuffer> {
|
||||||
if (this.isIE || this.isOldSafari) {
|
|
||||||
const forgeLen = algorithm === "sha256" ? 32 : 64;
|
|
||||||
const passwordBytes = this.toByteString(password);
|
|
||||||
const saltBytes = this.toByteString(salt);
|
|
||||||
const derivedKeyBytes = (forge as any).pbkdf2(
|
|
||||||
passwordBytes,
|
|
||||||
saltBytes,
|
|
||||||
iterations,
|
|
||||||
forgeLen,
|
|
||||||
algorithm
|
|
||||||
);
|
|
||||||
return Utils.fromByteStringToArray(derivedKeyBytes).buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
const wcLen = algorithm === "sha256" ? 256 : 512;
|
const wcLen = algorithm === "sha256" ? 256 : 512;
|
||||||
const passwordBuf = this.toBuf(password);
|
const passwordBuf = this.toBuf(password);
|
||||||
const saltBuf = this.toBuf(salt);
|
const saltBuf = this.toBuf(salt);
|
||||||
|
@ -127,7 +105,7 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
value: string | ArrayBuffer,
|
value: string | ArrayBuffer,
|
||||||
algorithm: "sha1" | "sha256" | "sha512" | "md5"
|
algorithm: "sha1" | "sha256" | "sha512" | "md5"
|
||||||
): Promise<ArrayBuffer> {
|
): Promise<ArrayBuffer> {
|
||||||
if ((this.isIE && algorithm === "sha1") || algorithm === "md5") {
|
if (algorithm === "md5") {
|
||||||
const md = algorithm === "md5" ? forge.md.md5.create() : forge.md.sha1.create();
|
const md = algorithm === "md5" ? forge.md.md5.create() : forge.md.sha1.create();
|
||||||
const valueBytes = this.toByteString(value);
|
const valueBytes = this.toByteString(value);
|
||||||
md.update(valueBytes, "raw");
|
md.update(valueBytes, "raw");
|
||||||
|
@ -143,15 +121,6 @@ export class WebCryptoFunctionService implements CryptoFunctionService {
|
||||||
key: ArrayBuffer,
|
key: ArrayBuffer,
|
||||||
algorithm: "sha1" | "sha256" | "sha512"
|
algorithm: "sha1" | "sha256" | "sha512"
|
||||||
): Promise<ArrayBuffer> {
|
): Promise<ArrayBuffer> {
|
||||||
if (this.isIE && algorithm === "sha512") {
|
|
||||||
const hmac = (forge as any).hmac.create();
|
|
||||||
const keyBytes = this.toByteString(key);
|
|
||||||
const valueBytes = this.toByteString(value);
|
|
||||||
hmac.start(algorithm, keyBytes);
|
|
||||||
hmac.update(valueBytes, "raw");
|
|
||||||
return Utils.fromByteStringToArray(hmac.digest().data).buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
const signingAlgorithm = {
|
const signingAlgorithm = {
|
||||||
name: "HMAC",
|
name: "HMAC",
|
||||||
hash: { name: this.toWebCryptoAlgorithm(algorithm) },
|
hash: { name: this.toWebCryptoAlgorithm(algorithm) },
|
||||||
|
|
|
@ -75,10 +75,6 @@ export class ElectronPlatformUtilsService implements PlatformUtilsService {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
isIE(): boolean {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
isMacAppStore(): boolean {
|
isMacAppStore(): boolean {
|
||||||
return isMacAppStore();
|
return isMacAppStore();
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,10 +69,6 @@ export class CliPlatformUtilsService implements PlatformUtilsService {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
isIE() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
isMacAppStore() {
|
isMacAppStore() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -545,15 +545,8 @@ function testRsaGenerateKeyPair(length: 1024 | 2048 | 4096) {
|
||||||
function getWebCryptoFunctionService() {
|
function getWebCryptoFunctionService() {
|
||||||
const platformUtilsMock = Substitute.for<PlatformUtilsService>();
|
const platformUtilsMock = Substitute.for<PlatformUtilsService>();
|
||||||
platformUtilsMock.isEdge().mimicks(() => navigator.userAgent.indexOf(" Edg/") !== -1);
|
platformUtilsMock.isEdge().mimicks(() => navigator.userAgent.indexOf(" Edg/") !== -1);
|
||||||
platformUtilsMock
|
|
||||||
.isIE()
|
|
||||||
.mimicks(
|
|
||||||
() =>
|
|
||||||
navigator.userAgent.indexOf(" Edg/") === -1 &&
|
|
||||||
navigator.userAgent.indexOf(" Trident/") !== -1
|
|
||||||
);
|
|
||||||
|
|
||||||
return new WebCryptoFunctionService(window, platformUtilsMock);
|
return new WebCryptoFunctionService(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeStaticByteArray(length: number) {
|
function makeStaticByteArray(length: number) {
|
||||||
|
|
Loading…
Reference in New Issue