1 /*
2  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
8  */
10 #define idea_mul(r,a,b,ul) \
11 ul=(unsigned long)a*b; \
12 if (ul != 0) \
13         { \
14         r=(ul&0xffff)-(ul>>16); \
15         r-=((r)>>16); \
16         } \
17 else \
18         r=(-(int)a-b+1);        /* assuming a or b is 0 and in range */
20 /* NOTE - c is not incremented as per n2l */
21 #define n2ln(c,l1,l2,n) { \
22                         c+=n; \
23                         l1=l2=0; \
24                         switch (n) { \
25                         case 8: l2 =((unsigned long)(*(--(c))))    ; \
26                         /* fall thru */                              \
27                         case 7: l2|=((unsigned long)(*(--(c))))<< 8; \
28                         /* fall thru */                              \
29                         case 6: l2|=((unsigned long)(*(--(c))))<<16; \
30                         /* fall thru */                              \
31                         case 5: l2|=((unsigned long)(*(--(c))))<<24; \
32                         /* fall thru */                              \
33                         case 4: l1 =((unsigned long)(*(--(c))))    ; \
34                         /* fall thru */                              \
35                         case 3: l1|=((unsigned long)(*(--(c))))<< 8; \
36                         /* fall thru */                              \
37                         case 2: l1|=((unsigned long)(*(--(c))))<<16; \
38                         /* fall thru */                              \
39                         case 1: l1|=((unsigned long)(*(--(c))))<<24; \
40                                 } \
41                         }
43 /* NOTE - c is not incremented as per l2n */
44 #define l2nn(l1,l2,c,n) { \
45                         c+=n; \
46                         switch (n) { \
47                         case 8: *(--(c))=(unsigned char)(((l2)    )&0xff); \
48                         /* fall thru */                                    \
49                         case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
50                         /* fall thru */                                    \
51                         case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
52                         /* fall thru */                                    \
53                         case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
54                         /* fall thru */                                    \
55                         case 4: *(--(c))=(unsigned char)(((l1)    )&0xff); \
56                         /* fall thru */                                    \
57                         case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
58                         /* fall thru */                                    \
59                         case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
60                         /* fall thru */                                    \
61                         case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
62                                 } \
63                         }
65 #undef n2l
66 #define n2l(c,l)        (l =((unsigned long)(*((c)++)))<<24L, \
67                          l|=((unsigned long)(*((c)++)))<<16L, \
68                          l|=((unsigned long)(*((c)++)))<< 8L, \
69                          l|=((unsigned long)(*((c)++))))
71 #undef l2n
72 #define l2n(l,c)        (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
73                          *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
74                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
75                          *((c)++)=(unsigned char)(((l)     )&0xff))
77 #undef s2n
78 #define s2n(l,c)        (*((c)++)=(unsigned char)(((l)     )&0xff), \
79                          *((c)++)=(unsigned char)(((l)>> 8L)&0xff))
81 #undef n2s
82 #define n2s(c,l)        (l =((IDEA_INT)(*((c)++)))<< 8L, \
83                          l|=((IDEA_INT)(*((c)++)))      )
86 #define E_IDEA(num) \
87         x1&=0xffff; \
88         idea_mul(x1,x1,*p,ul); p++; \
89         x2+= *(p++); \
90         x3+= *(p++); \
91         x4&=0xffff; \
92         idea_mul(x4,x4,*p,ul); p++; \
93         t0=(x1^x3)&0xffff; \
94         idea_mul(t0,t0,*p,ul); p++; \
95         t1=(t0+(x2^x4))&0xffff; \
96         idea_mul(t1,t1,*p,ul); p++; \
97         t0+=t1; \
98         x1^=t1; \
99         x4^=t0; \
100         ul=x2^t0; /* do the swap to x3 */ \
101         x2=x3^t1; \
102         x3=ul;