
1: /* ssl/dtls1.h */ 2: /* 3: * DTLS implementation written by Nagendra Modadugu 4: * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 5: */ 6: /* ==================================================================== 7: * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved. 8: * 9: * Redistribution and use in source and binary forms, with or without 10: * modification, are permitted provided that the following conditions 11: * are met: 12: * 13: * 1. Redistributions of source code must retain the above copyright 14: * notice, this list of conditions and the following disclaimer. 15: * 16: * 2. Redistributions in binary form must reproduce the above copyright 17: * notice, this list of conditions and the following disclaimer in 18: * the documentation and/or other materials provided with the 19: * distribution. 20: * 21: * 3. All advertising materials mentioning features or use of this 22: * software must display the following acknowledgment: 23: * "This product includes software developed by the OpenSSL Project 24: * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25: * 26: * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27: * endorse or promote products derived from this software without 28: * prior written permission. For written permission, please contact 29: * openssl-core@OpenSSL.org. 30: * 31: * 5. Products derived from this software may not be called "OpenSSL" 32: * nor may "OpenSSL" appear in their names without prior written 33: * permission of the OpenSSL Project. 34: * 35: * 6. Redistributions of any form whatsoever must retain the following 36: * acknowledgment: 37: * "This product includes software developed by the OpenSSL Project 38: * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39: * 40: * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51: * OF THE POSSIBILITY OF SUCH DAMAGE. 52: * ==================================================================== 53: * 54: * This product includes cryptographic software written by Eric Young 55: * (eay@cryptsoft.com). This product includes software written by Tim 56: * Hudson (tjh@cryptsoft.com). 57: * 58: */ 59: 60: #ifndef HEADER_DTLS1_H 61: #define HEADER_DTLS1_H 62: 63: #include <openssl/buffer.h> 64: #include <openssl/pqueue.h> 65: 66: #ifdef __cplusplus 67: extern "C" { 68: #endif 69: 70: #define DTLS1_VERSION 0xFEFF 71: #define DTLS1_BAD_VER 0x0100 72: 73: #define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE 110 74: 75: /* lengths of messages */ 76: #define DTLS1_COOKIE_LENGTH 32 77: 78: #define DTLS1_RT_HEADER_LENGTH 13 79: 80: #define DTLS1_HM_HEADER_LENGTH 12 81: 82: #define DTLS1_HM_BAD_FRAGMENT -2 83: #define DTLS1_HM_FRAGMENT_RETRY -3 84: 85: #define DTLS1_CCS_HEADER_LENGTH 1 86: 87: #define DTLS1_AL_HEADER_LENGTH 7 88: 89: 90: typedef struct dtls1_bitmap_st 91: { 92: PQ_64BIT map; 93: unsigned long length; /* sizeof the bitmap in bits */ 94: PQ_64BIT max_seq_num; /* max record number seen so far */ 95: } DTLS1_BITMAP; 96: 97: struct hm_header_st 98: { 99: unsigned char type; 100: unsigned long msg_len; 101: unsigned short seq; 102: unsigned long frag_off; 103: unsigned long frag_len; 104: unsigned int is_ccs; 105: }; 106: 107: struct ccs_header_st 108: { 109: unsigned char type; 110: unsigned short seq; 111: }; 112: 113: struct dtls1_timeout_st 114: { 115: /* Number of read timeouts so far */ 116: unsigned int read_timeouts; 117: 118: /* Number of write timeouts so far */ 119: unsigned int write_timeouts; 120: 121: /* Number of alerts received so far */ 122: unsigned int num_alerts; 123: }; 124: 125: typedef struct record_pqueue_st 126: { 127: unsigned short epoch; 128: pqueue q; 129: } record_pqueue; 130: 131: typedef struct hm_fragment_st 132: { 133: struct hm_header_st msg_header; 134: unsigned char *fragment; 135: } hm_fragment; 136: 137: typedef struct dtls1_state_st 138: { 139: unsigned int send_cookie; 140: unsigned char cookie[DTLS1_COOKIE_LENGTH]; 141: unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH]; 142: unsigned int cookie_len; 143: 144: /* 145: * The current data and handshake epoch. This is initially 146: * undefined, and starts at zero once the initial handshake is 147: * completed 148: */ 149: unsigned short r_epoch; 150: unsigned short w_epoch; 151: 152: /* records being received in the current epoch */ 153: DTLS1_BITMAP bitmap; 154: 155: /* renegotiation starts a new set of sequence numbers */ 156: DTLS1_BITMAP next_bitmap; 157: 158: /* handshake message numbers */ 159: unsigned short handshake_write_seq; 160: unsigned short next_handshake_write_seq; 161: 162: unsigned short handshake_read_seq; 163: 164: /* Received handshake records (processed and unprocessed) */ 165: record_pqueue unprocessed_rcds; 166: record_pqueue processed_rcds; 167: 168: /* Buffered handshake messages */ 169: pqueue buffered_messages; 170: 171: /* Buffered (sent) handshake records */ 172: pqueue sent_messages; 173: 174: unsigned int mtu; /* max wire packet size */ 175: 176: struct hm_header_st w_msg_hdr; 177: struct hm_header_st r_msg_hdr; 178: 179: struct dtls1_timeout_st timeout; 180: 181: /* storage for Alert/Handshake protocol data received but not 182: * yet processed by ssl3_read_bytes: */ 183: unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH]; 184: unsigned int alert_fragment_len; 185: unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH]; 186: unsigned int handshake_fragment_len; 187: 188: unsigned int retransmitting; 189: 190: } DTLS1_STATE; 191: 192: typedef struct dtls1_record_data_st 193: { 194: unsigned char *packet; 195: unsigned int packet_length; 196: SSL3_BUFFER rbuf; 197: SSL3_RECORD rrec; 198: } DTLS1_RECORD_DATA; 199: 200: 201: /* Timeout multipliers (timeout slice is defined in apps/timeouts.h */ 202: #define DTLS1_TMO_READ_COUNT 2 203: #define DTLS1_TMO_WRITE_COUNT 2 204: 205: #define DTLS1_TMO_ALERT_COUNT 12 206: 207: #ifdef __cplusplus 208: } 209: #endif 210: #endif 211: