1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * integers.h
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * defines integer types (or refers to their definitions)
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * David A. McGrew
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Cisco Systems, Inc.
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Copyright (c) 2001-2006, Cisco Systems, Inc.
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * All rights reserved.
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * Redistribution and use in source and binary forms, with or without
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * modification, are permitted provided that the following conditions
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * are met:
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions of source code must retain the above copyright
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   notice, this list of conditions and the following disclaimer.
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Redistributions in binary form must reproduce the above
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   copyright notice, this list of conditions and the following
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   disclaimer in the documentation and/or other materials provided
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   with the distribution.
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   Neither the name of the Cisco Systems, Inc. nor the names of its
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   contributors may be used to endorse or promote products derived
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *   from this software without specific prior written permission.
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * OF THE POSSIBILITY OF SUCH DAMAGE.
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef INTEGERS_H
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define INTEGERS_H
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "config.h"	/* configuration file, using autoconf          */
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef SRTP_KERNEL
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "kernel_compat.h"
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else /* SRTP_KERNEL */
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* use standard integer definitions, if they're available  */
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_STDLIB_H
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <stdlib.h>
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_STDINT_H
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <stdint.h>
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_INTTYPES_H
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <inttypes.h>
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_SYS_TYPES_H
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <sys/types.h>
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_SYS_INT_TYPES_H
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <sys/int_types.h>    /* this exists on Sun OS */
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef HAVE_MACHINE_TYPES_H
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# include <machine/types.h>
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* Can we do 64 bit integers? */
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef HAVE_UINT64_T
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# if SIZEOF_UNSIGNED_LONG == 8
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef unsigned long		uint64_t;
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# elif SIZEOF_UNSIGNED_LONG_LONG == 8
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef unsigned long long	uint64_t;
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# else
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#  define NO_64BIT_MATH 1
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari# endif
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* Reasonable defaults for 32 bit machines - you may need to
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * edit these definitions for your own machine. */
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef HAVE_UINT8_T
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef unsigned char		uint8_t;
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef HAVE_UINT16_T
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef unsigned short int	uint16_t;
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifndef HAVE_UINT32_T
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef unsigned int		uint32_t;
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef NO_64BIT_MATH
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaritypedef double uint64_t;
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* assert that sizeof(double) == 8 */
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern uint64_t make64(uint32_t high, uint32_t low);
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern uint32_t high32(uint64_t value);
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern uint32_t low32(uint64_t value);
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* SRTP_KERNEL */
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* These macros are to load and store 32-bit values from un-aligned
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   addresses.  This is required for processors that do not allow unaligned
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   loads. */
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef ALIGNMENT_32BIT_REQUIRED
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* Note that if it's in a variable, you can memcpy it */
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#ifdef WORDS_BIGENDIAN
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define PUT_32(addr,value) \
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    { \
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[0] = (value >> 24); \
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[1] = (value >> 16) & 0xff; \
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[2] = (value >> 8) & 0xff; \
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[3] = (value)      & 0xff; \
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define GET_32(addr) ((((unsigned char *) (addr))[0] << 24) |  \
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[1] << 16) |  \
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[2] << 8)  |  \
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[3]))
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define PUT_32(addr,value) \
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    { \
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[3] = (value >> 24); \
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[2] = (value >> 16) & 0xff; \
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[1] = (value >> 8) & 0xff; \
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari        ((unsigned char *) (addr))[0] = (value)      & 0xff; \
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define GET_32(addr) ((((unsigned char *) (addr))[3] << 24) |  \
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[2] << 16) |  \
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[1] << 8)  |  \
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari                      (((unsigned char *) (addr))[0]))
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif // WORDS_BIGENDIAN
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#else
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define PUT_32(addr,value) *(((uint32_t *) (addr)) = (value)
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define GET_32(addr) (*(((uint32_t *) (addr)))
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif /* INTEGERS_H */
147