blob: a5438666d57e0c2557dea4832d652cda415a7411 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/**
* (C) Copyright Projet SECRET, INRIA, Rocquencourt
* (C) Bhaskar Biswas and Nicolas Sendrier
*
* (C) 2014 cryptosource GmbH
* (C) 2014 Falko Strenzke fstrenzke@cryptosource.de
*
* Distributed under the terms of the Botan license
*
*/
#ifndef BOTAN_BINARY_MATRIX_H__
#define BOTAN_BINARY_MATRIX_H__
#include <botan/secmem.h>
namespace Botan {
#define BITS_PER_U32 (8 * sizeof (u32bit))
struct binary_matrix
{
public:
binary_matrix(u32bit m_rown, u32bit m_coln);
void row_xor(u32bit a, u32bit b);
secure_vector<int> row_reduced_echelon_form();
/**
* return the coefficient out of F_2
*/
u32bit coef(u32bit i, u32bit j)
{
return (m_elem[(i) * m_rwdcnt + (j) / BITS_PER_U32] >> (j % BITS_PER_U32)) & 1;
};
void set_coef_to_one(u32bit i, u32bit j)
{
m_elem[(i) * m_rwdcnt + (j) / BITS_PER_U32] |= (1UL << ((j) % BITS_PER_U32)) ;
};
void toggle_coeff(u32bit i, u32bit j)
{
m_elem[(i) * m_rwdcnt + (j) / BITS_PER_U32] ^= (1UL << ((j) % BITS_PER_U32)) ;
}
void set_to_zero()
{
std::memset(&m_elem[0], 0, m_alloc_size);
}
u32bit m_rown; // number of rows.
u32bit m_coln; // number of columns.
u32bit m_rwdcnt; // number of words in a row
u32bit m_alloc_size; // number of allocated bytes
std::vector<u32bit> m_elem;
};
}
#endif
|