File size: 2,460 Bytes
06242ba |
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cstdio>
#include "stc_extract_c.h"
// {{{ stc_extract()
int stc_extract(const u8 *vector, int vectorlength, u8 *message, int syndromelength, int matrixheight)
{
int i, j, k, index, index2, base, height;
u8 *binmat[2];
int *matrices, *widths;
height = matrixheight;
if(matrixheight > 31) {
fprintf(stderr, "Submatrix height must not exceed 31.");
return -1;
}
{
double invalpha;
int shorter, longer, worm;
u32 *columns[2];
matrices = (int *)malloc(syndromelength * sizeof(int));
widths = (int *)malloc(syndromelength * sizeof(int));
invalpha = (double)vectorlength / syndromelength;
if(invalpha < 1) {
fprintf(stderr, "The message cannot be longer than the cover object.\n");
return -1;
}
shorter = (int)floor(invalpha);
longer = (int)ceil(invalpha);
if((columns[0] = getMatrix(shorter, matrixheight)) == NULL) {
free(widths);
free(matrices);
return -1;
}
if((columns[1] = getMatrix(longer, matrixheight)) == NULL) {
free(columns[0]);
free(widths);
free(matrices);
return -1;
}
worm = 0;
for(i = 0; i < syndromelength; i++) {
if(worm + longer <= (i + 1) * invalpha + 0.5) {
matrices[i] = 1;
widths[i] = longer;
worm += longer;
} else {
matrices[i] = 0;
widths[i] = shorter;
worm += shorter;
}
}
binmat[0] = (u8*)malloc(shorter * matrixheight * sizeof(u8));
binmat[1] = (u8*)malloc(longer * matrixheight * sizeof(u8));
for(i = 0, index = 0; i < shorter; i++) {
for(j = 0; j < matrixheight; j++, index++) {
binmat[0][index] = (columns[0][i] & (1 << j)) ? 1 : 0;
}
}
for(i = 0, index = 0; i < longer; i++) {
for(j = 0; j < matrixheight; j++, index++) {
binmat[1][index] = (columns[1][i] & (1 << j)) ? 1 : 0;
}
}
free(columns[0]);
free(columns[1]);
}
for(i = 0; i < syndromelength; i++) {
message[i] = 0;
}
for(index = 0, index2 = 0; index2 < syndromelength; index2++) {
for(k = 0, base = 0; k < widths[index2]; k++, index++, base += matrixheight) {
if(vector[index]) {
for(i = 0; i < height; i++) {
message[index2 + i] ^= binmat[matrices[index2]][base + i];
}
}
}
if(syndromelength - index2 <= matrixheight)
height--;
}
free(matrices);
free(widths);
free(binmat[0]);
free(binmat[1]);
return 0;
}
// }}}
|