Files @ abd03aa8b163
Branch filter:

Location: CryptoJS/src/util.js

Laman
added readme
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);
}