-rw-r--r-- 1567 cryptattacktester-20231020/subset.h raw
#ifndef SUBSET_H
#define SUBSET_H
#include "bigint.h"
#include "bit_vector.h"
static inline void subset(vector<vector<bit>> &L_sum,
vector<vector<vector<bit>>> &L_set,
bigint m, bigint n, const bigint idx_bits,
const vector<bit> &s,
const vector<vector<bit>> &H,
vector<bigint> prefix = vector<bigint>(0),
vector<vector<bit>> precomputed = vector<vector<bit>>(0))
{
if (precomputed.size() == 0)
{
precomputed.push_back(H.at(0));
for (bigint i = 1; i < n; i++)
precomputed.push_back(bit_vector_xor(H.at(i), precomputed.at(i-1)));
}
if (n == 0 || n == m)
{
// computing subset set at the LE positions
vector<bigint> set = prefix;
vector<bit> s_new = s;
if (n == m)
{
if (n) bit_vector_ixor(s_new, precomputed.at(n-1));
for (bigint i = n-1; i >= 0; i--)
{
set.push_back(i);
// bit_vector_ixor(s_new, H.at(i));
}
}
vector<vector<bit>> v_set(0);
for (bigint i = 0; i < set.size(); i++)
v_set.push_back(bit_vector_from_integer(set.at(i), idx_bits));
L_sum.push_back(s_new);
L_set.push_back(v_set);
return;
}
vector<bit> s_new = s;
subset(L_sum, L_set, n, n, idx_bits, s_new, H, prefix, precomputed);
for (bigint i = n; i < m; i++)
{
vector<bigint> prefix_new = prefix;
prefix_new.push_back(i);
vector<bit> s_new = bit_vector_xor(s, H.at(i));
subset(L_sum, L_set, i, n-1, idx_bits, s_new, H, prefix_new, precomputed);
}
}
#endif