Skip to content

Commit 47261c3

Browse files
Merge pull request #9 from sentclose/sortable
added tests for sortable
2 parents 6262442 + 777eac0 commit 47261c3

File tree

7 files changed

+244
-14
lines changed

7 files changed

+244
-14
lines changed

package-lock.json

+9-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@sentclose/sentc",
3-
"version": "0.8.0",
3+
"version": "0.9.0",
44
"description": "End-to-end encryption sdk",
55
"repository": {
66
"type": "git",
@@ -48,7 +48,7 @@
4848
},
4949
"dependencies": {
5050
"idb": "^6.1.4",
51-
"sentc_wasm": "0.8.0"
51+
"sentc_wasm": "0.9.0"
5252
},
5353
"devDependencies": {
5454
"@joernheinemann/eslint-config-typescript": "1.0.0",

src/Enities.ts

+6
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ export interface GroupOutDataHmacKeys {
100100
key_data: string
101101
}
102102

103+
export interface GroupOutDataSortableKeys {
104+
group_key_id: string,
105+
key_data: string
106+
}
107+
103108
export interface GroupData
104109
{
105110
group_id: string,
@@ -116,6 +121,7 @@ export interface GroupData
116121
access_by_group_as_member?: string,
117122
is_connected_group: boolean,
118123
hmac_keys: string[],
124+
sortable_keys: string[],
119125
last_check_time: number,
120126
}
121127

src/Group.ts

+77-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
GroupKeyRotationOut,
1717
GroupList,
1818
GroupOutDataHmacKeys,
19-
GroupOutDataKeys,
19+
GroupOutDataKeys, GroupOutDataSortableKeys,
2020
GroupUserListItem,
2121
HttpMethod,
2222
KeyRotationInput,
@@ -33,7 +33,9 @@ import {
3333
group_create_child_group,
3434
group_create_connected_group,
3535
group_decrypt_hmac_key,
36-
group_decrypt_key, group_extract_group_data,
36+
group_decrypt_key,
37+
group_decrypt_sortable_key,
38+
group_extract_group_data,
3739
group_extract_group_key,
3840
group_extract_group_keys,
3941
group_finish_key_rotation,
@@ -48,7 +50,11 @@ import {
4850
group_prepare_update_rank,
4951
prepare_create_searchable,
5052
prepare_create_searchable_light,
51-
prepare_search
53+
prepare_search,
54+
sortable_encrypt_number,
55+
sortable_encrypt_raw_number,
56+
sortable_encrypt_raw_string,
57+
sortable_encrypt_string
5258
} from "sentc_wasm";
5359
import {Sentc} from "./Sentc";
5460
import {AbstractSymCrypto} from "./crypto/AbstractSymCrypto";
@@ -175,6 +181,7 @@ export async function getGroup(
175181
access_by_parent_group,
176182
is_connected_group: out.get_is_connected_group(),
177183
hmac_keys: [],
184+
sortable_keys: [],
178185
last_check_time: Date.now()
179186
};
180187

@@ -212,6 +219,12 @@ export async function getGroup(
212219
const decrypted_hmac_keys = await group_obj.decryptHmacKeys(hmac_keys);
213220
group_obj.data.hmac_keys = decrypted_hmac_keys;
214221
group_data.hmac_keys = decrypted_hmac_keys;
222+
223+
const sortable_keys = out.get_sortable_keys();
224+
225+
const decrypted_sortable_keys = await group_obj.decryptSortableKeys(sortable_keys);
226+
group_obj.data.sortable_keys = decrypted_sortable_keys;
227+
group_data.sortable_keys = decrypted_sortable_keys;
215228

216229
await Promise.all([
217230
//store the group data
@@ -1127,6 +1140,24 @@ export class Group extends AbstractSymCrypto
11271140
return keys;
11281141
}
11291142

1143+
public async decryptSortableKeys(fetchedKeys: GroupOutDataSortableKeys[])
1144+
{
1145+
const keys = [];
1146+
1147+
for (let i = 0; i < fetchedKeys.length; i++) {
1148+
const fetched_key = fetchedKeys[i];
1149+
1150+
// eslint-disable-next-line no-await-in-loop
1151+
const group_key = await this.getSymKeyById(fetched_key.group_key_id);
1152+
1153+
const decrypted_key = group_decrypt_sortable_key(group_key, fetched_key.key_data);
1154+
1155+
keys.push(decrypted_key);
1156+
}
1157+
1158+
return keys;
1159+
}
1160+
11301161
private prepareKeys(page = 0): [string, boolean]
11311162
{
11321163
return prepareKeys(this.data.keys, page);
@@ -1223,6 +1254,11 @@ export class Group extends AbstractSymCrypto
12231254
return this.data.hmac_keys[0];
12241255
}
12251256

1257+
getNewestSortableKey(): string
1258+
{
1259+
return this.data.sortable_keys[0];
1260+
}
1261+
12261262
//__________________________________________________________________________________________________________________
12271263

12281264
/**
@@ -1559,6 +1595,44 @@ export class Group extends AbstractSymCrypto
15591595
return handle_server_response(res);
15601596
}
15611597

1598+
//__________________________________________________________________________________________________________________
1599+
//sortable
1600+
1601+
public encryptSortableRawNumber(number: number)
1602+
{
1603+
const key = this.getNewestSortableKey();
1604+
1605+
return sortable_encrypt_raw_number(key, BigInt(number));
1606+
}
1607+
1608+
public encryptSortableNumber(number: number)
1609+
{
1610+
const key = this.getNewestSortableKey();
1611+
1612+
const out = sortable_encrypt_number(key, BigInt(number));
1613+
1614+
return [out.get_number(), out.get_alg(), out.get_key_id()];
1615+
}
1616+
1617+
public encryptSortableRawString(data: string)
1618+
{
1619+
const key = this.getNewestSortableKey();
1620+
1621+
return sortable_encrypt_raw_string(key, data);
1622+
}
1623+
1624+
public encryptSortableString(data: string)
1625+
{
1626+
const key = this.getNewestSortableKey();
1627+
1628+
const out = sortable_encrypt_string(key, data);
1629+
1630+
return [out.get_number(), out.get_alg(), out.get_key_id()];
1631+
}
1632+
1633+
//__________________________________________________________________________________________________________________
1634+
//content
1635+
15621636
public async fetchContent(data: {last_fetched_item?: ListContentItem, cat_id?: string, limit?: CONTENT_FETCH_LIMIT}): Promise<ListContentItem[]>
15631637
{
15641638
const {limit, cat_id, last_fetched_item} = data;

tests/integration/index.html

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
<script src="user/userTests.js"></script>
1818
<script src="group/groupTest.js"></script>
1919
<script src="group/groupTest2.js"></script>
20+
<script src="sortable/sortableTest.js"></script>
21+
<script src="sortable/sortableTest2.js"></script>
2022
<script src="file/fileTest.js"></script>
2123

2224
<script>
+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
describe("Sortable tests", () => {
2+
const username0 = "test0";
3+
const username1 = "test1";
4+
5+
const pw = "12345";
6+
7+
/** @type User */
8+
let user0, user1;
9+
10+
/** @type Group */
11+
let group, group_for_user_1;
12+
13+
const sentc = window.Sentc.default;
14+
15+
before(async () => {
16+
await sentc.init({
17+
app_token: "5zMb6zs3dEM62n+FxjBilFPp+j9e7YUFA+7pi6Hi",
18+
base_url: "http://127.0.0.1:3002"
19+
});
20+
21+
await sentc.register(username0, pw);
22+
23+
user0 = await sentc.login(username0, pw);
24+
25+
await sentc.register(username1, pw);
26+
27+
user1 = await sentc.login(username1, pw);
28+
});
29+
30+
it("should create a group", async function() {
31+
const group_id = await user0.createGroup();
32+
33+
group = await user0.getGroup(group_id);
34+
35+
chai.assert.equal(group.data.group_id, group_id);
36+
});
37+
38+
it("should invite the 2nd user in this group", async function() {
39+
await group.inviteAuto(user1.user_data.user_id);
40+
41+
group_for_user_1 = await user1.getGroup(group.data.group_id);
42+
});
43+
44+
let a, b, c;
45+
46+
it("should encrypt a number", function() {
47+
a = group.encryptSortableRawNumber(262);
48+
b = group.encryptSortableRawNumber(263);
49+
c = group.encryptSortableRawNumber(65321);
50+
51+
chai.assert.equal((a < b), true);
52+
chai.assert.equal((b < c), true);
53+
});
54+
55+
it("should get the same numbers as result back", function() {
56+
const a1 = group_for_user_1.encryptSortableRawNumber(262);
57+
const b1 = group_for_user_1.encryptSortableRawNumber(263);
58+
const c1 = group_for_user_1.encryptSortableRawNumber(65321);
59+
60+
chai.assert.equal((a1 < b1), true);
61+
chai.assert.equal((b1 < c1), true);
62+
63+
chai.assert.equal(a, a1);
64+
chai.assert.equal(b, b1);
65+
chai.assert.equal(c, c1);
66+
});
67+
68+
const str_values = ["a", "az", "azzz", "b", "ba", "baaa", "o", "oe", "z", "zaaa"];
69+
const encrypted_values = [];
70+
71+
it("should encrypt a string", function() {
72+
for (let i = 0; i < str_values.length; i++) {
73+
const v = str_values[i];
74+
75+
encrypted_values.push(group.encryptSortableRawString(v));
76+
}
77+
78+
//check the number
79+
let past_item = BigInt(0);
80+
81+
for (let i = 0; i < encrypted_values.length; i++) {
82+
const item = encrypted_values[i];
83+
84+
chai.assert.equal(past_item < item, true);
85+
past_item = item;
86+
}
87+
});
88+
89+
it("should encrypt the same values", function() {
90+
const new_values = [];
91+
92+
for (let i = 0; i < str_values.length; i++) {
93+
const v = str_values[i];
94+
95+
new_values.push(group_for_user_1.encryptSortableRawString(v));
96+
}
97+
98+
//check the number
99+
let past_item = BigInt(0);
100+
101+
for (let i = 0; i < new_values.length; i++) {
102+
const item = new_values[i];
103+
const check_item = encrypted_values[i];
104+
105+
chai.assert.equal(past_item < item, true);
106+
107+
chai.assert.equal(check_item, item);
108+
109+
past_item = item;
110+
}
111+
});
112+
113+
after(async () => {
114+
//clean up
115+
116+
await group.deleteGroup();
117+
118+
await user0.deleteUser(pw);
119+
await user1.deleteUser(pw);
120+
});
121+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
describe("Sortable test 2", () => {
2+
const sentc = window.Sentc.default;
3+
4+
before(async () => {
5+
await sentc.init({
6+
app_token: "5zMb6zs3dEM62n+FxjBilFPp+j9e7YUFA+7pi6Hi",
7+
base_url: "http://127.0.0.1:3002"
8+
});
9+
});
10+
11+
it("should generate the same numbers with same key", function() {
12+
//dummy group
13+
const group = new window.Sentc.Group({
14+
sortable_keys: [`{"Ope16":{"key":"5kGPKgLQKmuZeOWQyJ7vOg==","key_id":"1876b629-5795-471f-9704-0cac52eaf9a1"}}`]
15+
}, "", "", null);
16+
17+
const a = group.encryptSortableRawNumber(262);
18+
const b = group.encryptSortableRawNumber(263);
19+
const c = group.encryptSortableRawNumber(65321);
20+
21+
// eslint-disable-next-line no-console
22+
console.log(`a: ${a}, b: ${b}, c: ${c}`);
23+
24+
chai.assert.equal((a < b), true);
25+
chai.assert.equal((b < c), true);
26+
});
27+
});

0 commit comments

Comments
 (0)