Pull fix from branch_1_1, so proxied EAP replies work
[freeradius.git] / src / modules / rlm_eap / types / rlm_eap_psk / CTR.h
1 /*\r
2  * CTR.h\r
3  *\r
4  * The counter (CTR) mode of operation for block ciphers.\r
5  *\r
6  * @author Paulo S. L. M. Barreto\r
7  *\r
8  * This software is hereby placed in the public domain.\r
9  *\r
10  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS\r
11  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
13  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE\r
14  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\r
15  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\r
16  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\r
17  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\r
18  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\r
19  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
20  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
21  */\r
22 #ifndef __CTR_H\r
23 #define __CTR_H\r
24 \r
25 #include <freeradius-devel/ident.h>\r
26 RCSIDH(CTR_h, "$Id$")\r
27 \r
28 #include "BlockCipher.h"\r
29 \r
30 #ifndef USUAL_TYPES\r
31 #define USUAL_TYPES\r
32 typedef unsigned char   byte;\r
33 typedef unsigned long   uint;   /* assuming sizeof(uint) == 4 */\r
34 #endif /* USUAL_TYPES */\r
35 \r
36 class CTR {\r
37 public:\r
38 \r
39     CTR(BlockCipher* E);\r
40     virtual ~CTR();\r
41 \r
42     /**\r
43      * Start encrypting/decrypting a message using a given nonce.\r
44      *\r
45      * @param   N   the normalized nonce (initial counter value)\r
46      */\r
47     void init(const byte* N);\r
48 \r
49     /**\r
50      * Either encrypt or decrypt a message chunk.\r
51      *\r
52      * @param   M   message chunk\r
53      * @param   m   its length in bytes\r
54      * @param   C   the resulting encrypted/decrypted message chunk\r
55      */\r
56     void update(const byte* M, uint m, byte* C);\r
57 \r
58 private:\r
59     BlockCipher *E; // block cipher context\r
60     uint block_size;\r
61     byte* N;        // CTR counter  (block_size bytes)\r
62     byte* S;        // CTR mask     (block_size bytes)\r
63     uint s;         // available mask bytes on S\r
64 };\r
65 \r
66 #endif /* __CTR_H */\r
67 \r