]> AND Private Git Repository - canny.git/blob - stc/exp/ml_stc_linux_make_v1.0/ml_stc_src/stc_extract.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
7da220578595b1850da9b9214a1827b59a67fd15
[canny.git] / stc / exp / ml_stc_linux_make_v1.0 / ml_stc_src / stc_extract.cpp
1 //\r
2 // MEX-File: dv_extract\r
3 // Usage:\r
4 // uint8 vector msg = dv_extract(uint8 vector stego, int scalar msgLength, int scalar constrLength = 10)\r
5 \r
6 typedef unsigned int u32;\r
7 typedef unsigned short u16;\r
8 typedef unsigned char u8;\r
9 \r
10 #include <cstdlib>\r
11 #include <cstring>\r
12 #include <cmath>\r
13 #include "mex.h"\r
14 #include "common.h"\r
15 \r
16 #define MATLAB_in_stego 0\r
17 #define MATLAB_in_msgLength 1\r
18 #define MATLAB_in_constrLength 2\r
19 \r
20 #define MATLAB_out_msg 0\r
21 \r
22 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])\r
23 {\r
24         int matrixheight, vectorlength, i, j, k, index, index2, syndromelength, matrixwidth, size[2], base, height;\r
25         \r
26         u8 *vector, *syndrome, *closestData, *ssedone, *stepdown, *binmat[2], *msgData;\r
27         int *matrices, *widths;\r
28 \r
29         mxArray *msg;\r
30 \r
31         if(nlhs == 0)\r
32                 return;\r
33 \r
34         if(nrhs < 2) {\r
35                 mexErrMsgTxt("Too few input parameters (2 or 3 expected)");\r
36                 return;\r
37         }\r
38         \r
39         if(!mxIsUint8(prhs[MATLAB_in_stego])) {\r
40                 mexErrMsgTxt("The stego vector must be of type uint8.");\r
41                 return;\r
42         }\r
43         vector = (u8*)mxGetPr(prhs[MATLAB_in_stego]);\r
44         vectorlength = (int)mxGetM(prhs[MATLAB_in_stego]);\r
45         \r
46         syndromelength = (int)mxGetScalar(prhs[MATLAB_in_msgLength]);\r
47 \r
48         if(nrhs > 2)\r
49                 matrixheight = (int)mxGetScalar(prhs[MATLAB_in_constrLength]);\r
50         else\r
51                 matrixheight = 10;\r
52 \r
53         // end of matlab interface\r
54 \r
55         height = matrixheight;\r
56 \r
57         if(matrixheight > 31) {\r
58                 mexErrMsgTxt("Submatrix height must not exceed 31.");\r
59                 return;\r
60         }\r
61 \r
62         {\r
63                 double invalpha;\r
64                 int shorter, longer, worm;\r
65                 u32 *columns[2];\r
66 \r
67                 matrices = (int *)malloc(syndromelength * sizeof(int));\r
68                 widths = (int *)malloc(syndromelength * sizeof(int));\r
69 \r
70                 invalpha = (double)vectorlength / syndromelength;\r
71                 if(invalpha < 1) {\r
72                         mexErrMsgTxt("The message cannot be longer than the cover object.\n");\r
73                         return;\r
74                 }\r
75                 shorter = (int)floor(invalpha);\r
76                 longer = (int)ceil(invalpha);\r
77                 if((columns[0] = getMatrix(shorter, matrixheight)) == NULL)\r
78                         return;\r
79                 if((columns[1] = getMatrix(longer, matrixheight)) == NULL)\r
80                         return;\r
81                 worm = 0;\r
82                 for(i = 0; i < syndromelength; i++) {\r
83                         if(worm + longer <= (i + 1) * invalpha + 0.5) {\r
84                                 matrices[i] = 1;\r
85                                 widths[i] = longer;\r
86                                 worm += longer;\r
87                         } else {\r
88                                 matrices[i] = 0;\r
89                                 widths[i] = shorter;\r
90                                 worm += shorter;\r
91                         }\r
92                 }\r
93                 binmat[0] = (u8*)malloc(shorter * matrixheight * sizeof(u8));\r
94                 binmat[1] = (u8*)malloc(longer * matrixheight * sizeof(u8));\r
95                 for(i = 0, index = 0; i < shorter; i++) {\r
96                         for(j = 0; j < matrixheight; j++, index++) {\r
97                                 binmat[0][index] = (columns[0][i] & (1 << j)) ? 1 : 0;\r
98                         }\r
99                 }\r
100                 for(i = 0, index = 0; i < longer; i++) {\r
101                         for(j = 0; j < matrixheight; j++, index++) {\r
102                                 binmat[1][index] = (columns[1][i] & (1 << j)) ? 1 : 0;\r
103                         }\r
104                 }\r
105                 free(columns[0]);\r
106                 free(columns[1]);\r
107         }\r
108 \r
109         size[0] = syndromelength;\r
110         size[1] = 1;\r
111         \r
112         msg = mxCreateNumericArray(2, size, mxUINT8_CLASS, mxREAL);\r
113         msgData = (u8*)mxGetPr(msg);\r
114 \r
115         for(i = 0; i < syndromelength; i++) {\r
116                 msgData[i] = 0;\r
117         }\r
118 \r
119         for(index = 0, index2 = 0; index2 < syndromelength; index2++) {\r
120                 for(k = 0, base = 0; k < widths[index2]; k++, index++, base += matrixheight) {\r
121                         if(vector[index]) {\r
122                                 for(i = 0; i < height; i++) {\r
123                                         msgData[index2 + i] ^= binmat[matrices[index2]][base + i];\r
124                                 }\r
125                         }\r
126                 }\r
127                 if(syndromelength - index2 <= matrixheight)\r
128                         height--;\r
129         }\r
130 \r
131         free(matrices);\r
132         free(widths);\r
133         free(binmat[0]);\r
134         free(binmat[1]);\r
135 \r
136         plhs[MATLAB_out_msg] = msg;\r
137 \r
138         return;\r
139 }\r