00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 #ifndef __INK_AUTH_API_H_INCLUDDED__
00025 #define __INK_AUTH_API_H_INCLUDDED__
00026 
00027 #include <sys/types.h>
00028 #include <string.h>
00029 
00030 #include "ink_defs.h"
00031 
00032 typedef union
00033 {
00034   uint64_t u64[2];
00035   uint32_t u32[4];
00036   uint16_t u16[8];
00037   uint8_t u8[16];
00038 } INK_AUTH_TOKEN;
00039 
00040 class INK_AUTH_SEED
00041 {
00042 public:
00043   const void *data() const
00044   {
00045     return m_data;
00046   }
00047   unsigned length() const
00048   {
00049     return m_length;
00050   }
00051 
00052   inline INK_AUTH_SEED(const void *x, unsigned ln)
00053   {
00054     init(x, ln);
00055   }
00056 
00057   inline INK_AUTH_SEED(const uint8_t & x)
00058   {
00059     init((const void *) &x, sizeof(x));
00060   }
00061   inline INK_AUTH_SEED(const uint16_t & x)
00062   {
00063     init((const void *) &x, sizeof(x));
00064   }
00065   inline INK_AUTH_SEED(const uint32_t & x)
00066   {
00067     init((const void *) &x, sizeof(x));
00068   }
00069   inline INK_AUTH_SEED(const uint64_t & x)
00070   {
00071     init((const void *) &x, sizeof(x));
00072   }
00073   inline INK_AUTH_SEED(const int8_t & x)
00074   {
00075     init((const void *) &x, sizeof(x));
00076   }
00077   inline INK_AUTH_SEED(const int16_t & x)
00078   {
00079     init((const void *) &x, sizeof(x));
00080   }
00081   inline INK_AUTH_SEED(const int32_t & x)
00082   {
00083     init((const void *) &x, sizeof(x));
00084   }
00085   inline INK_AUTH_SEED(const int64_t & x)
00086   {
00087     init((const void *) &x, sizeof(x));
00088   }
00089 
00090   inline INK_AUTH_SEED(const INK_AUTH_TOKEN & x)
00091   {
00092     init((const void *) &(x.u8[0]), sizeof(x.u8));
00093   }
00094 
00095   inline INK_AUTH_SEED(const char *str)
00096   {
00097     init((const void *) str, strlen((const char *) str));
00098   }
00099 
00100   inline INK_AUTH_SEED(const char *str, unsigned ln)
00101   {
00102     init((const void *) str, ln);
00103   }
00104 
00105   inline INK_AUTH_SEED(const unsigned char *str)
00106   {
00107     init((const void *) str, strlen((const char *) str));
00108   }
00109 
00110   inline INK_AUTH_SEED(const unsigned char *str, unsigned ln)
00111   {
00112     init((const void *) str, ln);
00113   }
00114 
00115 protected:
00116 
00117   void init(const void *d, unsigned l)
00118   {
00119     m_data = d;
00120     m_length = l;
00121   }
00122 
00123   const void *m_data;
00124   unsigned m_length;
00125 };
00126 
00127 
00128 void ink_make_token(INK_AUTH_TOKEN * tok, const INK_AUTH_TOKEN & mask, const INK_AUTH_SEED * const *seeds, int slen);
00129 
00130 uint32_t ink_make_token32(uint32_t mask, const INK_AUTH_SEED * const *seeds, int slen);
00131 uint64_t ink_make_token64(uint64_t mask, const INK_AUTH_SEED * const *seeds, int slen);
00132 
00133 uint32_t ink_get_rand();
00134 
00135 #define INK_TOKENS_EQUAL(m,t1,t2) ((((t1)^(t2))&(~(m))) == 0)
00136 
00137 
00138 
00139 
00140 inline uint32_t
00141 ink_make_token32(uint32_t mask, const INK_AUTH_SEED & s1)
00142 {
00143   const INK_AUTH_SEED *s[] = { &s1 };
00144   return ink_make_token32(mask, s, sizeof(s) / sizeof(*s));
00145 }
00146 
00147 inline uint32_t
00148 ink_make_token32(uint32_t mask, const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2)
00149 {
00150   const INK_AUTH_SEED *s[] = { &s1, &s2 };
00151   return ink_make_token32(mask, s, sizeof(s) / sizeof(*s));
00152 }
00153 
00154 inline uint32_t
00155 ink_make_token32(uint32_t mask, const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3)
00156 {
00157   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3 };
00158   return ink_make_token32(mask, s, sizeof(s) / sizeof(*s));
00159 }
00160 
00161 inline uint32_t
00162 ink_make_token32(uint32_t mask,
00163                  const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3, const INK_AUTH_SEED & s4)
00164 {
00165   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3, &s4 };
00166   return ink_make_token32(mask, s, sizeof(s) / sizeof(*s));
00167 }
00168 
00169 inline uint32_t
00170 ink_make_token32(uint32_t mask,
00171                  const INK_AUTH_SEED & s1,
00172                  const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3, const INK_AUTH_SEED & s4, const INK_AUTH_SEED & s5)
00173 {
00174   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3, &s4, &s5 };
00175   return ink_make_token32(mask, s, sizeof(s) / sizeof(*s));
00176 }
00177 
00178 inline uint64_t
00179 ink_make_token64(uint64_t mask, const INK_AUTH_SEED & s1)
00180 {
00181   const INK_AUTH_SEED *s[] = { &s1 };
00182   return ink_make_token64(mask, s, sizeof(s) / sizeof(*s));
00183 }
00184 
00185 inline uint64_t
00186 ink_make_token64(uint64_t mask, const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2)
00187 {
00188   const INK_AUTH_SEED *s[] = { &s1, &s2 };
00189   return ink_make_token64(mask, s, sizeof(s) / sizeof(*s));
00190 }
00191 
00192 inline uint64_t
00193 ink_make_token64(uint64_t mask, const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3)
00194 {
00195   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3 };
00196   return ink_make_token64(mask, s, sizeof(s) / sizeof(*s));
00197 }
00198 
00199 inline uint64_t
00200 ink_make_token64(uint64_t mask,
00201                  const INK_AUTH_SEED & s1, const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3, const INK_AUTH_SEED & s4)
00202 {
00203   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3, &s4 };
00204   return ink_make_token64(mask, s, sizeof(s) / sizeof(*s));
00205 }
00206 
00207 inline uint64_t
00208 ink_make_token64(uint64_t mask,
00209                  const INK_AUTH_SEED & s1,
00210                  const INK_AUTH_SEED & s2, const INK_AUTH_SEED & s3, const INK_AUTH_SEED & s4, const INK_AUTH_SEED & s5)
00211 {
00212   const INK_AUTH_SEED *s[] = { &s1, &s2, &s3, &s4, &s5 };
00213   return ink_make_token64(mask, s, sizeof(s) / sizeof(*s));
00214 }
00215 
00216 inline int64_t
00217 INK_AUTH_MAKE_INT_64(uint32_t h, uint32_t l)
00218 {
00219   return int64_t((((uint64_t) h) << 32) + (uint32_t) l);
00220 }
00221 
00222 inline int64_t
00223 INK_AUTH_MAKE_INT_64(uint32_t u)
00224 {
00225   return INK_AUTH_MAKE_INT_64(u, u);
00226 }
00227 
00228 #endif // #ifndef __INK_AUTH_API_H_INCLUDDED__