Annotation of embedaddon/strongswan/src/libpttls/pt_tls.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2012 Martin Willi
                      3:  * Copyright (C) 2012 revosec AG
                      4:  *
                      5:  * This program is free software; you can redistribute it and/or modify it
                      6:  * under the terms of the GNU General Public License as published by the
                      7:  * Free Software Foundation; either version 2 of the License, or (at your
                      8:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                      9:  *
                     10:  * This program is distributed in the hope that it will be useful, but
                     11:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     13:  * for more details.
                     14:  */
                     15: 
                     16: #include "pt_tls.h"
                     17: 
                     18: #include <utils/debug.h>
                     19: #include <pen/pen.h>
                     20: 
                     21: /**
                     22:  * Described in header.
                     23:  */
                     24: void libpttls_init(void)
                     25: {
                     26:        /* empty */
                     27: }
                     28: 
                     29: /*
                     30:  * PT-TNC Message format:
                     31:  *                       1                   2                   3
                     32:  *   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
                     33:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     34:  *  |    Reserved   |           Message Type Vendor ID              |
                     35:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     36:  *  |                          Message Type                         |
                     37:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     38:  *  |                         Message Length                        |
                     39:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     40:  *  |                       Message Identifier                      |
                     41:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     42:  *  |                Message Value (e.g. PB-TNC Batch) . . .        |
                     43:  *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                     44:  */
                     45: 
                     46: ENUM(pt_tls_message_type_names, PT_TLS_EXPERIMENTAL, PT_TLS_ERROR,
                     47:        "Experimental",
                     48:        "Version Request",
                     49:        "Version Response",
                     50:        "SASL Mechanisms",
                     51:        "SASL Mechanism Selection",
                     52:        "SASL Authentication Data",
                     53:        "SASL Result",
                     54:        "PB-TNC Batch",
                     55:        "PT-TLS Error"
                     56: );
                     57: 
                     58: ENUM(pt_tls_sasl_result_names, PT_TLS_SASL_RESULT_SUCCESS,
                     59:                                                           PT_TLS_SASL_RESULT_MECH_FAILURE,
                     60:        "Success",
                     61:        "Failure",
                     62:        "Abort",
                     63:        "Mechanism Failure"
                     64: );
                     65: 
                     66: /**
                     67:  * Read a chunk of data from TLS, returning a reader for it
                     68:  */
                     69: static bio_reader_t* read_tls(tls_socket_t *tls, size_t len)
                     70: {
                     71:        ssize_t got, total = 0;
                     72:        char *buf;
                     73: 
                     74:        buf = malloc(len);
                     75:        while (total < len)
                     76:        {
                     77:                got = tls->read(tls, buf + total, len - total, TRUE);
                     78:                if (got <= 0)
                     79:                {
                     80:                        free(buf);
                     81:                        return NULL;
                     82:                }
                     83:                total += got;
                     84:        }
                     85:        return bio_reader_create_own(chunk_create(buf, len));
                     86: }
                     87: 
                     88: /**
                     89:  * Read a PT-TLS message, return header data
                     90:  */
                     91: bio_reader_t* pt_tls_read(tls_socket_t *tls, uint32_t *vendor,
                     92:                                                  uint32_t *type, uint32_t *identifier)
                     93: {
                     94:        bio_reader_t *reader;
                     95:        uint32_t len;
                     96:        uint8_t reserved;
                     97: 
                     98:        reader = read_tls(tls, PT_TLS_HEADER_LEN);
                     99:        if (!reader)
                    100:        {
                    101:                return NULL;
                    102:        }
                    103:        if (!reader->read_uint8(reader, &reserved) ||
                    104:                !reader->read_uint24(reader, vendor) ||
                    105:                !reader->read_uint32(reader, type) ||
                    106:                !reader->read_uint32(reader, &len) ||
                    107:                !reader->read_uint32(reader, identifier))
                    108:        {
                    109:                reader->destroy(reader);
                    110:                return NULL;
                    111:        }
                    112:        reader->destroy(reader);
                    113: 
                    114:        if (len < PT_TLS_HEADER_LEN)
                    115:        {
                    116:                DBG1(DBG_TNC, "received short PT-TLS header (%d bytes)", len);
                    117:                return NULL;
                    118:        }
                    119: 
                    120:        if (*vendor == PEN_IETF)
                    121:        {
                    122:                DBG2(DBG_TNC, "received PT-TLS message #%d of type '%N' (%d bytes)",
                    123:                                          *identifier, pt_tls_message_type_names, *type, len);
                    124:        }
                    125:        else
                    126:        {
                    127:                DBG2(DBG_TNC, "received PT-TLS message #%d of unknown type "
                    128:                                          "0x%06x/0x%08x (%d bytes)",
                    129:                                          *identifier, *vendor, *type, len);
                    130:        }
                    131: 
                    132:        return read_tls(tls, len - PT_TLS_HEADER_LEN);
                    133: }
                    134: 
                    135: /**
                    136:  * Prepend a PT-TLS header to a writer, send data, destroy writer
                    137:  */
                    138: bool pt_tls_write(tls_socket_t *tls, pt_tls_message_type_t type,
                    139:                                  uint32_t identifier, chunk_t data)
                    140: {
                    141:        bio_writer_t *writer;
                    142:        chunk_t out;
                    143:        ssize_t len;
                    144: 
                    145:        len = PT_TLS_HEADER_LEN + data.len;
                    146:        writer = bio_writer_create(len);
                    147: 
                    148:        /* write PT-TLS header */
                    149:        writer->write_uint8 (writer, 0);
                    150:        writer->write_uint24(writer, 0);
                    151:        writer->write_uint32(writer, type);
                    152:        writer->write_uint32(writer, len);
                    153:        writer->write_uint32(writer, identifier);
                    154: 
                    155:        /* write PT-TLS body */
                    156:        writer->write_data(writer, data);
                    157: 
                    158:        DBG2(DBG_TNC, "sending PT-TLS message #%d of type '%N' (%d bytes)",
                    159:                                   identifier, pt_tls_message_type_names, type, len);
                    160: 
                    161:        out = writer->get_buf(writer);
                    162:        len = tls->write(tls, out.ptr, out.len);
                    163:        writer->destroy(writer);
                    164: 
                    165:        return len == out.len;
                    166: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>