printsadbmsg.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. #include "unp.h"
  2. #include <net/pfkeyv2.h>
  3. const char *
  4. get_sadb_msg_type(int type)
  5. {
  6. static char buf[100];
  7. switch (type) {
  8. case SADB_RESERVED: return "Reserved";
  9. case SADB_GETSPI: return "Get SPI";
  10. case SADB_UPDATE: return "Update";
  11. case SADB_ADD: return "Add";
  12. case SADB_DELETE: return "Delete";
  13. case SADB_GET: return "Get";
  14. case SADB_ACQUIRE: return "Acquire";
  15. case SADB_REGISTER: return "Register";
  16. case SADB_EXPIRE: return "Expire";
  17. case SADB_FLUSH: return "Flush";
  18. case SADB_DUMP: return "Dump";
  19. default: sprintf(buf, "[Unknown type %d]", type);
  20. return buf;
  21. }
  22. }
  23. const char *
  24. get_sadb_satype(int type)
  25. {
  26. static char buf[100];
  27. switch (type) {
  28. case SADB_SATYPE_UNSPEC: return "Unspecified";
  29. case SADB_SATYPE_AH: return "IPsec AH";
  30. case SADB_SATYPE_ESP: return "IPsec ESP";
  31. case SADB_SATYPE_RSVP: return "RSVP";
  32. case SADB_SATYPE_OSPFV2: return "OSPFv2";
  33. case SADB_SATYPE_RIPV2: return "RIPv2";
  34. case SADB_SATYPE_MIP: return "Mobile IP";
  35. default: sprintf(buf, "[Unknown satype %d]", type);
  36. return buf;
  37. }
  38. }
  39. const char *
  40. get_auth_alg(int alg)
  41. {
  42. static char buf[100];
  43. switch (alg) {
  44. case SADB_AALG_NONE: return "None";
  45. case SADB_AALG_MD5HMAC: return "HMAC-MD5";
  46. case SADB_AALG_SHA1HMAC: return "HMAC-SHA-1";
  47. #ifdef SADB_X_AALG_MD5
  48. case SADB_X_AALG_MD5: return "Keyed MD5";
  49. #endif
  50. #ifdef SADB_X_AALG_SHA
  51. case SADB_X_AALG_SHA: return "Keyed SHA-1";
  52. #endif
  53. #ifdef SADB_X_AALG_NULL
  54. case SADB_X_AALG_NULL: return "Null";
  55. #endif
  56. #ifdef SADB_X_AALG_SHA2_256
  57. case SADB_X_AALG_SHA2_256: return "SHA2-256";
  58. #endif
  59. #ifdef SADB_X_AALG_SHA2_384
  60. case SADB_X_AALG_SHA2_384: return "SHA2-384";
  61. #endif
  62. #ifdef SADB_X_AALG_SHA2_512
  63. case SADB_X_AALG_SHA2_512: return "SHA2-512";
  64. #endif
  65. default: sprintf(buf, "[Unknown authentication algorithm %d]", alg);
  66. return buf;
  67. }
  68. }
  69. const char *
  70. get_encrypt_alg(int alg)
  71. {
  72. static char buf[100];
  73. switch (alg) {
  74. case SADB_EALG_NONE: return "None";
  75. case SADB_EALG_DESCBC: return "DES-CBC";
  76. case SADB_EALG_3DESCBC: return "3DES-CBC";
  77. case SADB_EALG_NULL: return "Null";
  78. #ifdef SADB_X_EALG_CAST128CBC
  79. case SADB_X_EALG_CAST128CBC: return "CAST128-CBC";
  80. #endif
  81. #ifdef SADB_X_EALG_BLOWFISHCBC
  82. case SADB_X_EALG_BLOWFISHCBC: return "Blowfish-CBC";
  83. #endif
  84. #ifdef SADB_X_EALG_AES
  85. case SADB_X_EALG_AES: return "AES";
  86. #endif
  87. default: sprintf(buf, "[Unknown encryption algorithm %d]", alg);
  88. return buf;
  89. }
  90. }
  91. const char *
  92. get_sa_state(int state)
  93. {
  94. static char buf[100];
  95. switch (state) {
  96. case SADB_SASTATE_LARVAL: return "Larval";
  97. case SADB_SASTATE_MATURE: return "Mature";
  98. case SADB_SASTATE_DYING: return "Dying";
  99. case SADB_SASTATE_DEAD: return "Dead";
  100. default: sprintf(buf, "[Unknown SA state %d]", state);
  101. return buf;
  102. }
  103. }
  104. const char *
  105. get_sadb_alg_type(int alg, int authenc)
  106. {
  107. if (authenc == SADB_EXT_SUPPORTED_AUTH) {
  108. return get_auth_alg(alg);
  109. } else {
  110. return get_encrypt_alg(alg);
  111. }
  112. }
  113. void
  114. sa_print(struct sadb_ext *ext)
  115. {
  116. struct sadb_sa *sa = (struct sadb_sa *)ext;
  117. printf(" SA: SPI=%d Replay Window=%d State=%s\n",
  118. sa->sadb_sa_spi, sa->sadb_sa_replay,
  119. get_sa_state(sa->sadb_sa_state));
  120. printf(" Authentication Algorithm: %s\n",
  121. get_auth_alg(sa->sadb_sa_auth));
  122. printf(" Encryption Algorithm: %s\n",
  123. get_encrypt_alg(sa->sadb_sa_encrypt));
  124. if (sa->sadb_sa_flags & SADB_SAFLAGS_PFS)
  125. printf(" Perfect Forward Secrecy\n");
  126. }
  127. void
  128. supported_print(struct sadb_ext *ext)
  129. {
  130. struct sadb_supported *sup = (struct sadb_supported *)ext;
  131. struct sadb_alg *alg;
  132. int len;
  133. printf(" Supported %s algorithms:\n",
  134. sup->sadb_supported_exttype == SADB_EXT_SUPPORTED_AUTH ?
  135. "authentication" :
  136. "encryption");
  137. len = sup->sadb_supported_len * 8;
  138. len -= sizeof(*sup);
  139. if (len == 0) {
  140. printf(" None\n");
  141. return;
  142. }
  143. for (alg = (struct sadb_alg *)(sup + 1); len>0; len -= sizeof(*alg), alg++) {
  144. printf(" %s ivlen %d bits %d-%d\n",
  145. get_sadb_alg_type(alg->sadb_alg_id, sup->sadb_supported_exttype),
  146. alg->sadb_alg_ivlen, alg->sadb_alg_minbits, alg->sadb_alg_maxbits);
  147. }
  148. }
  149. void
  150. lifetime_print(struct sadb_ext *ext)
  151. {
  152. struct sadb_lifetime *life = (struct sadb_lifetime *)ext;
  153. printf(" %s lifetime:\n",
  154. life->sadb_lifetime_exttype == SADB_EXT_LIFETIME_CURRENT ?
  155. "Current" :
  156. life->sadb_lifetime_exttype == SADB_EXT_LIFETIME_HARD ?
  157. "Hard" :
  158. "Soft");
  159. printf(" %d allocations, %d bytes", life->sadb_lifetime_allocations,
  160. life->sadb_lifetime_bytes);
  161. if (life->sadb_lifetime_exttype == SADB_EXT_LIFETIME_CURRENT) {
  162. time_t t;
  163. struct tmp *tm;
  164. char buf[100];
  165. /* absolute times */
  166. t = life->sadb_lifetime_addtime;
  167. tm = localtime(&t);
  168. strftime(buf, sizeof(buf), "%c", tm);
  169. printf("\n added at %s, ", buf);
  170. if (life->sadb_lifetime_usetime == 0) {
  171. printf("never used\n");
  172. } else {
  173. t = life->sadb_lifetime_usetime;
  174. tm = localtime(&t);
  175. strftime(buf, sizeof(buf), "%c", tm);
  176. printf("first used at %s\n", buf);
  177. }
  178. } else {
  179. printf("%d addtime, %d usetime\n", life->sadb_lifetime_addtime,
  180. life->sadb_lifetime_usetime);
  181. }
  182. }
  183. void
  184. address_print(struct sadb_ext *ext)
  185. {
  186. struct sadb_address *addr = (struct sadb_address *)ext;
  187. struct sockaddr *sa;
  188. printf(" %s address: ",
  189. addr->sadb_address_exttype == SADB_EXT_ADDRESS_SRC ?
  190. "Source" :
  191. addr->sadb_address_exttype == SADB_EXT_ADDRESS_DST ?
  192. "Dest" :
  193. "Proxy");
  194. sa = (struct sockaddr *)(addr + 1);
  195. printf(" %s", sock_ntop(sa, addr->sadb_address_len * 8 - sizeof(*addr)));
  196. if (addr->sadb_address_prefixlen == 0)
  197. printf(" ");
  198. else
  199. printf("/%d ", addr->sadb_address_prefixlen);
  200. switch (addr->sadb_address_proto) {
  201. case IPPROTO_UDP: printf("(UDP)"); break;
  202. case IPPROTO_TCP: printf("(TCP)"); break;
  203. case 0: break;
  204. default: printf("(IP proto %d)", addr->sadb_address_proto);
  205. break;
  206. }
  207. printf("\n");
  208. }
  209. void
  210. key_print(struct sadb_ext *ext)
  211. {
  212. struct sadb_key *key = (struct sadb_key *)ext;
  213. int bits;
  214. unsigned char *p;
  215. printf(" %s key, %d bits: 0x",
  216. key->sadb_key_exttype == SADB_EXT_KEY_AUTH ?
  217. "Authentication" : "Encryption",
  218. key->sadb_key_bits);
  219. for (p = (unsigned char *)(key + 1), bits = key->sadb_key_bits;
  220. bits > 0; p++, bits -= 8)
  221. printf("%02x", *p);
  222. printf("\n");
  223. }
  224. void
  225. print_sadb_msg(struct sadb_msg *msg, int msglen)
  226. {
  227. struct sadb_ext *ext;
  228. if (msglen != msg->sadb_msg_len * 8) {
  229. err_msg("SADB Message length (%d) doesn't match msglen (%d)\n",
  230. msg->sadb_msg_len * 8, msglen);
  231. return;
  232. }
  233. if (msg->sadb_msg_version != PF_KEY_V2) {
  234. err_msg("SADB Message version not PF_KEY_V2\n");
  235. return;
  236. }
  237. printf("SADB Message %s, errno %d, satype %s, seq %d, pid %d\n",
  238. get_sadb_msg_type(msg->sadb_msg_type), msg->sadb_msg_errno,
  239. get_sadb_satype(msg->sadb_msg_satype), msg->sadb_msg_seq,
  240. msg->sadb_msg_pid);
  241. if (msg->sadb_msg_errno != 0)
  242. printf(" errno %s\n", strerror(msg->sadb_msg_errno));
  243. if (msglen == sizeof(struct sadb_msg))
  244. return; /* no extensions */
  245. msglen -= sizeof(struct sadb_msg);
  246. ext = (struct sadb_ext *)(msg + 1);
  247. while (msglen > 0) {
  248. switch (ext->sadb_ext_type) {
  249. case SADB_EXT_RESERVED: printf(" Reserved Extension\n"); break;
  250. case SADB_EXT_SA: sa_print(ext); break;
  251. case SADB_EXT_LIFETIME_CURRENT:
  252. case SADB_EXT_LIFETIME_HARD:
  253. case SADB_EXT_LIFETIME_SOFT:
  254. lifetime_print(ext); break;
  255. case SADB_EXT_ADDRESS_SRC:
  256. case SADB_EXT_ADDRESS_DST:
  257. case SADB_EXT_ADDRESS_PROXY:
  258. address_print(ext); break;
  259. case SADB_EXT_KEY_AUTH:
  260. case SADB_EXT_KEY_ENCRYPT:
  261. key_print(ext); break;
  262. case SADB_EXT_IDENTITY_SRC:
  263. case SADB_EXT_IDENTITY_DST:
  264. printf(" [identity...]\n"); break;
  265. case SADB_EXT_SENSITIVITY:
  266. printf(" [sensitivity...]\n"); break;
  267. case SADB_EXT_PROPOSAL:
  268. printf(" [proposal...]\n"); break;
  269. case SADB_EXT_SUPPORTED_AUTH:
  270. case SADB_EXT_SUPPORTED_ENCRYPT:
  271. supported_print(ext); break;
  272. case SADB_EXT_SPIRANGE:
  273. printf(" [spirange...]\n"); break;
  274. default: printf(" [unknown extension %d]\n", ext->sadb_ext_type);
  275. }
  276. msglen -= ext->sadb_ext_len << 3;
  277. ext = (char *)ext + (ext->sadb_ext_len << 3);
  278. }
  279. }