Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
munyanezaarmel authored Oct 22, 2024
2 parents 9ae86e2 + b1cd6a8 commit 04e3c77
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 38 deletions.
3 changes: 2 additions & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
node_modules/
node_modules/
src/lib/siphash.js
12 changes: 3 additions & 9 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 2 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "openpaygo",
"version": "0.0.3",
"version": "0.0.5",
"description": "OpenPAYGO Javascript library",
"main": "index.js",
"scripts": {
Expand Down Expand Up @@ -32,7 +32,6 @@
},
"dependencies": {
"bigint-conversion": "^2.4.3",
"buffer": "^6.0.3",
"siphash": "^1.1.0"
"buffer": "^6.0.3"
}
}
168 changes: 168 additions & 0 deletions src/lib/siphash.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
var SipHash = (function () {
"use strict";
function _add(a, b) {
var rl = a.l + b.l, a2 = {
h: a.h + b.h + (rl / 2 >>> 31) >>> 0,
l: rl >>> 0
};
a.h = a2.h;
a.l = a2.l;
}
function _xor(a, b) {
a.h ^= b.h;
a.h >>>= 0;
a.l ^= b.l;
a.l >>>= 0;
}
function _rotl(a, n) {
var a2 = {
h: a.h << n | a.l >>> (32 - n),
l: a.l << n | a.h >>> (32 - n)
};
a.h = a2.h;
a.l = a2.l;
}
function _rotl32(a) {
var al = a.l;
a.l = a.h;
a.h = al;
}
function _compress(v0, v1, v2, v3) {
_add(v0, v1);
_add(v2, v3);
_rotl(v1, 13);
_rotl(v3, 16);
_xor(v1, v0);
_xor(v3, v2);
_rotl32(v0);
_add(v2, v1);
_add(v0, v3);
_rotl(v1, 17);
_rotl(v3, 21);
_xor(v1, v2);
_xor(v3, v0);
_rotl32(v2);
}
function _get_int(a, offset) {
return a[offset + 3] << 24 |
a[offset + 2] << 16 |
a[offset + 1] << 8 |
a[offset];
}
function hash(key, m) {
if (typeof m === "string") {
m = string_to_u8(m);
}
var k0 = {
h: key[1] >>> 0,
l: key[0] >>> 0
}, k1 = {
h: key[3] >>> 0,
l: key[2] >>> 0
}, v0 = {
h: k0.h,
l: k0.l
}, v2 = k0, v1 = {
h: k1.h,
l: k1.l
}, v3 = k1, ml = m.length, ml7 = ml - 7, buf = new Uint8Array(new ArrayBuffer(8));
_xor(v0, {
h: 0x736f6d65,
l: 0x70736575
});
_xor(v1, {
h: 0x646f7261,
l: 0x6e646f6d
});
_xor(v2, {
h: 0x6c796765,
l: 0x6e657261
});
_xor(v3, {
h: 0x74656462,
l: 0x79746573
});
var mp = 0;
while (mp < ml7) {
var mi = {
h: _get_int(m, mp + 4),
l: _get_int(m, mp)
};
_xor(v3, mi);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_xor(v0, mi);
mp += 8;
}
buf[7] = ml;
var ic = 0;
while (mp < ml) {
buf[ic++] = m[mp++];
}
while (ic < 7) {
buf[ic++] = 0;
}
var mil = {
h: buf[7] << 24 | buf[6] << 16 | buf[5] << 8 | buf[4],
l: buf[3] << 24 | buf[2] << 16 | buf[1] << 8 | buf[0]
};
_xor(v3, mil);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_xor(v0, mil);
_xor(v2, {
h: 0,
l: 0xff
});
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
_compress(v0, v1, v2, v3);
var h = v0;
_xor(h, v1);
_xor(h, v2);
_xor(h, v3);
return h;
}
function hash_hex(key, m) {
var r = hash(key, m);
return ("0000000" + r.h.toString(16)).substr(-8) +
("0000000" + r.l.toString(16)).substr(-8);
}
function hash_uint(key, m) {
var r = hash(key, m);
return (r.h & 0x1fffff) * 0x100000000 + r.l;
}
function string_to_u8(str) {
if (typeof TextEncoder === "function") {
return new TextEncoder().encode(str);
}
str = unescape(encodeURIComponent(str));
var bytes = new Uint8Array(str.length);
for (var i = 0, j = str.length; i < j; i++) {
bytes[i] = str.charCodeAt(i);
}
return bytes;
}
function string16_to_key(str) {
var u8 = string_to_u8(str);
if (u8.length !== 16) {
throw Error("Key length must be 16 bytes");
}
var key = new Uint32Array(4);
key[0] = _get_int(u8, 0);
key[1] = _get_int(u8, 4);
key[2] = _get_int(u8, 8);
key[3] = _get_int(u8, 12);
return key;
}
return {
hash: hash,
hash_hex: hash_hex,
hash_uint: hash_uint,
string16_to_key: string16_to_key,
string_to_u8: string_to_u8
};
})();

