61 lines
2.2 KiB
JavaScript
61 lines
2.2 KiB
JavaScript
/* eslint-disable no-bitwise */
|
|||
import ByteBuffer from 'bytebuffer';
|
|||
import SimpleCrypto from 'react-native-simple-crypto';
|
|||
|
|||
import random from '../../utils/random';
|
|||
import { fromByteArray, toByteArray } from '../../utils/base64-js';
|
|||
|
|||
const BASE64URI = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
|||
|
|||
export const b64ToBuffer = base64 => toByteArray(base64).buffer;
|
|||
export const utf8ToBuffer = SimpleCrypto.utils.convertUtf8ToArrayBuffer;
|
|||
export const bufferToB64 = arrayBuffer => fromByteArray(new Uint8Array(arrayBuffer));
|
|||
// ArrayBuffer -> Base64 URI Safe
|
|||
// https://github.com/herrjemand/Base64URL-ArrayBuffer/blob/master/lib/base64url-arraybuffer.js
|
|||
export const bufferToB64URI = (buffer) => {
|
|||
const uintArray = new Uint8Array(buffer);
|
|||
const len = uintArray.length;
|
|||
let base64 = '';
|
|||
|
|||
for (let i = 0; i < len; i += 3) {
|
|||
base64 += BASE64URI[uintArray[i] >> 2];
|
|||
base64 += BASE64URI[((uintArray[i] & 3) << 4) | (uintArray[i + 1] >> 4)];
|
|||
base64 += BASE64URI[((uintArray[i + 1] & 15) << 2) | (uintArray[i + 2] >> 6)];
|
|||
base64 += BASE64URI[uintArray[i + 2] & 63];
|
|||
}
|
|||
|
|||
if ((len % 3) === 2) {
|
|||
base64 = base64.substring(0, base64.length - 1);
|
|||
} else if (len % 3 === 1) {
|
|||
base64 = base64.substring(0, base64.length - 2);
|
|||
}
|
|||
|
|||
return base64;
|
|||
};
|
|||
// SimpleCrypto.utils.convertArrayBufferToUtf8 is not working with unicode emoji
|
|||
export const bufferToUtf8 = (buffer) => {
|
|||
const uintArray = new Uint8Array(buffer);
|
|||
const encodedString = String.fromCharCode.apply(null, uintArray);
|
|||
const decodedString = decodeURIComponent(escape(encodedString));
|
|||
return decodedString;
|
|||
};
|
|||
export const splitVectorData = (text) => {
|
|||
const vector = text.slice(0, 16);
|
|||
const data = text.slice(16);
|
|||
return [vector, data];
|
|||
};
|
|||
export const joinVectorData = (vector, data) => {
|
|||
const output = new Uint8Array(vector.byteLength + data.byteLength);
|
|||
output.set(new Uint8Array(vector), 0);
|
|||
output.set(new Uint8Array(data), vector.byteLength);
|
|||
return output.buffer;
|
|||
};
|
|||
export const toString = (thing) => {
|
|||
if (typeof thing === 'string') {
|
|||
return thing;
|
|||
}
|
|||
// eslint-disable-next-line new-cap
|
|||
return new ByteBuffer.wrap(thing).toString('binary');
|
|||
};
|
|||
export const randomPassword = () => `${ random(3) }-${ random(3) }-${ random(3) }`.toLowerCase();
|