Annotation of embedaddon/strongswan/src/libpttls/pt_tls.c, revision 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>