missing files / native encode/decode
This commit is contained in:
parent
c623309430
commit
de9f8867d5
32
src/crypto/nativeCrypto-test.ts
Normal file
32
src/crypto/nativeCrypto-test.ts
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
This file is part of GNU Taler
|
||||||
|
(C) 2019 GNUnet e.V.
|
||||||
|
|
||||||
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Imports
|
||||||
|
*/
|
||||||
|
import test from "ava";
|
||||||
|
import { encodeCrock, decodeCrock } from "./nativeCrypto";
|
||||||
|
|
||||||
|
|
||||||
|
test("encoding", (t) => {
|
||||||
|
const utf8decoder = new TextDecoder("utf-8");
|
||||||
|
const utf8encoder = new TextEncoder();
|
||||||
|
const s = "Hello, World";
|
||||||
|
const encStr = encodeCrock(utf8encoder.encode(s));
|
||||||
|
const outBuf = decodeCrock(encStr);
|
||||||
|
const sOut = utf8decoder.decode(outBuf);
|
||||||
|
t.deepEqual(s, sOut);
|
||||||
|
});
|
140
src/crypto/nativeCrypto.ts
Normal file
140
src/crypto/nativeCrypto.ts
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*
|
||||||
|
This file is part of GNU Taler
|
||||||
|
(C) 2019 GNUnet e.V.
|
||||||
|
|
||||||
|
GNU Taler is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Native implementation of GNU Taler crypto.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let isNode;
|
||||||
|
|
||||||
|
let myGetRandom: (n: number) => ArrayBuffer;
|
||||||
|
|
||||||
|
if (require) {
|
||||||
|
// node.js
|
||||||
|
const cr = require("crypto");
|
||||||
|
myGetRandom = (n: number) => {
|
||||||
|
const buf = cr.randomBytes(n);
|
||||||
|
return Uint8Array.from(buf);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Browser
|
||||||
|
myGetRandom = (n: number) => {
|
||||||
|
const ret = new Uint8Array(n);
|
||||||
|
window.crypto.getRandomValues(ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getRandomBytes(n: number): ArrayBuffer {
|
||||||
|
return myGetRandom(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
const encTable = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
|
||||||
|
|
||||||
|
class EncodingError extends Error {
|
||||||
|
constructor() {
|
||||||
|
super("Encoding error");
|
||||||
|
Object.setPrototypeOf(this, EncodingError.prototype);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getValue(chr: string): number {
|
||||||
|
let a = chr;
|
||||||
|
switch (chr) {
|
||||||
|
case "O":
|
||||||
|
case "o":
|
||||||
|
a = "0;";
|
||||||
|
break;
|
||||||
|
case "i":
|
||||||
|
case "I":
|
||||||
|
case "l":
|
||||||
|
case "L":
|
||||||
|
a = "1";
|
||||||
|
break;
|
||||||
|
case "u":
|
||||||
|
case "U":
|
||||||
|
a = "V";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a >= "0" && a <= "9") {
|
||||||
|
return a.charCodeAt(0) - "0".charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (a >= "a" && a <= "z") a = a.toUpperCase();
|
||||||
|
let dec = 0;
|
||||||
|
if (a >= "A" && a <= "Z") {
|
||||||
|
if ("I" < a) dec++;
|
||||||
|
if ("L" < a) dec++;
|
||||||
|
if ("O" < a) dec++;
|
||||||
|
if ("U" < a) dec++;
|
||||||
|
return a.charCodeAt(0) - "A".charCodeAt(0) + 10 - dec;
|
||||||
|
}
|
||||||
|
throw new EncodingError();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function encodeCrock(data: ArrayBuffer): string {
|
||||||
|
const dataBytes = new Uint8Array(data);
|
||||||
|
let sb = "";
|
||||||
|
const size = data.byteLength;
|
||||||
|
let bitBuf = 0;
|
||||||
|
let numBits = 0;
|
||||||
|
let pos = 0;
|
||||||
|
while (pos < size || numBits > 0) {
|
||||||
|
if (pos < size && numBits < 5) {
|
||||||
|
const d = dataBytes[pos++];
|
||||||
|
bitBuf = (bitBuf << 8) | d;
|
||||||
|
numBits += 8;
|
||||||
|
}
|
||||||
|
if (numBits < 5) {
|
||||||
|
// zero-padding
|
||||||
|
bitBuf = bitBuf << (5 - numBits);
|
||||||
|
numBits = 5;
|
||||||
|
}
|
||||||
|
const v = (bitBuf >>> (numBits - 5)) & 31;
|
||||||
|
sb += encTable[v];
|
||||||
|
numBits -= 5;
|
||||||
|
}
|
||||||
|
return sb;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function decodeCrock(encoded: string): ArrayBuffer {
|
||||||
|
const size = encoded.length;
|
||||||
|
let bitpos = 0;
|
||||||
|
let bitbuf = 0;
|
||||||
|
let readPosition = 0;
|
||||||
|
const outLen = Math.floor((size * 5) / 8);
|
||||||
|
const out = new Int8Array(outLen);
|
||||||
|
let outPos = 0;
|
||||||
|
|
||||||
|
while (readPosition < size || bitpos > 0) {
|
||||||
|
//println("at position $readPosition with bitpos $bitpos")
|
||||||
|
if (readPosition < size) {
|
||||||
|
const v = getValue(encoded[readPosition++]);
|
||||||
|
bitbuf = (bitbuf << 5) | v;
|
||||||
|
bitpos += 5;
|
||||||
|
}
|
||||||
|
while (bitpos >= 8) {
|
||||||
|
const d = (bitbuf >>> (bitpos - 8)) & 0xff;
|
||||||
|
out[outPos++] = d;
|
||||||
|
bitpos -= 8;
|
||||||
|
}
|
||||||
|
if (readPosition == size && bitpos > 0) {
|
||||||
|
bitbuf = (bitbuf << (8 - bitpos)) & 0xff;
|
||||||
|
bitpos = bitbuf == 0 ? 0 : 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
25
src/logging.ts
Normal file
25
src/logging.ts
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
This file is part of TALER
|
||||||
|
(C) 2019 GNUnet e.V.
|
||||||
|
|
||||||
|
TALER is free software; you can redistribute it and/or modify it under the
|
||||||
|
terms of the GNU General Public License as published by the Free Software
|
||||||
|
Foundation; either version 3, or (at your option) any later version.
|
||||||
|
|
||||||
|
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
export class Logger {
|
||||||
|
constructor(private tag: string) {}
|
||||||
|
info(message: string, ...args: any[]) {
|
||||||
|
console.log(`${new Date().toISOString()} ${this.tag} INFO ` + message, ...args);
|
||||||
|
}
|
||||||
|
trace(message: string, ...args: any[]) {
|
||||||
|
console.log(`${new Date().toISOString()} ${this.tag} TRACE ` + message, ...args)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user