module = module || {}, exports = module.exports = SipHash;
41 changes: 16 additions & 25 deletions src/token.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use strict"

const bigintConversion = require("bigint-conversion")
const siphash24 = require("siphash")
const siphash24 = require("./lib/siphash")
const Buffer = require("buffer/").Buffer

class OpenPAYGOTokenShared {
Expand Down Expand Up @@ -43,13 +43,9 @@ class OpenPAYGOTokenShared {
static convertHash2Token(hash) {
// convert hash from hex

const hashBuffer = bigintConversion.hexToBuf(hash)
const hashBuffer = bigintConversion.hexToBuf(hash, true)

const dView = new DataView(
hashBuffer.buffer,
hashBuffer.byteOffset,
hashBuffer.byteLength
)
const dView = new DataView(hashBuffer)

// take first 4 btypes
const hash_msb = dView.getUint32(0) // as big endian
Expand Down Expand Up @@ -85,14 +81,14 @@ class OpenPAYGOTokenShared {
static genHash({ key, msg }) {
let buf
if (typeof key === "object") {
buf = key
buf = key.buffer
} else {
buf = bigintConversion.hexToBuf(key)
buf = bigintConversion.hexToBuf(key, true)
}
const arrayBuffer = buf.buffer.slice(
buf.byteOffset,
buf.byteOffset + buf.byteLength
)

const uint32View = new Uint32Array(buf)

const arrayBuffer = buf.slice(0, uint32View.byteLength)
const uint32Array = new Uint32Array(arrayBuffer)
const hash = siphash24.hash_hex(uint32Array, msg)

Expand Down Expand Up @@ -136,13 +132,9 @@ class OpenPAYGOTokenSharedExtended {
static convertHash2Token(hash) {
// convert hash from hex

const hashBuffer = bigintConversion.hexToBuf(hash)
const hashBuffer = bigintConversion.hexToBuf(hash, true)

const dView = new DataView(
hashBuffer.buffer,
hashBuffer.byteOffset,
hashBuffer.byteLength
)
const dView = new DataView(hashBuffer)

// take first 4 btypes
const hash_msb = dView.getUint32(0) // as big endian
Expand Down Expand Up @@ -173,14 +165,13 @@ class OpenPAYGOTokenSharedExtended {
static genHash({ key, msg }) {
let buf
if (typeof key === "object") {
buf = key
buf = key.buffer
} else {
buf = bigintConversion.hexToBuf(key)
buf = bigintConversion.hexToBuf(key, true)
}
const arrayBuffer = buf.buffer.slice(
buf.byteOffset,
buf.byteOffset + buf.byteLength
)
const uint32View = new Uint32Array(buf)

const arrayBuffer = buf.slice(0, uint32View.byteLength)
const uint32Array = new Uint32Array(arrayBuffer)
const hash = siphash24.hash_hex(uint32Array, msg)

Expand Down
1 change: 1 addition & 0 deletions test/token.test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const tokenLib = require("../src/token").OpenPAYGOTokenShared
const bigintConversion = require("bigint-conversion")
const Buffer = require("buffer/").Buffer

describe("OpenPAYGOTokenShared test", () => {
test("OpenPAYGOTokenShared genHash", () => {
Expand Down

0 comments on commit 04e3c77

Please sign in to comment.