add new header ident.h
[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 "BlockCipher.h"\r
26 \r
27 #ifndef USUAL_TYPES\r
28 #define USUAL_TYPES\r
29 typedef unsigned char   byte;\r
30 typedef unsigned long   uint;   /* assuming sizeof(uint) == 4 */\r
31 #endif /* USUAL_TYPES */\r
32 \r
33 class CTR {\r
34 public:\r
35 \r
36     CTR(BlockCipher* E);\r
37     virtual ~CTR();\r
38 \r
39     /**\r
40      * Start encrypting/decrypting a message using a given nonce.\r
41      *\r
42      * @param   N   the normalized nonce (initial counter value)\r
43      */\r
44     void init(const byte* N);\r
45 \r
46     /**\r
47      * Either encrypt or decrypt a message chunk.\r
48      *\r
49      * @param   M   message chunk\r
50      * @param   m   its length in bytes\r
51      * @param   C   the resulting encrypted/decrypted message chunk\r
52      */\r
53     void update(const byte* M, uint m, byte* C);\r
54 \r
55 private:\r
56     BlockCipher *E; // block cipher context\r
57     uint block_size;\r
58     byte* N;        // CTR counter  (block_size bytes)\r
59     byte* S;        // CTR mask     (block_size bytes)\r
60     uint s;         // available mask bytes on S\r
61 };\r
62 \r
63 #endif /* __CTR_H */\r
64 \r