Files @ 07d399b4c31c
Branch filter:

Location: CryptoJS/src/util.js - annotation

Laman
updated .hgignore
e2095e3881bf
f425e00a94c6
e2095e3881bf
e2095e3881bf
51344a25b55d
51344a25b55d
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
f425e00a94c6
f425e00a94c6
944bd9524df4
944bd9524df4
944bd9524df4
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
f425e00a94c6
f425e00a94c6
944bd9524df4
944bd9524df4
944bd9524df4
e2095e3881bf
e2095e3881bf
944bd9524df4
944bd9524df4
944bd9524df4
944bd9524df4
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
e2095e3881bf
f425e00a94c6
f425e00a94c6
f425e00a94c6
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
f425e00a94c6
f425e00a94c6
e2095e3881bf
f425e00a94c6
90018dea7eac
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
90018dea7eac
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
90018dea7eac
e2095e3881bf
e2095e3881bf
e2095e3881bf
90018dea7eac
90018dea7eac
90018dea7eac
90018dea7eac
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
e2095e3881bf
90018dea7eac
e2095e3881bf
e2095e3881bf
90018dea7eac
90018dea7eac
90018dea7eac
12f10d9d5948
e2095e3881bf
e2095e3881bf
12f10d9d5948
12f10d9d5948
12f10d9d5948
export const MASK = 0xffffffff;

export function zeroPad(arr, length) {
	return arr.concat((new Array(length)).fill(0)).slice(0, length);
}

export function bytes2int32(arr) {
	return arr.reduce((acc, b, i) => acc | b << (i*8));
}

export function bytes2int32s(arr) {
	let res = [];
	for (let i = 0; i < arr.length; i += 4) {
		res.push(bytes2int32(arr.slice(i, i+4)));
	}
	return res;
}

/**
 * Converts a 32 bit integer into 4 bytes in little endian order.
 */
export function int322bytes(x) {
	let res = [];
	for (let i = 0; i < 4; i++) {
		res.push(x & 0xff);
		x >>>= 8;
	}
	return res;
}

/**
 * Converts a 32 bit integer into 4 bytes in big endian order.
 */
export function int322bytesBE(x) {
	let res = int322bytes(x);
	res.reverse();
	return res;
}

export function int32s2bytes(arr) {
	return arr.map(int322bytes).reduce((acc, bytes) => acc.concat(bytes));
}

export function bytes2hex(arr) {
	return arr.map(x => x.toString(16).padStart(2, "0")).join("");
}

export function str2utf8(s) {
	let res = [];
	let c = s.codePointAt(0);
	for (let i=0; c!==undefined; i++, c=s.codePointAt(i)) {
		if (c < 0x80) {res.push(c);}
		else if (c < 0x800) {
			res.push(0b11000000 | (c >>> 6));
			res.push(0b10000000 | (c & 0b111111));
		}
		else if (c < 0x10000) {
			res.push(0b11100000 | (c >>> 12));
			res.push(0b10000000 | ((c >>> 6) & 0b111111));
			res.push(0b10000000 | (c & 0b111111));
		}
		else {
			res.push(0b11110000 | (c >>> 18));
			res.push(0b10000000 | ((c >>> 12) & 0b111111));
			res.push(0b10000000 | ((c >>> 6) & 0b111111));
			res.push(0b10000000 | (c & 0b111111));
		}
		if (c > 0xffff) {i++;} // skip surrogate
	}
	return res;
}

export function utf82str(arr) {
	let res = [];
	for (let i = 0; i < arr.length; i++) {
		let x = arr[i];
		if (x <= 0b1111111) {res.push(x);}
		else if (x <= 0b11011111) {
			let a = x & 0b11111;
			let b = arr[++i] & 0b111111;
			res.push(a << 6 | b);
		}
		else if (x <= 0b11101111) {
			let a = x & 0b1111;
			let b = arr[++i] & 0b111111;
			let c = arr[++i] & 0b111111;
			res.push(a << 12 | b << 6 | c);
		}
		else {
			let a = x & 0b111;
			let b = arr[++i] & 0b111111;
			let c = arr[++i] & 0b111111;
			let d = arr[++i] & 0b111111;
			res.push(a << 18 | b << 12 | c << 6 | d);
		}
	}
	return res.map(x => String.fromCodePoint(x)).join("");
}

const mapping = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
const remapping = new Array(128);
mapping.forEach((c, i) => {remapping[c.charCodeAt(0)] = i;});

export function bytes2base64(byteArr) {
	let arr = byteArr.concat();
	let out = [];
	let rem = (3 - arr.length%3) % 3;
	for (let i = 0; i < rem; i++) {arr.push(0);} // pad array to a multiple of 3

	for (let i = 0; i < arr.length; i += 3) { // encode 3 bytes into 4 characters
		out.push(mapping[arr[i]>>>2 & 63]);
		out.push(mapping[((arr[i]&3) << 4) + (arr[i+1]>>>4 & 15)]);
		out.push(mapping[((arr[i+1]&15) << 2) + (arr[i+2]>>>6 & 3)]);
		out.push(mapping[arr[i+2] & 63]);
	}

	for (let i = 0; i < rem; i++) {out.pop();}
	for (let i = 0; i < rem; i++) {out.push("=");}

	return out.join("");
}

export function base642bytes(str) {
	let out = [];

	for (let i = 0; i < str.length; i += 4) {
		let b1 = remapping[str.charCodeAt(i)];
		let b2 = remapping[str.charCodeAt(i+1)];
		let b3 = remapping[str.charCodeAt(i+2)];
		let b4 = remapping[str.charCodeAt(i+3)];

		out.push((b1<<2) + (b2>>4 & 3));
		out.push(((b2&15) << 4) + (b3>>2 & 15));
		out.push(((b3&3) << 6) + b4);
	}

	for (let i=1; i<3 && str[str.length-i]=="="; i++) {out.pop();}

	return out;
}

export function createRandomNonce(n) {
	let nonce = new Uint8Array(n);
	window.crypto.getRandomValues(nonce);
	return Array.from(nonce);
}