Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/ke_payload.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2005-2010 Martin Willi
! 3: * Copyright (C) 2010 revosec AG
! 4: * Copyright (C) 2005 Jan Hutter
! 5: * HSR Hochschule fuer Technik Rapperswil
! 6: *
! 7: * This program is free software; you can redistribute it and/or modify it
! 8: * under the terms of the GNU General Public License as published by the
! 9: * Free Software Foundation; either version 2 of the License, or (at your
! 10: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 11: *
! 12: * This program is distributed in the hope that it will be useful, but
! 13: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 14: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 15: * for more details.
! 16: */
! 17:
! 18: #include <stddef.h>
! 19:
! 20: #include "ke_payload.h"
! 21:
! 22: #include <encoding/payloads/encodings.h>
! 23:
! 24: typedef struct private_ke_payload_t private_ke_payload_t;
! 25:
! 26: /**
! 27: * Private data of an ke_payload_t object.
! 28: */
! 29: struct private_ke_payload_t {
! 30:
! 31: /**
! 32: * Public ke_payload_t interface.
! 33: */
! 34: ke_payload_t public;
! 35:
! 36: /**
! 37: * Next payload type.
! 38: */
! 39: uint8_t next_payload;
! 40:
! 41: /**
! 42: * Critical flag.
! 43: */
! 44: bool critical;
! 45:
! 46: /**
! 47: * Reserved bits
! 48: */
! 49: bool reserved_bit[7];
! 50:
! 51: /**
! 52: * Reserved bytes
! 53: */
! 54: uint8_t reserved_byte[2];
! 55:
! 56: /**
! 57: * Length of this payload.
! 58: */
! 59: uint16_t payload_length;
! 60:
! 61: /**
! 62: * DH Group Number.
! 63: */
! 64: uint16_t dh_group_number;
! 65:
! 66: /**
! 67: * Key Exchange Data of this KE payload.
! 68: */
! 69: chunk_t key_exchange_data;
! 70:
! 71: /**
! 72: * Payload type, PLV2_KEY_EXCHANGE or PLV1_KEY_EXCHANGE
! 73: */
! 74: payload_type_t type;
! 75: };
! 76:
! 77: /**
! 78: * Encoding rules for IKEv2 key exchange payload.
! 79: */
! 80: static encoding_rule_t encodings_v2[] = {
! 81: /* 1 Byte next payload type, stored in the field next_payload */
! 82: { U_INT_8, offsetof(private_ke_payload_t, next_payload) },
! 83: /* the critical bit */
! 84: { FLAG, offsetof(private_ke_payload_t, critical) },
! 85: /* 7 Bit reserved bits */
! 86: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[0]) },
! 87: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[1]) },
! 88: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[2]) },
! 89: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[3]) },
! 90: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[4]) },
! 91: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[5]) },
! 92: { RESERVED_BIT, offsetof(private_ke_payload_t, reserved_bit[6]) },
! 93: /* Length of the whole payload*/
! 94: { PAYLOAD_LENGTH, offsetof(private_ke_payload_t, payload_length) },
! 95: /* DH Group number as 16 bit field*/
! 96: { U_INT_16, offsetof(private_ke_payload_t, dh_group_number) },
! 97: /* 2 reserved bytes */
! 98: { RESERVED_BYTE, offsetof(private_ke_payload_t, reserved_byte[0])},
! 99: { RESERVED_BYTE, offsetof(private_ke_payload_t, reserved_byte[1])},
! 100: /* Key Exchange Data is from variable size */
! 101: { CHUNK_DATA, offsetof(private_ke_payload_t, key_exchange_data)},
! 102: };
! 103:
! 104: /*
! 105: 1 2 3
! 106: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
! 107: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 108: ! Next Payload !C! RESERVED ! Payload Length !
! 109: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 110: ! DH Group # ! RESERVED !
! 111: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 112: ! !
! 113: ~ Key Exchange Data ~
! 114: ! !
! 115: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 116: */
! 117:
! 118: static encoding_rule_t encodings_v1[] = {
! 119: /* 1 Byte next payload type, stored in the field next_payload */
! 120: { U_INT_8, offsetof(private_ke_payload_t, next_payload) },
! 121: /* Reserved Byte */
! 122: { RESERVED_BYTE, offsetof(private_ke_payload_t, reserved_byte[0])},
! 123: /* Length of the whole payload*/
! 124: { PAYLOAD_LENGTH, offsetof(private_ke_payload_t, payload_length) },
! 125: /* Key Exchange Data is from variable size */
! 126: { CHUNK_DATA, offsetof(private_ke_payload_t, key_exchange_data)},
! 127: };
! 128:
! 129: /*
! 130: 1 2 3
! 131: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
! 132: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 133: ! Next Payload ! RESERVED ! Payload Length !
! 134: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 135: ! !
! 136: ~ Key Exchange Data ~
! 137: ! !
! 138: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 139: */
! 140:
! 141:
! 142: METHOD(payload_t, verify, status_t,
! 143: private_ke_payload_t *this)
! 144: {
! 145: return SUCCESS;
! 146: }
! 147:
! 148: METHOD(payload_t, get_encoding_rules, int,
! 149: private_ke_payload_t *this, encoding_rule_t **rules)
! 150: {
! 151: if (this->type == PLV2_KEY_EXCHANGE)
! 152: {
! 153: *rules = encodings_v2;
! 154: return countof(encodings_v2);
! 155: }
! 156: *rules = encodings_v1;
! 157: return countof(encodings_v1);
! 158: }
! 159:
! 160: METHOD(payload_t, get_header_length, int,
! 161: private_ke_payload_t *this)
! 162: {
! 163: if (this->type == PLV2_KEY_EXCHANGE)
! 164: {
! 165: return 8;
! 166: }
! 167: return 4;
! 168: }
! 169:
! 170: METHOD(payload_t, get_type, payload_type_t,
! 171: private_ke_payload_t *this)
! 172: {
! 173: return this->type;
! 174: }
! 175:
! 176: METHOD(payload_t, get_next_type, payload_type_t,
! 177: private_ke_payload_t *this)
! 178: {
! 179: return this->next_payload;
! 180: }
! 181:
! 182: METHOD(payload_t, set_next_type, void,
! 183: private_ke_payload_t *this,payload_type_t type)
! 184: {
! 185: this->next_payload = type;
! 186: }
! 187:
! 188: METHOD(payload_t, get_length, size_t,
! 189: private_ke_payload_t *this)
! 190: {
! 191: return this->payload_length;
! 192: }
! 193:
! 194: METHOD(ke_payload_t, get_key_exchange_data, chunk_t,
! 195: private_ke_payload_t *this)
! 196: {
! 197: return this->key_exchange_data;
! 198: }
! 199:
! 200: METHOD(ke_payload_t, get_dh_group_number, diffie_hellman_group_t,
! 201: private_ke_payload_t *this)
! 202: {
! 203: return this->dh_group_number;
! 204: }
! 205:
! 206: METHOD2(payload_t, ke_payload_t, destroy, void,
! 207: private_ke_payload_t *this)
! 208: {
! 209: free(this->key_exchange_data.ptr);
! 210: free(this);
! 211: }
! 212:
! 213: /*
! 214: * Described in header
! 215: */
! 216: ke_payload_t *ke_payload_create(payload_type_t type)
! 217: {
! 218: private_ke_payload_t *this;
! 219:
! 220: INIT(this,
! 221: .public = {
! 222: .payload_interface = {
! 223: .verify = _verify,
! 224: .get_encoding_rules = _get_encoding_rules,
! 225: .get_header_length = _get_header_length,
! 226: .get_length = _get_length,
! 227: .get_next_type = _get_next_type,
! 228: .set_next_type = _set_next_type,
! 229: .get_type = _get_type,
! 230: .destroy = _destroy,
! 231: },
! 232: .get_key_exchange_data = _get_key_exchange_data,
! 233: .get_dh_group_number = _get_dh_group_number,
! 234: .destroy = _destroy,
! 235: },
! 236: .next_payload = PL_NONE,
! 237: .dh_group_number = MODP_NONE,
! 238: .type = type,
! 239: );
! 240: this->payload_length = get_header_length(this);
! 241: return &this->public;
! 242: }
! 243:
! 244: /*
! 245: * Described in header
! 246: */
! 247: ke_payload_t *ke_payload_create_from_diffie_hellman(payload_type_t type,
! 248: diffie_hellman_t *dh)
! 249: {
! 250: private_ke_payload_t *this;
! 251: chunk_t value;
! 252:
! 253: if (!dh->get_my_public_value(dh, &value))
! 254: {
! 255: return NULL;
! 256: }
! 257: this = (private_ke_payload_t*)ke_payload_create(type);
! 258: this->key_exchange_data = value;
! 259: this->dh_group_number = dh->get_dh_group(dh);
! 260: this->payload_length += this->key_exchange_data.len;
! 261:
! 262: return &this->public;
! 263: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>