Annotation of embedaddon/strongswan/src/libcharon/encoding/payloads/auth_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 "auth_payload.h"
! 19:
! 20: #include <encoding/payloads/encodings.h>
! 21:
! 22: typedef struct private_auth_payload_t private_auth_payload_t;
! 23:
! 24: /**
! 25: * Private data of an auth_payload_t object.
! 26: *
! 27: */
! 28: struct private_auth_payload_t {
! 29:
! 30: /**
! 31: * Public auth_payload_t interface.
! 32: */
! 33: auth_payload_t public;
! 34:
! 35: /**
! 36: * Next payload type.
! 37: */
! 38: uint8_t next_payload;
! 39:
! 40: /**
! 41: * Critical flag.
! 42: */
! 43: bool critical;
! 44:
! 45: /**
! 46: * Reserved bits
! 47: */
! 48: bool reserved_bit[7];
! 49:
! 50: /**
! 51: * Reserved bytes
! 52: */
! 53: uint8_t reserved_byte[3];
! 54:
! 55: /**
! 56: * Length of this payload.
! 57: */
! 58: uint16_t payload_length;
! 59:
! 60: /**
! 61: * Method of the AUTH Data.
! 62: */
! 63: uint8_t auth_method;
! 64:
! 65: /**
! 66: * The contained auth data value.
! 67: */
! 68: chunk_t auth_data;
! 69: };
! 70:
! 71: /**
! 72: * Encoding rules to parse or generate a AUTH payload
! 73: *
! 74: * The defined offsets are the positions in a object of type
! 75: * private_auth_payload_t.
! 76: */
! 77: static encoding_rule_t encodings[] = {
! 78: /* 1 Byte next payload type, stored in the field next_payload */
! 79: { U_INT_8, offsetof(private_auth_payload_t, next_payload) },
! 80: /* the critical bit */
! 81: { FLAG, offsetof(private_auth_payload_t, critical) },
! 82: /* 7 Bit reserved bits */
! 83: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[0]) },
! 84: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[1]) },
! 85: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[2]) },
! 86: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[3]) },
! 87: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[4]) },
! 88: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[5]) },
! 89: { RESERVED_BIT, offsetof(private_auth_payload_t, reserved_bit[6]) },
! 90: /* Length of the whole payload*/
! 91: { PAYLOAD_LENGTH, offsetof(private_auth_payload_t, payload_length) },
! 92: /* 1 Byte AUTH type*/
! 93: { U_INT_8, offsetof(private_auth_payload_t, auth_method) },
! 94: /* 3 reserved bytes */
! 95: { RESERVED_BYTE, offsetof(private_auth_payload_t, reserved_byte[0]) },
! 96: { RESERVED_BYTE, offsetof(private_auth_payload_t, reserved_byte[1]) },
! 97: { RESERVED_BYTE, offsetof(private_auth_payload_t, reserved_byte[2]) },
! 98: /* some auth data bytes, length is defined in PAYLOAD_LENGTH */
! 99: { CHUNK_DATA, offsetof(private_auth_payload_t, auth_data) }
! 100: };
! 101:
! 102: /*
! 103: 1 2 3
! 104: 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
! 105: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 106: ! Next Payload !C! RESERVED ! Payload Length !
! 107: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 108: ! Auth Method ! RESERVED !
! 109: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 110: ! !
! 111: ~ Authentication Data ~
! 112: ! !
! 113: +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
! 114: */
! 115:
! 116: METHOD(payload_t, verify, status_t,
! 117: private_auth_payload_t *this)
! 118: {
! 119: return SUCCESS;
! 120: }
! 121:
! 122: METHOD(payload_t, get_encoding_rules, int,
! 123: private_auth_payload_t *this, encoding_rule_t **rules)
! 124: {
! 125: *rules = encodings;
! 126: return countof(encodings);
! 127: }
! 128:
! 129: METHOD(payload_t, get_header_length, int,
! 130: private_auth_payload_t *this)
! 131: {
! 132: return 8;
! 133: }
! 134:
! 135: METHOD(payload_t, get_type, payload_type_t,
! 136: private_auth_payload_t *this)
! 137: {
! 138: return PLV2_AUTH;
! 139: }
! 140:
! 141: METHOD(payload_t, get_next_type, payload_type_t,
! 142: private_auth_payload_t *this)
! 143: {
! 144: return this->next_payload;
! 145: }
! 146:
! 147: METHOD(payload_t, set_next_type, void,
! 148: private_auth_payload_t *this, payload_type_t type)
! 149: {
! 150: this->next_payload = type;
! 151: }
! 152:
! 153: METHOD(payload_t, get_length, size_t,
! 154: private_auth_payload_t *this)
! 155: {
! 156: return this->payload_length;
! 157: }
! 158:
! 159: METHOD(auth_payload_t, set_auth_method, void,
! 160: private_auth_payload_t *this, auth_method_t method)
! 161: {
! 162: this->auth_method = method;
! 163: }
! 164:
! 165: METHOD(auth_payload_t, get_auth_method, auth_method_t,
! 166: private_auth_payload_t *this)
! 167: {
! 168: return this->auth_method;
! 169: }
! 170:
! 171: METHOD(auth_payload_t, set_data, void,
! 172: private_auth_payload_t *this, chunk_t data)
! 173: {
! 174: free(this->auth_data.ptr);
! 175: this->auth_data = chunk_clone(data);
! 176: this->payload_length = get_header_length(this) + this->auth_data.len;
! 177: }
! 178:
! 179: METHOD(auth_payload_t, get_data, chunk_t,
! 180: private_auth_payload_t *this)
! 181: {
! 182: return this->auth_data;
! 183: }
! 184:
! 185: METHOD2(payload_t, auth_payload_t, destroy, void,
! 186: private_auth_payload_t *this)
! 187: {
! 188: free(this->auth_data.ptr);
! 189: free(this);
! 190: }
! 191:
! 192: /*
! 193: * Described in header
! 194: */
! 195: auth_payload_t *auth_payload_create()
! 196: {
! 197: private_auth_payload_t *this;
! 198:
! 199: INIT(this,
! 200: .public = {
! 201: .payload_interface = {
! 202: .verify = _verify,
! 203: .get_encoding_rules = _get_encoding_rules,
! 204: .get_header_length = _get_header_length,
! 205: .get_length = _get_length,
! 206: .get_next_type = _get_next_type,
! 207: .set_next_type = _set_next_type,
! 208: .get_type = _get_type,
! 209: .destroy = _destroy,
! 210: },
! 211: .set_auth_method = _set_auth_method,
! 212: .get_auth_method = _get_auth_method,
! 213: .set_data = _set_data,
! 214: .get_data = _get_data,
! 215: .destroy = _destroy,
! 216: },
! 217: .next_payload = PL_NONE,
! 218: .payload_length = get_header_length(this),
! 219: );
! 220: return &this->public;
! 221: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>