mirror of
https://github.com/zama-ai/tfhe-rs.git
synced 2026-01-09 14:47:56 -05:00
683 lines
24 KiB
JavaScript
683 lines
24 KiB
JavaScript
const test = require("node:test");
|
|
const assert = require("node:assert").strict;
|
|
const { performance } = require("perf_hooks");
|
|
const {
|
|
init_panic_hook,
|
|
ShortintParametersName,
|
|
ShortintParameters,
|
|
TfheClientKey,
|
|
TfhePublicKey,
|
|
TfheCompressedPublicKey,
|
|
TfheCompressedCompactPublicKey,
|
|
ShortintCompactPublicKeyEncryptionParametersName,
|
|
ShortintCompactPublicKeyEncryptionParameters,
|
|
TfheCompactPublicKey,
|
|
TfheConfigBuilder,
|
|
CompressedFheInt8,
|
|
FheInt8,
|
|
FheInt32,
|
|
FheTypes,
|
|
CompressedFheInt128,
|
|
FheInt128,
|
|
CompressedFheInt256,
|
|
FheInt256,
|
|
CompactCiphertextList,
|
|
ProvenCompactCiphertextList,
|
|
CompactPkeCrs,
|
|
ZkComputeLoad,
|
|
Shortint,
|
|
ShortintEncryptionKeyChoice,
|
|
} = require("../pkg/tfhe.js");
|
|
const { randomBytes } = require("node:crypto");
|
|
|
|
const I256_MIN = BigInt(
|
|
"-57896044618658097711785492504343953926634992332820282019728792003956564819968",
|
|
);
|
|
const I256_MAX = BigInt(
|
|
"28948022309329048855892746252171976963317496166410141009864396001978282409983",
|
|
);
|
|
const I128_MIN = BigInt("-170141183460469231731687303715884105728");
|
|
const I32_MIN = -2147483648;
|
|
|
|
// This is useful to debug test
|
|
init_panic_hook();
|
|
|
|
test("hlapi_client_key_encrypt_decrypt_int8_big", (t) => {
|
|
let config = TfheConfigBuilder.default().build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let clear = -73;
|
|
let encrypted = FheInt8.encrypt_with_client_key(clear, clientKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, clear);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt8.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, clear);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt8.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, clear);
|
|
});
|
|
|
|
test("hlapi_compressed_public_client_int8_big", (t) => {
|
|
let config = TfheConfigBuilder.default().build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let clear = -128;
|
|
let compressed_encrypted = CompressedFheInt8.encrypt_with_client_key(
|
|
clear,
|
|
clientKey,
|
|
);
|
|
let compressed_serialized = compressed_encrypted.serialize();
|
|
let compressed_deserialized = CompressedFheInt8.deserialize(
|
|
compressed_serialized,
|
|
);
|
|
let decompressed = compressed_deserialized.decompress();
|
|
|
|
let decrypted = decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, clear);
|
|
|
|
let compressed_safe_serialized = compressed_encrypted.safe_serialize(
|
|
BigInt(10000000),
|
|
);
|
|
let compressed_safe_deserialized = CompressedFheInt8.safe_deserialize(
|
|
compressed_safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_decompressed = compressed_safe_deserialized.decompress();
|
|
|
|
let safe_decrypted = safe_decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_decrypted, clear);
|
|
});
|
|
|
|
test("hlapi_public_key_encrypt_decrypt_int32_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let publicKey = TfhePublicKey.new(clientKey);
|
|
|
|
let encrypted = FheInt32.encrypt_with_public_key(I32_MIN, publicKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I32_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt32.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I32_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(1000000));
|
|
let safe_deserialized = FheInt32.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(1000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I32_MIN);
|
|
});
|
|
|
|
test("hlapi_decompress_public_key_then_encrypt_decrypt_int32_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
var startTime = performance.now();
|
|
let compressedPublicKey = TfheCompressedPublicKey.new(clientKey);
|
|
var endTime = performance.now();
|
|
|
|
let data = compressedPublicKey.serialize();
|
|
|
|
let publicKey = compressedPublicKey.decompress();
|
|
|
|
var startTime = performance.now();
|
|
let encrypted = FheInt32.encrypt_with_public_key(I32_MIN, publicKey);
|
|
var endTime = performance.now();
|
|
|
|
let ser = encrypted.serialize();
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I32_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt32.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I32_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt32.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I32_MIN);
|
|
});
|
|
|
|
test("hlapi_client_key_encrypt_decrypt_int128_big", (t) => {
|
|
let config = TfheConfigBuilder.default().build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let encrypted = FheInt128.encrypt_with_client_key(I128_MIN, clientKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I128_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt128.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I128_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt128.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I128_MIN);
|
|
|
|
// Compressed
|
|
let compressed_encrypted = CompressedFheInt128.encrypt_with_client_key(
|
|
I128_MIN,
|
|
clientKey,
|
|
);
|
|
let compressed_serialized = compressed_encrypted.serialize();
|
|
let compressed_deserialized = CompressedFheInt128.deserialize(
|
|
compressed_serialized,
|
|
);
|
|
let decompressed = compressed_deserialized.decompress();
|
|
|
|
decrypted = decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I128_MIN);
|
|
|
|
let compressed_safe_serialized = compressed_encrypted.safe_serialize(
|
|
BigInt(10000000),
|
|
);
|
|
let compressed_safe_deserialized = CompressedFheInt128.safe_deserialize(
|
|
compressed_safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_decompressed = compressed_safe_deserialized.decompress();
|
|
|
|
safe_decrypted = safe_decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_decrypted, I128_MIN);
|
|
});
|
|
|
|
test("hlapi_client_key_encrypt_decrypt_int128_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let encrypted = FheInt128.encrypt_with_client_key(I128_MIN, clientKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I128_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt128.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I128_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt128.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I128_MIN);
|
|
|
|
// Compressed
|
|
let compressed_encrypted = CompressedFheInt128.encrypt_with_client_key(
|
|
I128_MIN,
|
|
clientKey,
|
|
);
|
|
let compressed_serialized = compressed_encrypted.serialize();
|
|
let compressed_deserialized = CompressedFheInt128.deserialize(
|
|
compressed_serialized,
|
|
);
|
|
let decompressed = compressed_deserialized.decompress();
|
|
|
|
decrypted = decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I128_MIN);
|
|
|
|
let compressed_safe_serialized = compressed_encrypted.safe_serialize(
|
|
BigInt(10000000),
|
|
);
|
|
let compressed_safe_deserialized = CompressedFheInt128.safe_deserialize(
|
|
compressed_safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_decompressed = compressed_safe_deserialized.decompress();
|
|
|
|
safe_decrypted = safe_decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_decrypted, I128_MIN);
|
|
});
|
|
|
|
test("hlapi_client_key_encrypt_decrypt_int256_big", (t) => {
|
|
let config = TfheConfigBuilder.default().build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let round_trip_encrypt = (value) => {
|
|
let encrypted = FheInt256.encrypt_with_client_key(value, clientKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, value);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt256.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, value);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt256.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, value);
|
|
|
|
// Compressed
|
|
let compressed_encrypted = CompressedFheInt256.encrypt_with_client_key(
|
|
value,
|
|
clientKey,
|
|
);
|
|
let compressed_serialized = compressed_encrypted.serialize();
|
|
let compressed_deserialized = CompressedFheInt256.deserialize(
|
|
compressed_serialized,
|
|
);
|
|
let decompressed = compressed_deserialized.decompress();
|
|
|
|
decrypted = decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, value);
|
|
|
|
let compressed_safe_serialized = compressed_encrypted.safe_serialize(
|
|
BigInt(10000000),
|
|
);
|
|
let compressed_safe_deserialized = CompressedFheInt256.safe_deserialize(
|
|
compressed_safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_decompressed = compressed_safe_deserialized.decompress();
|
|
|
|
safe_decrypted = safe_decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_decrypted, value);
|
|
};
|
|
|
|
round_trip_encrypt(I256_MIN);
|
|
round_trip_encrypt(I256_MAX);
|
|
round_trip_encrypt(BigInt(-1));
|
|
round_trip_encrypt(BigInt(1));
|
|
round_trip_encrypt(BigInt(-128));
|
|
round_trip_encrypt(BigInt(128));
|
|
});
|
|
|
|
test("hlapi_client_key_encrypt_decrypt_int256_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
|
|
let round_trip_encrypt = (value) => {
|
|
let encrypted = FheInt256.encrypt_with_client_key(value, clientKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, value);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt256.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, value);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt256.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, value);
|
|
|
|
// Compressed
|
|
let compressed_encrypted = CompressedFheInt256.encrypt_with_client_key(
|
|
value,
|
|
clientKey,
|
|
);
|
|
let compressed_serialized = compressed_encrypted.serialize();
|
|
let compressed_deserialized = CompressedFheInt256.deserialize(
|
|
compressed_serialized,
|
|
);
|
|
let decompressed = compressed_deserialized.decompress();
|
|
|
|
decrypted = decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, value);
|
|
|
|
let compressed_safe_serialized = compressed_encrypted.safe_serialize(
|
|
BigInt(10000000),
|
|
);
|
|
let compressed_safe_deserialized = CompressedFheInt256.safe_deserialize(
|
|
compressed_safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_decompressed = compressed_safe_deserialized.decompress();
|
|
|
|
safe_decrypted = safe_decompressed.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_decrypted, value);
|
|
};
|
|
|
|
round_trip_encrypt(I256_MIN);
|
|
round_trip_encrypt(I256_MAX);
|
|
round_trip_encrypt(BigInt(-1));
|
|
round_trip_encrypt(BigInt(1));
|
|
round_trip_encrypt(BigInt(-128));
|
|
round_trip_encrypt(BigInt(128));
|
|
});
|
|
|
|
test("hlapi_decompress_public_key_then_encrypt_decrypt_int256_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let compressedPublicKey = TfheCompressedPublicKey.new(clientKey);
|
|
let publicKey = compressedPublicKey.decompress();
|
|
|
|
let encrypted = FheInt256.encrypt_with_public_key(I256_MIN, publicKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I256_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt256.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I256_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt256.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I256_MIN);
|
|
});
|
|
|
|
test("hlapi_public_key_encrypt_decrypt_int256_small", (t) => {
|
|
let params_name_small =
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_PBS_KS_GAUSSIAN_2M128;
|
|
let params_small = new ShortintParameters(params_name_small);
|
|
let config = TfheConfigBuilder.with_custom_parameters(params_small).build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let publicKey = TfhePublicKey.new(clientKey);
|
|
|
|
let encrypted = FheInt256.encrypt_with_public_key(I256_MIN, publicKey);
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I256_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt256.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I256_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt256.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I256_MIN);
|
|
});
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/// 32 bits compact
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
function hlapi_compact_public_key_encrypt_decrypt_int32_single(config) {
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let publicKey = TfheCompactPublicKey.new(clientKey);
|
|
|
|
let builder = CompactCiphertextList.builder(publicKey);
|
|
builder.push_i32(I32_MIN);
|
|
let list = builder.build();
|
|
let expander = list.expand();
|
|
let encrypted = expander.get_int32(0);
|
|
|
|
let decrypted = encrypted.decrypt(clientKey);
|
|
assert.deepStrictEqual(decrypted, I32_MIN);
|
|
|
|
let serialized = encrypted.serialize();
|
|
let deserialized = FheInt32.deserialize(serialized);
|
|
let deserialized_decrypted = deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(deserialized_decrypted, I32_MIN);
|
|
|
|
let safe_serialized = encrypted.safe_serialize(BigInt(10000000));
|
|
let safe_deserialized = FheInt32.safe_deserialize(
|
|
safe_serialized,
|
|
BigInt(10000000),
|
|
);
|
|
let safe_deserialized_decrypted = safe_deserialized.decrypt(clientKey);
|
|
assert.deepStrictEqual(safe_deserialized_decrypted, I32_MIN);
|
|
}
|
|
|
|
test("hlapi_compact_public_key_encrypt_decrypt_int32_big_single", (t) => {
|
|
const block_params = new ShortintParameters(
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_KS_PBS_GAUSSIAN_2M128,
|
|
);
|
|
let config = TfheConfigBuilder.default()
|
|
.use_custom_parameters(block_params)
|
|
.build();
|
|
|
|
hlapi_compact_public_key_encrypt_decrypt_int32_single(config);
|
|
});
|
|
|
|
test("hlapi_compact_public_key_encrypt_decrypt_int32_small_single", (t) => {
|
|
const block_params = new ShortintParameters(
|
|
ShortintParametersName.V1_5_PARAM_MESSAGE_2_CARRY_2_COMPACT_PK_PBS_KS_GAUSSIAN_2M128,
|
|
);
|
|
let config = TfheConfigBuilder.default()
|
|
.use_custom_parameters(block_params)
|
|
.build();
|
|
|
|
hlapi_compact_public_key_encrypt_decrypt_int32_single(config);
|
|
});
|
|
|
|
function generateRandomBigInt(bitLength) {
|
|
const bytesNeeded = Math.ceil(bitLength / 8);
|
|
const randomBytesBuffer = randomBytes(bytesNeeded);
|
|
|
|
// Convert random bytes to BigInt
|
|
const randomBigInt = BigInt(`0x${randomBytesBuffer.toString("hex")}`);
|
|
|
|
return randomBigInt;
|
|
}
|
|
|
|
test("hlapi_compact_ciphertext_list", (t) => {
|
|
let config = TfheConfigBuilder.default().build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let publicKey = TfheCompactPublicKey.new(clientKey);
|
|
|
|
let clear_u2 = 3;
|
|
let clear_i32 = -3284;
|
|
let clear_bool = true;
|
|
let clear_u256 = generateRandomBigInt(256);
|
|
let clear_u2048 = generateRandomBigInt(2048);
|
|
|
|
let builder = CompactCiphertextList.builder(publicKey);
|
|
builder.push_u2(clear_u2);
|
|
builder.push_i32(clear_i32);
|
|
builder.push_boolean(clear_bool);
|
|
builder.push_u256(clear_u256);
|
|
builder.push_u2048(clear_u2048);
|
|
let list = builder.build();
|
|
|
|
let serialized = list.safe_serialize(BigInt(10000000));
|
|
let deserialized = CompactCiphertextList.safe_deserialize(
|
|
serialized,
|
|
BigInt(10000000),
|
|
);
|
|
|
|
assert.deepStrictEqual(deserialized.is_empty(), false);
|
|
assert.deepStrictEqual(deserialized.len(), 5);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(0), FheTypes.Uint2);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(1), FheTypes.Int32);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(2), FheTypes.Bool);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(3), FheTypes.Uint256);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(4), FheTypes.Uint2048);
|
|
|
|
let expander = deserialized.expand();
|
|
|
|
assert.deepStrictEqual(expander.is_empty(), false);
|
|
assert.deepStrictEqual(expander.len(), 5);
|
|
assert.deepStrictEqual(expander.get_kind_of(0), FheTypes.Uint2);
|
|
assert.deepStrictEqual(expander.get_kind_of(1), FheTypes.Int32);
|
|
assert.deepStrictEqual(expander.get_kind_of(2), FheTypes.Bool);
|
|
assert.deepStrictEqual(expander.get_kind_of(3), FheTypes.Uint256);
|
|
assert.deepStrictEqual(expander.get_kind_of(4), FheTypes.Uint2048);
|
|
|
|
assert.deepStrictEqual(expander.get_uint2(0).decrypt(clientKey), clear_u2);
|
|
|
|
assert.deepStrictEqual(expander.get_int32(1).decrypt(clientKey), clear_i32);
|
|
|
|
assert.deepStrictEqual(expander.get_bool(2).decrypt(clientKey), clear_bool);
|
|
|
|
assert.deepStrictEqual(
|
|
expander.get_uint256(3).decrypt(clientKey),
|
|
clear_u256,
|
|
);
|
|
|
|
assert.deepStrictEqual(
|
|
expander.get_uint2048(4).decrypt(clientKey),
|
|
clear_u2048,
|
|
);
|
|
});
|
|
|
|
test("hlapi_compact_ciphertext_list_with_proof", (t) => {
|
|
const block_params = new ShortintParameters(
|
|
ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
|
);
|
|
let publicKeyParams = new ShortintCompactPublicKeyEncryptionParameters(
|
|
ShortintCompactPublicKeyEncryptionParametersName.PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
|
);
|
|
|
|
let config = TfheConfigBuilder.default()
|
|
.use_custom_parameters(block_params)
|
|
.use_dedicated_compact_public_key_parameters(publicKeyParams)
|
|
.build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let publicKey = TfheCompactPublicKey.new(clientKey);
|
|
|
|
let crs = CompactPkeCrs.from_config(config, 2 + 32 + 1 + 256);
|
|
|
|
const compress = false; // We don't compress as it's too slow on wasm
|
|
let serialized_pke_crs = crs.serialize(compress);
|
|
let validate = false; // Also too slow on wasm
|
|
crs = CompactPkeCrs.deserialize(serialized_pke_crs, compress, validate);
|
|
|
|
let clear_u2 = 3;
|
|
let clear_i32 = -3284;
|
|
let clear_bool = true;
|
|
let clear_u256 = generateRandomBigInt(256);
|
|
|
|
let builder = CompactCiphertextList.builder(publicKey);
|
|
builder.push_u2(clear_u2);
|
|
builder.push_i32(clear_i32);
|
|
builder.push_boolean(clear_bool);
|
|
builder.push_u256(clear_u256);
|
|
let list = builder.build_with_proof_packed(crs, ZkComputeLoad.Proof);
|
|
|
|
let serialized = list.safe_serialize(BigInt(10000000));
|
|
let deserialized = ProvenCompactCiphertextList.safe_deserialize(
|
|
serialized,
|
|
BigInt(10000000),
|
|
);
|
|
|
|
assert.deepStrictEqual(deserialized.is_empty(), false);
|
|
assert.deepStrictEqual(deserialized.len(), 4);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(0), FheTypes.Uint2);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(1), FheTypes.Int32);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(2), FheTypes.Bool);
|
|
assert.deepStrictEqual(deserialized.get_kind_of(3), FheTypes.Uint256);
|
|
|
|
// Verifying and expanding is too slow for single threaded node tests.
|
|
});
|
|
|
|
test("hlapi_compact_pk_conformance", (t) => {
|
|
const limit = BigInt(1 << 20);
|
|
|
|
let blockParams = new ShortintParameters(
|
|
ShortintParametersName.PARAM_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
|
);
|
|
let publicKeyParams = new ShortintCompactPublicKeyEncryptionParameters(
|
|
ShortintCompactPublicKeyEncryptionParametersName.PARAM_PKE_MESSAGE_2_CARRY_2_KS_PBS_TUNIFORM_2M128,
|
|
);
|
|
|
|
let config = TfheConfigBuilder.default()
|
|
.use_custom_parameters(blockParams)
|
|
.use_dedicated_compact_public_key_parameters(publicKeyParams)
|
|
.build();
|
|
|
|
let clientKey = TfheClientKey.generate(config);
|
|
let compressedPublicKey = TfheCompressedCompactPublicKey.new(clientKey);
|
|
|
|
let serializedCompressedPublicKey = compressedPublicKey.safe_serialize(limit);
|
|
let _compressedPublicKey =
|
|
TfheCompressedCompactPublicKey.safe_deserialize_conformant(
|
|
serializedCompressedPublicKey,
|
|
limit,
|
|
publicKeyParams,
|
|
);
|
|
|
|
let publicKey = compressedPublicKey.decompress();
|
|
let serializedPublicKey = publicKey.safe_serialize(limit);
|
|
let _publicKey = TfheCompactPublicKey.safe_deserialize_conformant(
|
|
serializedPublicKey,
|
|
limit,
|
|
publicKeyParams,
|
|
);
|
|
|
|
const message_modulus = BigInt(4);
|
|
const carry_modulus = BigInt(4);
|
|
const modulus_pow_2_exponent = 64;
|
|
const ks_level = 5;
|
|
const ks_base_log = 3;
|
|
let incorrectPublicKeyParams =
|
|
ShortintCompactPublicKeyEncryptionParameters.new_parameters(
|
|
512,
|
|
Shortint.try_new_t_uniform(42),
|
|
message_modulus,
|
|
carry_modulus,
|
|
modulus_pow_2_exponent,
|
|
ks_base_log,
|
|
ks_level,
|
|
ShortintEncryptionKeyChoice.Small,
|
|
);
|
|
|
|
assert.throws(() => {
|
|
let _compressedPublicKey =
|
|
TfheCompressedCompactPublicKey.safe_deserialize_conformant(
|
|
serializedCompressedPublicKey,
|
|
limit,
|
|
incorrectPublicKeyParams,
|
|
);
|
|
});
|
|
|
|
assert.throws(() => {
|
|
let _publicKey = TfheCompactPublicKey.safe_deserialize_conformant(
|
|
serializedPublicKey,
|
|
limit,
|
|
incorrectPublicKeyParams,
|
|
);
|
|
});
|
|
});
|