Files
@ 5c8fceb4e291
Branch filter:
Location: CryptoJS/src/util.js
5c8fceb4e291
3.3 KiB
text/javascript
I/O, user interface
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | 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);
}
|