forked from nankaicyber/NKDBsec
130 lines
4.2 KiB
C++
130 lines
4.2 KiB
C++
#include "emp-tool/emp-tool.h"
|
|
#include <iostream>
|
|
|
|
using namespace std;
|
|
using namespace emp;
|
|
|
|
|
|
// try hashing a fairly arbitrary byte string and see if we get the right value.
|
|
int hash_in_circuit(){
|
|
|
|
uint8_t input[2000];
|
|
uint8_t output_bytes[2000];
|
|
uint8_t output_bytes2[2000];
|
|
uint8_t decrypted_bytes[2000];
|
|
for (size_t i = 0; i < 2000; ++i) {
|
|
input[i] = i % 200;
|
|
}
|
|
__m128i key;
|
|
__m128i iv;
|
|
for (size_t i = 0; i < 16; ++i) {
|
|
((uint8_t *)(&key))[i] = (1337 * i) % 255;
|
|
((uint8_t *)(&iv))[i] = (31 * i) % 253;
|
|
}
|
|
|
|
|
|
emp::aes_128_ctr(key, iv, input, output_bytes, 2000, 77777);
|
|
|
|
// let's make sure we can decrypt this
|
|
emp::aes_128_ctr(key, iv, output_bytes, decrypted_bytes, 2000, 77777);
|
|
for(size_t i=0; i<2000; ++i) {
|
|
if (input[i] != decrypted_bytes[i]) {
|
|
std::cerr << "decryption did not match input\n" << std::flush;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
std::cout << "in memory: ";
|
|
for (size_t i = 0; i < 32; ++i) {
|
|
std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)(output_bytes[1000 + i]) << " ";
|
|
}
|
|
|
|
|
|
// now to do the same thing in circuit
|
|
emp::AES_128_CTR_Calculator aes_128_ctr_calculator = emp::AES_128_CTR_Calculator();
|
|
emp::Integer input_integer = emp::Integer(2000 * 8, input, emp::PUBLIC);
|
|
emp::Integer output_integer = emp::Integer(2000 * 8, input, emp::PUBLIC);
|
|
emp::Integer iv_integer = emp::Integer(128, &iv, emp::PUBLIC);
|
|
emp::Integer key_integer = emp::Integer(128, &key, emp::PUBLIC);
|
|
|
|
aes_128_ctr_calculator.aes_128_ctr(&(key_integer[0].bit),
|
|
&(iv_integer[0].bit),
|
|
&(input_integer[0].bit),
|
|
&(output_integer[0].bit),
|
|
2000 * 8,
|
|
emp::PUBLIC,
|
|
77777);
|
|
|
|
output_integer.reveal<uint8_t>(output_bytes2, PUBLIC);
|
|
std::cout << "\nin circuit: ";
|
|
for (size_t i = 0; i < 32; ++i) {
|
|
std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)(output_bytes2[1000 + i]) << " ";
|
|
}
|
|
|
|
// let's make sure the circuit output matches the in-memory output.
|
|
for(size_t i=0; i<2000; ++i) {
|
|
if (output_bytes[i] != output_bytes2[i]) {
|
|
std::cerr << "aes did not match in and out of circuit\n" << std::flush;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
// now with the out-of-circuit IV.
|
|
aes_128_ctr_calculator.aes_128_ctr(&(key_integer[0].bit),
|
|
iv,
|
|
&(input_integer[0].bit),
|
|
&(output_integer[0].bit),
|
|
2000 * 8,
|
|
emp::PUBLIC,
|
|
77777);
|
|
|
|
output_integer.reveal<uint8_t>(output_bytes2, PUBLIC);
|
|
std::cout << "\nin circuit2:";
|
|
for (size_t i = 0; i < 32; ++i) {
|
|
std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)(output_bytes2[1000 + i]) << " ";
|
|
}
|
|
|
|
// let's make sure the circuit output matches the in-memory output.
|
|
for(size_t i=0; i<2000; ++i) {
|
|
if (output_bytes[i] != output_bytes2[i]) {
|
|
std::cerr << "aes did not match in and out of circuit\n" << std::flush;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
// now with the out-of-circuit key and IV.
|
|
aes_128_ctr_calculator.aes_128_ctr(key,
|
|
iv,
|
|
&(input_integer[0].bit),
|
|
&(output_integer[0].bit),
|
|
2000 * 8,
|
|
emp::PUBLIC,
|
|
77777);
|
|
|
|
output_integer.reveal<uint8_t>(output_bytes2, PUBLIC);
|
|
std::cout << "\nin circuit3:";
|
|
for (size_t i = 0; i < 32; ++i) {
|
|
std::cout << std::setw(2) << std::setfill('0') << std::hex << (int)(output_bytes2[1000 + i]) << " ";
|
|
}
|
|
std::cout << "\n";
|
|
|
|
// let's make sure the circuit output matches the in-memory output.
|
|
for(size_t i=0; i<2000; ++i) {
|
|
if (output_bytes[i] != output_bytes2[i]) {
|
|
std::cerr << "aes did not match in and out of circuit\n" << std::flush;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
setup_plain_prot(false, "");
|
|
hash_in_circuit();
|
|
finalize_plain_prot();
|
|
return 0;
|
|
}
|