> i dont see why this is necessary, gcm->X is already unsigned char*

yeah, that's what I thought too... but the compiler nagged when I used the array

> btw, technically it's UB to cast unsigned char* to LTC_FAST_TYPE*. the correct way would be to define gcm_data.X as union { unsigned char*  X[sizeof(LTC_FAST_TYPE]; LTC_FAST_TYPE XF[1];}[16 / sizeof(LTC_FAST_TYPE)] and then access the XF member in the loop.

C99 6.5.7 says: "An object shall have its stored value accessed only by an lvalue expression that has one of the following types: ... a character type." so we should be able to solve this *the other way around* by doing something like

```c
#ifndef LTC_FAST
#define LTC_FAST_TYPE unsigned char
#endif
#define LTC_ARRAY(sz) ((sz)/sizeof(LTC_FAST_TYPE))
typedef struct {
...
  LTC_FAST_TYPE X[LTC_ARRAY(16)];
...
} gcm_state;
```

what do you think?

> the alternative is to define LTC_FAST_TYPE with the gnu extension ```__attribute__((may_alias))```.

well that would reduce the fast option to compilers that support this attribute...