keydb.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /* $FreeBSD$ */
  2. /* $KAME: keydb.h,v 1.14 2000/08/02 17:58:26 sakane Exp $ */
  3. /*-
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
  7. * All rights reserved.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions
  11. * are met:
  12. * 1. Redistributions of source code must retain the above copyright
  13. * notice, this list of conditions and the following disclaimer.
  14. * 2. Redistributions in binary form must reproduce the above copyright
  15. * notice, this list of conditions and the following disclaimer in the
  16. * documentation and/or other materials provided with the distribution.
  17. * 3. Neither the name of the project nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #ifndef _NETIPSEC_KEYDB_H_
  34. #define _NETIPSEC_KEYDB_H_
  35. #ifdef _KERNEL
  36. #include <sys/counter.h>
  37. #include <sys/lock.h>
  38. #include <sys/mutex.h>
  39. #include <netipsec/key_var.h>
  40. #include <opencrypto/_cryptodev.h>
  41. #ifndef _SOCKADDR_UNION_DEFINED
  42. #define _SOCKADDR_UNION_DEFINED
  43. /*
  44. * The union of all possible address formats we handle.
  45. */
  46. union sockaddr_union {
  47. struct sockaddr sa;
  48. struct sockaddr_in sin;
  49. struct sockaddr_in6 sin6;
  50. };
  51. #endif /* _SOCKADDR_UNION_DEFINED */
  52. /* Security Assocciation Index */
  53. /* NOTE: Ensure to be same address family */
  54. struct secasindex {
  55. union sockaddr_union src; /* source address for SA */
  56. union sockaddr_union dst; /* destination address for SA */
  57. uint8_t proto; /* IPPROTO_ESP or IPPROTO_AH */
  58. uint8_t mode; /* mode of protocol, see ipsec.h */
  59. uint32_t reqid; /* reqid id who owned this SA */
  60. /* see IPSEC_MANUAL_REQID_MAX. */
  61. };
  62. /*
  63. * In order to split out the keydb implementation from that of the
  64. * PF_KEY sockets we need to define a few structures that while they
  65. * may seem common are likely to diverge over time.
  66. */
  67. /* sadb_identity */
  68. struct secident {
  69. u_int16_t type;
  70. u_int64_t id;
  71. };
  72. /* sadb_key */
  73. struct seckey {
  74. u_int16_t bits;
  75. char *key_data;
  76. };
  77. struct seclifetime {
  78. u_int32_t allocations;
  79. u_int64_t bytes;
  80. u_int64_t addtime;
  81. u_int64_t usetime;
  82. };
  83. struct secnatt {
  84. union sockaddr_union oai; /* original addresses of initiator */
  85. union sockaddr_union oar; /* original address of responder */
  86. uint16_t sport; /* source port */
  87. uint16_t dport; /* destination port */
  88. uint16_t cksum; /* checksum delta */
  89. uint16_t flags;
  90. #define IPSEC_NATT_F_OAI 0x0001
  91. #define IPSEC_NATT_F_OAR 0x0002
  92. };
  93. /* Security Association Data Base */
  94. TAILQ_HEAD(secasvar_queue, secasvar);
  95. struct secashead {
  96. TAILQ_ENTRY(secashead) chain;
  97. LIST_ENTRY(secashead) addrhash; /* hash by sproto+src+dst addresses */
  98. LIST_ENTRY(secashead) drainq; /* used ONLY by flush callout */
  99. struct secasindex saidx;
  100. struct secident *idents; /* source identity */
  101. struct secident *identd; /* destination identity */
  102. /* XXX I don't know how to use them. */
  103. volatile u_int refcnt; /* reference count */
  104. uint8_t state; /* MATURE or DEAD. */
  105. struct secasvar_queue savtree_alive; /* MATURE and DYING SA */
  106. struct secasvar_queue savtree_larval; /* LARVAL SA */
  107. };
  108. struct xformsw;
  109. struct enc_xform;
  110. struct auth_hash;
  111. struct comp_algo;
  112. /*
  113. * Security Association
  114. *
  115. * For INBOUND packets we do SA lookup using SPI, thus only SPIHASH is used.
  116. * For OUTBOUND packets there may be several SA suitable for packet.
  117. * We use key_preferred_oldsa variable to choose better SA. First of we do
  118. * lookup for suitable SAH using packet's saidx. Then we use SAH's savtree
  119. * to search better candidate. The newer SA (by created time) are placed
  120. * in the beginning of the savtree list. There is no preference between
  121. * DYING and MATURE.
  122. *
  123. * NB: Fields with a tdb_ prefix are part of the "glue" used
  124. * to interface to the OpenBSD crypto support. This was done
  125. * to distinguish this code from the mainline KAME code.
  126. * NB: Fields are sorted on the basis of the frequency of changes, i.e.
  127. * constants and unchangeable fields are going first.
  128. * NB: if you want to change this structure, check that this will not break
  129. * key_updateaddresses().
  130. */
  131. struct secasvar {
  132. uint32_t spi; /* SPI Value, network byte order */
  133. uint32_t flags; /* holder for SADB_KEY_FLAGS */
  134. uint32_t seq; /* sequence number */
  135. pid_t pid; /* message's pid */
  136. u_int ivlen; /* length of IV */
  137. struct secashead *sah; /* back pointer to the secashead */
  138. struct seckey *key_auth; /* Key for Authentication */
  139. struct seckey *key_enc; /* Key for Encryption */
  140. struct secreplay *replay; /* replay prevention */
  141. struct secnatt *natt; /* NAT-T config */
  142. struct mtx *lock; /* update/access lock */
  143. const struct xformsw *tdb_xform; /* transform */
  144. const struct enc_xform *tdb_encalgxform;/* encoding algorithm */
  145. const struct auth_hash *tdb_authalgxform;/* authentication algorithm */
  146. const struct comp_algo *tdb_compalgxform;/* compression algorithm */
  147. crypto_session_t tdb_cryptoid; /* crypto session */
  148. uint8_t alg_auth; /* Authentication Algorithm Identifier*/
  149. uint8_t alg_enc; /* Cipher Algorithm Identifier */
  150. uint8_t alg_comp; /* Compression Algorithm Identifier */
  151. uint8_t state; /* Status of this SA (pfkeyv2.h) */
  152. counter_u64_t lft_c; /* CURRENT lifetime */
  153. #define lft_c_allocations lft_c
  154. #define lft_c_bytes lft_c + 1
  155. struct seclifetime *lft_h; /* HARD lifetime */
  156. struct seclifetime *lft_s; /* SOFT lifetime */
  157. uint64_t created; /* time when SA was created */
  158. uint64_t firstused; /* time when SA was first used */
  159. TAILQ_ENTRY(secasvar) chain;
  160. LIST_ENTRY(secasvar) spihash;
  161. LIST_ENTRY(secasvar) drainq; /* used ONLY by flush callout */
  162. uint64_t cntr; /* counter for GCM and CTR */
  163. volatile u_int refcnt; /* reference count */
  164. };
  165. #define SECASVAR_LOCK(_sav) mtx_lock((_sav)->lock)
  166. #define SECASVAR_UNLOCK(_sav) mtx_unlock((_sav)->lock)
  167. #define SECASVAR_LOCK_ASSERT(_sav) mtx_assert((_sav)->lock, MA_OWNED)
  168. #define SAV_ISGCM(_sav) \
  169. ((_sav)->alg_enc == SADB_X_EALG_AESGCM8 || \
  170. (_sav)->alg_enc == SADB_X_EALG_AESGCM12 || \
  171. (_sav)->alg_enc == SADB_X_EALG_AESGCM16)
  172. #define SAV_ISCTR(_sav) ((_sav)->alg_enc == SADB_X_EALG_AESCTR)
  173. #define SAV_ISCTRORGCM(_sav) (SAV_ISCTR((_sav)) || SAV_ISGCM((_sav)))
  174. #define IPSEC_SEQH_SHIFT 32
  175. /* Replay prevention, protected by SECASVAR_LOCK:
  176. * (m) locked by mtx
  177. * (c) read only except during creation / free
  178. */
  179. struct secreplay {
  180. u_int64_t count; /* (m) */
  181. u_int wsize; /* (c) window size, i.g. 4 bytes */
  182. u_int64_t last; /* (m) used by receiver */
  183. u_int32_t *bitmap; /* (m) used by receiver */
  184. u_int bitmap_size; /* (c) size of the bitmap array */
  185. int overflow; /* (m) overflow flag */
  186. };
  187. /* socket table due to send PF_KEY messages. */
  188. struct secreg {
  189. LIST_ENTRY(secreg) chain;
  190. struct socket *so;
  191. };
  192. /* acquiring list table. */
  193. struct secacq {
  194. LIST_ENTRY(secacq) chain;
  195. LIST_ENTRY(secacq) addrhash;
  196. LIST_ENTRY(secacq) seqhash;
  197. struct secasindex saidx;
  198. uint32_t seq; /* sequence number */
  199. time_t created; /* for lifetime */
  200. int count; /* for lifetime */
  201. };
  202. #endif /* _KERNEL */
  203. #endif /* _NETIPSEC_KEYDB_H_ */