return 1;
}
+#ifndef OPENSSL_NO_QUIC
static int put_quic_value(unsigned char *data, size_t value, size_t len)
{
if (data == NULL)
ossl_quic_vlint_encode_n(data, value, len);
return 1;
}
+#endif
/*
* Internal helper function used by WPACKET_close(), WPACKET_finish() and
unsigned char *buf = GETBUF(pkt);
if (buf != NULL) {
+#ifndef OPENSSL_NO_QUIC
if ((sub->flags & WPACKET_FLAGS_QUIC_VLINT) == 0) {
if (!put_value(&buf[sub->packet_len], packlen, sub->lenbytes))
return 0;
if (!put_quic_value(&buf[sub->packet_len], packlen, sub->lenbytes))
return 0;
}
+#else
+ if (!put_value(&buf[sub->packet_len], packlen, sub->lenbytes))
+ return 0;
+#endif
}
} else if (pkt->endfirst && sub->parent != NULL
&& (packlen != 0
pkt->subs = NULL;
}
+#ifndef OPENSSL_NO_QUIC
+
int WPACKET_start_quic_sub_packet_bound(WPACKET *pkt, size_t max_len)
{
size_t enclen = ossl_quic_vlint_encode_len(max_len);
ossl_quic_vlint_encode(b, v);
return 1;
}
+
+#endif
#include "internal/quic_vlint.h"
#include "internal/e_os.h"
+#ifndef OPENSSL_NO_QUIC
+
void ossl_quic_vlint_encode_n(uint8_t *buf, uint64_t v, int n)
{
if (n == 1) {
*v = x;
return dec_len;
}
+
+#endif
return 1;
}
+# ifndef OPENSSL_NO_QUIC
+
/*
* Decodes a QUIC variable-length integer in |pkt| and stores the result in
* |data|.
return 1;
}
+# endif
+
/* Equivalent of n2l */
/* Get 4 bytes in network order from |pkt| and store the value in |*data| */
__owur static ossl_inline int PACKET_get_net_4(PACKET *pkt, unsigned long *data)
return 1;
}
+# ifndef OPENSSL_NO_QUIC
+
/*
* Reads a variable-length vector prefixed with a QUIC variable-length integer
* denoting the length, and stores the contents in |subpkt|. |pkt| can equal
return 1;
}
+# endif
+
/* Writeable packets */
typedef struct wpacket_sub WPACKET_SUB;
/* Release resources in a WPACKET if a failure has occurred. */
void WPACKET_cleanup(WPACKET *pkt);
+# ifndef OPENSSL_NO_QUIC
+
/*
* Starts a QUIC sub-packet headed by a QUIC variable-length integer. A 4-byte
* representation is used.
*/
__owur int WPACKET_quic_write_vlint(WPACKET *pkt, uint64_t v);
+# endif
+
#endif /* OSSL_INTERNAL_PACKET_H */
# include "internal/time.h"
# include "internal/list.h"
+# ifndef OPENSSL_NO_QUIC
+
typedef struct ossl_ackm_st OSSL_ACKM;
OSSL_ACKM *ossl_ackm_new(OSSL_TIME (*now)(void *arg),
int ossl_ackm_on_tx_packet(OSSL_ACKM *ackm, OSSL_ACKM_TX_PKT *pkt);
int ossl_ackm_on_rx_datagram(OSSL_ACKM *ackm, size_t num_bytes);
-#define OSSL_ACKM_ECN_NONE 0
-#define OSSL_ACKM_ECN_ECT1 1
-#define OSSL_ACKM_ECN_ECT0 2
-#define OSSL_ACKM_ECN_ECNCE 3
+# define OSSL_ACKM_ECN_NONE 0
+# define OSSL_ACKM_ECN_ECT1 1
+# define OSSL_ACKM_ECN_ECT0 2
+# define OSSL_ACKM_ECN_ECNCE 3
typedef struct ossl_ackm_rx_pkt_st {
/* The packet number of the received packet. */
*/
OSSL_TIME ossl_ackm_get_pto_duration(OSSL_ACKM *ackm);
+# endif
+
#endif
#include "openssl/params.h"
#include "internal/time.h"
+# ifndef OPENSSL_NO_QUIC
+
typedef struct ossl_cc_data_st *OSSL_CC_DATA;
typedef struct ossl_cc_method_st {
extern const OSSL_CC_METHOD ossl_cc_dummy_method;
+# endif
+
#endif
# include <openssl/ssl.h>
# include "internal/quic_types.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Control Frame Queue Item
* =============================
/* All other fields are private; use ossl_quic_cfq_item_* accessors. */
};
-#define QUIC_CFQ_STATE_NEW 0
-#define QUIC_CFQ_STATE_TX 1
+# define QUIC_CFQ_STATE_NEW 0
+# define QUIC_CFQ_STATE_TX 1
/* Returns the frame type of a CFQ item. */
uint64_t ossl_quic_cfq_item_get_frame_type(const QUIC_CFQ_ITEM *item);
QUIC_CFQ_ITEM *ossl_quic_cfq_item_get_priority_next(const QUIC_CFQ_ITEM *item,
uint32_t pn_space);
+# endif
+
#endif
# include "internal/quic_statm.h"
# include "internal/time.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Channel
* ============
* currently modelled.
*/
-#define QUIC_CHANNEL_STATE_IDLE 0
-#define QUIC_CHANNEL_STATE_ACTIVE 1
-#define QUIC_CHANNEL_STATE_TERMINATING_CLOSING 2
-#define QUIC_CHANNEL_STATE_TERMINATING_DRAINING 3
-#define QUIC_CHANNEL_STATE_TERMINATED 4
+# define QUIC_CHANNEL_STATE_IDLE 0
+# define QUIC_CHANNEL_STATE_ACTIVE 1
+# define QUIC_CHANNEL_STATE_TERMINATING_CLOSING 2
+# define QUIC_CHANNEL_STATE_TERMINATING_DRAINING 3
+# define QUIC_CHANNEL_STATE_TERMINATED 4
typedef struct quic_channel_args_st {
OSSL_LIB_CTX *libctx;
int ossl_quic_channel_is_active(const QUIC_CHANNEL *ch);
int ossl_quic_channel_is_handshake_complete(const QUIC_CHANNEL *ch);
+# endif
+
#endif
# include "internal/time.h"
# include "internal/list.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Demuxer
* ============
const BIO_ADDR *peer,
const BIO_ADDR *local);
+# endif
+
#endif
# include <openssl/ssl.h>
# include "internal/quic_stream.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Dummy Handshake Module
* ===========================
const unsigned char *transport_params,
size_t transport_params_len);
+# endif
+
#endif
# include <openssl/ssl.h>
+# ifndef OPENSSL_NO_QUIC
+
/* RFC 9000 Section 20.1 */
-# define QUIC_ERR_NO_ERROR 0x00
-# define QUIC_ERR_INTERNAL_ERROR 0x01
-# define QUIC_ERR_CONNECTION_REFUSED 0x02
-# define QUIC_ERR_FLOW_CONTROL_ERROR 0x03
-# define QUIC_ERR_STREAM_LIMIT_ERROR 0x04
-# define QUIC_ERR_STREAM_STATE_ERROR 0x05
-# define QUIC_ERR_FINAL_SIZE_ERROR 0x06
-# define QUIC_ERR_FRAME_ENCODING_ERROR 0x07
-# define QUIC_ERR_TRANSPORT_PARAMETER_ERROR 0x08
-# define QUIC_ERR_CONNECTION_ID_LIMIT_ERROR 0x09
-# define QUIC_ERR_PROTOCOL_VIOLATION 0x0A
-# define QUIC_ERR_INVALID_TOKEN 0x0B
-# define QUIC_ERR_APPLICATION_ERROR 0x0C
-# define QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D
-# define QUIC_ERR_KEY_UPDATE_ERROR 0x0E
-# define QUIC_ERR_AEAD_LIMIT_REACHED 0x0F
-# define QUIC_ERR_NO_VIABLE_PATH 0x10
+# define QUIC_ERR_NO_ERROR 0x00
+# define QUIC_ERR_INTERNAL_ERROR 0x01
+# define QUIC_ERR_CONNECTION_REFUSED 0x02
+# define QUIC_ERR_FLOW_CONTROL_ERROR 0x03
+# define QUIC_ERR_STREAM_LIMIT_ERROR 0x04
+# define QUIC_ERR_STREAM_STATE_ERROR 0x05
+# define QUIC_ERR_FINAL_SIZE_ERROR 0x06
+# define QUIC_ERR_FRAME_ENCODING_ERROR 0x07
+# define QUIC_ERR_TRANSPORT_PARAMETER_ERROR 0x08
+# define QUIC_ERR_CONNECTION_ID_LIMIT_ERROR 0x09
+# define QUIC_ERR_PROTOCOL_VIOLATION 0x0A
+# define QUIC_ERR_INVALID_TOKEN 0x0B
+# define QUIC_ERR_APPLICATION_ERROR 0x0C
+# define QUIC_ERR_CRYPTO_BUFFER_EXCEEDED 0x0D
+# define QUIC_ERR_KEY_UPDATE_ERROR 0x0E
+# define QUIC_ERR_AEAD_LIMIT_REACHED 0x0F
+# define QUIC_ERR_NO_VIABLE_PATH 0x10
/* Inclusive range for handshake-specific errors. */
-# define QUIC_ERR_CRYPTO_ERR_BEGIN 0x0100
-# define QUUC_ERR_CRYPTO_ERR_END 0x01FF
+# define QUIC_ERR_CRYPTO_ERR_BEGIN 0x0100
+# define QUUC_ERR_CRYPTO_ERR_END 0x01FF
+
+# endif
#endif
# include <openssl/ssl.h>
# include "internal/time.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* TX Flow Controller (TXFC)
* =========================
*/
int ossl_quic_rxfc_get_error(QUIC_RXFC *rxfc, int clear);
+# endif
+
#endif
# include "internal/quic_txpim.h"
# include "internal/quic_stream.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Frame-in-Flight Dispatcher (FIFD)
* ======================================
int ossl_quic_fifd_pkt_commit(QUIC_FIFD *fifd, QUIC_TXPIM_PKT *pkt);
+# endif
+
#endif
# include "internal/sockets.h"
# include <openssl/bio.h>
+# ifndef OPENSSL_NO_QUIC
+
/*
* Core I/O Reactor Framework
* ==========================
* adaptation layer on top of our internal asynchronous I/O API as exposed by
* the reactor interface.
*/
-# ifndef OPENSSL_NO_QUIC
-
typedef struct quic_tick_result_st {
char want_net_read;
char want_net_write;
# include "internal/quic_record_util.h"
# include "internal/quic_demux.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Record Layer - RX
* ======================
uint64_t ossl_qrx_get_max_forged_pkt_count(OSSL_QRX *qrx,
uint32_t enc_level);
+# endif
+
#endif
# include "internal/quic_types.h"
# include "internal/quic_record_util.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Record Layer - TX
* ======================
*/
uint64_t ossl_qtx_get_max_epoch_pkt_count(OSSL_QTX *qtx, uint32_t enc_level);
+# endif
+
#endif
# include <openssl/ssl.h>
# include "internal/quic_types.h"
+# ifndef OPENSSL_NO_QUIC
+
struct ossl_qrx_st;
struct ossl_qtx_st;
*/
uint64_t ossl_qrl_get_suite_max_forged_pkt(uint32_t suite_id);
+# endif
+
#endif
# include "internal/quic_channel.h"
+# ifndef OPENSSL_NO_QUIC
+
int ossl_quic_handle_frames(QUIC_CHANNEL *qc, OSSL_QRX_PKT *qpacket);
+# endif
+
#endif
* able to mark an empty frame.
* Invariant: The offset never points further than into the first frame.
*/
+# ifndef OPENSSL_NO_QUIC
typedef struct stream_frame_st STREAM_FRAME;
int *fin);
int ossl_sframe_list_drop_frames(SFRAME_LIST *fl, uint64_t limit);
+# endif
+
#endif
# include "internal/quic_record_rx.h" /* OSSL_QRX */
# include "internal/quic_ackm.h" /* OSSL_ACKM */
+# ifndef OPENSSL_NO_QUIC
+
__owur SSL *ossl_quic_new(SSL_CTX *ctx);
__owur int ossl_quic_init(SSL *s);
void ossl_quic_deinit(SSL *s);
__owur int ossl_quic_conn_set_initial_peer_addr(QUIC_CONNECTION *qc,
const BIO_ADDR *peer_addr);
+# endif
+
#endif
# include <openssl/ssl.h>
# include "internal/time.h"
+# ifndef OPENSSL_NO_QUIC
+
typedef struct ossl_statm_st {
OSSL_TIME smoothed_rtt, latest_rtt, min_rtt, rtt_variance, max_ack_delay;
char have_first_sample;
void ossl_statm_set_max_ack_delay(OSSL_STATM *statm, OSSL_TIME max_ack_delay);
+# endif
+
#endif
#include "internal/quic_fc.h"
#include "internal/quic_statm.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Send Stream
* ================
*/
int ossl_quic_rstream_available(QUIC_RSTREAM *qrs, size_t *avail, int *fin);
+# endif
+
#endif
# include "internal/bio_addr.h"
# include "internal/time.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC TX Packetiser
* ==================
int ossl_quic_tx_packetiser_schedule_conn_close(OSSL_QUIC_TX_PACKETISER *txp,
const OSSL_QUIC_FRAME_CONN_CLOSE *f);
+# endif
+
#endif
# include "internal/quic_cfq.h"
# include "internal/quic_ackm.h"
+# ifndef OPENSSL_NO_QUIC
+
/*
* QUIC Transmitted Packet Information Manager
* ===========================================
*/
size_t ossl_quic_txpim_get_in_use(const QUIC_TXPIM *txpim);
+# endif
+
#endif
# include <assert.h>
# include <string.h>
+# ifndef OPENSSL_NO_QUIC
+
/* QUIC encryption levels. */
-#define QUIC_ENC_LEVEL_INITIAL 0
-#define QUIC_ENC_LEVEL_HANDSHAKE 1
-#define QUIC_ENC_LEVEL_0RTT 2
-#define QUIC_ENC_LEVEL_1RTT 3
-#define QUIC_ENC_LEVEL_NUM 4
+# define QUIC_ENC_LEVEL_INITIAL 0
+# define QUIC_ENC_LEVEL_HANDSHAKE 1
+# define QUIC_ENC_LEVEL_0RTT 2
+# define QUIC_ENC_LEVEL_1RTT 3
+# define QUIC_ENC_LEVEL_NUM 4
/* QUIC packet number spaces. */
-#define QUIC_PN_SPACE_INITIAL 0
-#define QUIC_PN_SPACE_HANDSHAKE 1
-#define QUIC_PN_SPACE_APP 2
-#define QUIC_PN_SPACE_NUM 3
+# define QUIC_PN_SPACE_INITIAL 0
+# define QUIC_PN_SPACE_HANDSHAKE 1
+# define QUIC_PN_SPACE_APP 2
+# define QUIC_PN_SPACE_NUM 3
static ossl_unused ossl_inline uint32_t
ossl_quic_enc_level_to_pn_space(uint32_t enc_level)
}
/* QUIC packet number spaces. */
-#define QUIC_PN_SPACE_INITIAL 0
-#define QUIC_PN_SPACE_HANDSHAKE 1
-#define QUIC_PN_SPACE_APP 2
-#define QUIC_PN_SPACE_NUM 3
+# define QUIC_PN_SPACE_INITIAL 0
+# define QUIC_PN_SPACE_HANDSHAKE 1
+# define QUIC_PN_SPACE_APP 2
+# define QUIC_PN_SPACE_NUM 3
/* QUIC packet number representation. */
typedef uint64_t QUIC_PN;
-# define QUIC_PN_INVALID UINT64_MAX
+# define QUIC_PN_INVALID UINT64_MAX
static ossl_unused ossl_inline QUIC_PN ossl_quic_pn_max(QUIC_PN a, QUIC_PN b)
{
}
/* QUIC connection ID representation. */
-#define QUIC_MAX_CONN_ID_LEN 20
+# define QUIC_MAX_CONN_ID_LEN 20
typedef struct quic_conn_id_st {
unsigned char id_len, id[QUIC_MAX_CONN_ID_LEN];
return memcmp(a->id, b->id, a->id_len) == 0;
}
-#define QUIC_MIN_INITIAL_DGRAM_LEN 1200
+# define QUIC_MIN_INITIAL_DGRAM_LEN 1200
-#define QUIC_DEFAULT_ACK_DELAY_EXP 3
-#define QUIC_MAX_ACK_DELAY_EXP 20
+# define QUIC_DEFAULT_ACK_DELAY_EXP 3
+# define QUIC_MAX_ACK_DELAY_EXP 20
-#define QUIC_DEFAULT_MAX_ACK_DELAY 25
+# define QUIC_DEFAULT_MAX_ACK_DELAY 25
-#define QUIC_MIN_ACTIVE_CONN_ID_LIMIT 2
+# define QUIC_MIN_ACTIVE_CONN_ID_LIMIT 2
/* Arbitrary choice of default idle timeout (not an RFC value). */
-#define QUIC_DEFAULT_IDLE_TIMEOUT 30000
+# define QUIC_DEFAULT_IDLE_TIMEOUT 30000
+
+# endif
#endif
# define OSSL_INTERNAL_QUIC_VLINT_H
# pragma once
-#include "internal/e_os.h"
+# include "internal/e_os.h"
+
+# ifndef OPENSSL_NO_QUIC
/* The smallest value requiring a 1, 2, 4, or 8-byte representation. */
#define OSSL_QUIC_VLINT_1B_MIN 0
*/
int ossl_quic_vlint_decode(const unsigned char *buf, size_t buf_len, uint64_t *v);
+# endif
+
#endif
# define OSSL_INTERNAL_QUIC_WIRE_H
# pragma once
-#include "internal/e_os.h"
-#include "internal/time.h"
-#include "internal/quic_types.h"
-#include "internal/packet.h"
-
-#define OSSL_QUIC_FRAME_TYPE_PADDING 0x00
-#define OSSL_QUIC_FRAME_TYPE_PING 0x01
-#define OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN 0x02
-#define OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN 0x03
-#define OSSL_QUIC_FRAME_TYPE_RESET_STREAM 0x04
-#define OSSL_QUIC_FRAME_TYPE_STOP_SENDING 0x05
-#define OSSL_QUIC_FRAME_TYPE_CRYPTO 0x06
-#define OSSL_QUIC_FRAME_TYPE_NEW_TOKEN 0x07
-#define OSSL_QUIC_FRAME_TYPE_MAX_DATA 0x10
-#define OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA 0x11
-#define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI 0x12
-#define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI 0x13
-#define OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED 0x14
-#define OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED 0x15
-#define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI 0x16
-#define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI 0x17
-#define OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID 0x18
-#define OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID 0x19
-#define OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE 0x1A
-#define OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE 0x1B
-#define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT 0x1C
-#define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP 0x1D
-#define OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE 0x1E
-
-#define OSSL_QUIC_FRAME_FLAG_STREAM_FIN 0x01
-#define OSSL_QUIC_FRAME_FLAG_STREAM_LEN 0x02
-#define OSSL_QUIC_FRAME_FLAG_STREAM_OFF 0x04
-#define OSSL_QUIC_FRAME_FLAG_STREAM_MASK ((uint64_t)0x07)
+# include "internal/e_os.h"
+# include "internal/time.h"
+# include "internal/quic_types.h"
+# include "internal/packet.h"
+
+# ifndef OPENSSL_NO_QUIC
+
+# define OSSL_QUIC_FRAME_TYPE_PADDING 0x00
+# define OSSL_QUIC_FRAME_TYPE_PING 0x01
+# define OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN 0x02
+# define OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN 0x03
+# define OSSL_QUIC_FRAME_TYPE_RESET_STREAM 0x04
+# define OSSL_QUIC_FRAME_TYPE_STOP_SENDING 0x05
+# define OSSL_QUIC_FRAME_TYPE_CRYPTO 0x06
+# define OSSL_QUIC_FRAME_TYPE_NEW_TOKEN 0x07
+# define OSSL_QUIC_FRAME_TYPE_MAX_DATA 0x10
+# define OSSL_QUIC_FRAME_TYPE_MAX_STREAM_DATA 0x11
+# define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI 0x12
+# define OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_UNI 0x13
+# define OSSL_QUIC_FRAME_TYPE_DATA_BLOCKED 0x14
+# define OSSL_QUIC_FRAME_TYPE_STREAM_DATA_BLOCKED 0x15
+# define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI 0x16
+# define OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_UNI 0x17
+# define OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID 0x18
+# define OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID 0x19
+# define OSSL_QUIC_FRAME_TYPE_PATH_CHALLENGE 0x1A
+# define OSSL_QUIC_FRAME_TYPE_PATH_RESPONSE 0x1B
+# define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT 0x1C
+# define OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP 0x1D
+# define OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE 0x1E
+
+# define OSSL_QUIC_FRAME_FLAG_STREAM_FIN 0x01
+# define OSSL_QUIC_FRAME_FLAG_STREAM_LEN 0x02
+# define OSSL_QUIC_FRAME_FLAG_STREAM_OFF 0x04
+# define OSSL_QUIC_FRAME_FLAG_STREAM_MASK ((uint64_t)0x07)
/* Low 3 bits of the type contain flags */
-#define OSSL_QUIC_FRAME_TYPE_STREAM 0x08 /* base ID */
-#define OSSL_QUIC_FRAME_TYPE_STREAM_FIN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM 0x08 /* base ID */
+# define OSSL_QUIC_FRAME_TYPE_STREAM_FIN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_LEN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_LEN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
- OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
+ OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_OFF \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_OFF \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
OSSL_QUIC_FRAME_FLAG_STREAM_OFF)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
- OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
+ OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
- OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
+ OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
OSSL_QUIC_FRAME_FLAG_STREAM_LEN)
-#define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN \
- (OSSL_QUIC_FRAME_TYPE_STREAM | \
- OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
- OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
+# define OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN \
+ (OSSL_QUIC_FRAME_TYPE_STREAM | \
+ OSSL_QUIC_FRAME_FLAG_STREAM_OFF | \
+ OSSL_QUIC_FRAME_FLAG_STREAM_LEN | \
OSSL_QUIC_FRAME_FLAG_STREAM_FIN)
-#define OSSL_QUIC_FRAME_TYPE_IS_STREAM(x) \
+# define OSSL_QUIC_FRAME_TYPE_IS_STREAM(x) \
(((x) & ~OSSL_QUIC_FRAME_FLAG_STREAM_MASK) == OSSL_QUIC_FRAME_TYPE_STREAM)
-#define OSSL_QUIC_FRAME_TYPE_IS_ACK(x) \
+# define OSSL_QUIC_FRAME_TYPE_IS_ACK(x) \
(((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
-#define OSSL_QUIC_FRAME_TYPE_IS_MAX_STREAMS(x) \
+# define OSSL_QUIC_FRAME_TYPE_IS_MAX_STREAMS(x) \
(((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_MAX_STREAMS_BIDI)
-#define OSSL_QUIC_FRAME_TYPE_IS_STREAMS_BLOCKED(x) \
+# define OSSL_QUIC_FRAME_TYPE_IS_STREAMS_BLOCKED(x) \
(((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_STREAMS_BLOCKED_BIDI)
-#define OSSL_QUIC_FRAME_TYPE_IS_CONN_CLOSE(x) \
+# define OSSL_QUIC_FRAME_TYPE_IS_CONN_CLOSE(x) \
(((x) & ~(uint64_t)1) == OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
static ossl_unused ossl_inline int
}
/* QUIC Transport Parameter Types */
-#define QUIC_TPARAM_ORIG_DCID 0x00
-#define QUIC_TPARAM_MAX_IDLE_TIMEOUT 0x01
-#define QUIC_TPARAM_STATELESS_RESET_TOKEN 0x02
-#define QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE 0x03
-#define QUIC_TPARAM_INITIAL_MAX_DATA 0x04
-#define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05
-#define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06
-#define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07
-#define QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI 0x08
-#define QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI 0x09
-#define QUIC_TPARAM_ACK_DELAY_EXP 0x0A
-#define QUIC_TPARAM_MAX_ACK_DELAY 0x0B
-#define QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION 0x0C
-#define QUIC_TPARAM_PREFERRED_ADDR 0x0D
-#define QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT 0x0E
-#define QUIC_TPARAM_INITIAL_SCID 0x0F
-#define QUIC_TPARAM_RETRY_SCID 0x10
+# define QUIC_TPARAM_ORIG_DCID 0x00
+# define QUIC_TPARAM_MAX_IDLE_TIMEOUT 0x01
+# define QUIC_TPARAM_STATELESS_RESET_TOKEN 0x02
+# define QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE 0x03
+# define QUIC_TPARAM_INITIAL_MAX_DATA 0x04
+# define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL 0x05
+# define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE 0x06
+# define QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI 0x07
+# define QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI 0x08
+# define QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI 0x09
+# define QUIC_TPARAM_ACK_DELAY_EXP 0x0A
+# define QUIC_TPARAM_MAX_ACK_DELAY 0x0B
+# define QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION 0x0C
+# define QUIC_TPARAM_PREFERRED_ADDR 0x0D
+# define QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT 0x0E
+# define QUIC_TPARAM_INITIAL_SCID 0x0F
+# define QUIC_TPARAM_RETRY_SCID 0x10
/*
* QUIC Frame Logical Representations
uint64_t *id,
QUIC_CONN_ID *cid);
+# endif
+
#endif
# include "internal/packet.h"
# include "internal/quic_types.h"
-# define QUIC_VERSION_NONE ((uint32_t)0) /* Used for version negotiation */
-# define QUIC_VERSION_1 ((uint32_t)1) /* QUIC v1 */
+# ifndef OPENSSL_NO_QUIC
+
+# define QUIC_VERSION_NONE ((uint32_t)0) /* Used for version negotiation */
+# define QUIC_VERSION_1 ((uint32_t)1) /* QUIC v1 */
/* QUIC logical packet type. These do not match wire values. */
-# define QUIC_PKT_TYPE_INITIAL 1
-# define QUIC_PKT_TYPE_0RTT 2
-# define QUIC_PKT_TYPE_HANDSHAKE 3
-# define QUIC_PKT_TYPE_RETRY 4
-# define QUIC_PKT_TYPE_1RTT 5
-# define QUIC_PKT_TYPE_VERSION_NEG 6
+# define QUIC_PKT_TYPE_INITIAL 1
+# define QUIC_PKT_TYPE_0RTT 2
+# define QUIC_PKT_TYPE_HANDSHAKE 3
+# define QUIC_PKT_TYPE_RETRY 4
+# define QUIC_PKT_TYPE_1RTT 5
+# define QUIC_PKT_TYPE_VERSION_NEG 6
/*
* Determine encryption level from packet type. Returns QUIC_ENC_LEVEL_NUM if
* Smallest possible QUIC packet size as per RFC (aside from version negotiation
* packets).
*/
-#define QUIC_MIN_VALID_PKT_LEN_CRYPTO 21
-#define QUIC_MIN_VALID_PKT_LEN_VERSION_NEG 7
-#define QUIC_MIN_VALID_PKT_LEN QUIC_MIN_VALID_PKT_LEN_VERSION_NEG
+# define QUIC_MIN_VALID_PKT_LEN_CRYPTO 21
+# define QUIC_MIN_VALID_PKT_LEN_VERSION_NEG 7
+# define QUIC_MIN_VALID_PKT_LEN QUIC_MIN_VALID_PKT_LEN_VERSION_NEG
typedef struct quic_pkt_hdr_ptrs_st QUIC_PKT_HDR_PTRS;
uint32_t cipher_id;
} QUIC_HDR_PROTECTOR;
-# define QUIC_HDR_PROT_CIPHER_AES_128 1
-# define QUIC_HDR_PROT_CIPHER_AES_256 2
-# define QUIC_HDR_PROT_CIPHER_CHACHA 3
+# define QUIC_HDR_PROT_CIPHER_AES_128 1
+# define QUIC_HDR_PROT_CIPHER_AES_256 2
+# define QUIC_HDR_PROT_CIPHER_CHACHA 3
/*
* Initialises a header protector.
* ====================
*/
-#define QUIC_RETRY_INTEGRITY_TAG_LEN 16
+# define QUIC_RETRY_INTEGRITY_TAG_LEN 16
/*
* Validate a retry integrity tag. Returns 1 if the tag is valid.
const QUIC_CONN_ID *client_initial_dcid,
unsigned char *tag);
+# endif
+
#endif
QUIC_DHS_ARGS dhs_args = {0};
uint32_t pn_space;
- // TODO CLIENT ONLY
+ /* TODO(QUIC): This is only applicable to clients. */
if (!gen_rand_conn_id(ch->libctx, INIT_DCID_LEN, &ch->init_dcid))
goto err;
int SSL_accept(SSL *s)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
+#ifndef OPENSSL_NO_QUIC
QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_SSL(s);
if (qc != NULL)
return s->method->ssl_accept(s);
+#endif
if (sc == NULL)
return 0;
int SSL_connect(SSL *s)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
+#ifndef OPENSSL_NO_QUIC
QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_SSL(s);
if (qc != NULL)
return s->method->ssl_connect(s);
+#endif
if (sc == NULL)
return 0;
int ssl_read_internal(SSL *s, void *buf, size_t num, size_t *readbytes)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
+#ifndef OPENSSL_NO_QUIC
QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_SSL(s);
if (qc != NULL)
return s->method->ssl_read(s, buf, num, readbytes);
+#endif
if (sc == NULL)
return -1;
static int ssl_peek_internal(SSL *s, void *buf, size_t num, size_t *readbytes)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
+#ifndef OPENSSL_NO_QUIC
QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_SSL(s);
if (qc != NULL)
return s->method->ssl_peek(s, buf, num, readbytes);
+#endif
if (sc == NULL)
return 0;
int ssl_write_internal(SSL *s, const void *buf, size_t num, size_t *written)
{
SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);
+#ifndef OPENSSL_NO_QUIC
QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_SSL(s);
if (qc != NULL)
return s->method->ssl_write(s, buf, num, written);
+#endif
if (sc == NULL)
return 0;
const char *SSL_get_version(const SSL *s)
{
const SSL_CONNECTION *sc = SSL_CONNECTION_FROM_CONST_SSL(s);
+#ifndef OPENSSL_NO_QUIC
const QUIC_CONNECTION *qc = QUIC_CONNECTION_FROM_CONST_SSL(s);
if (qc != NULL)
return "QUIC";
+#endif
if (sc == NULL)
return NULL;
return 1;
}
+#ifndef OPENSSL_NO_QUIC
+
static int test_PACKET_get_quic_vlint(void)
{
struct quic_test_case {
return 1;
}
+#endif
+
int setup_tests(void)
{
unsigned int i;
ADD_TEST(test_PACKET_get_length_prefixed_3);
ADD_TEST(test_PACKET_as_length_prefixed_1);
ADD_TEST(test_PACKET_as_length_prefixed_2);
+#ifndef OPENSSL_NO_QUIC
ADD_TEST(test_PACKET_get_quic_vlint);
ADD_TEST(test_PACKET_get_quic_length_prefixed);
+#endif
return 1;
}
0xfc, 0x04, 0x00, 0x01, 0x02, 0x03, 0xff, 0xfe, 0xfd
};
+#ifndef OPENSSL_NO_QUIC
+
/* QUIC sub-packet with 4-byte length prefix, containing a 1-byte vlint */
static const unsigned char quic1[] = { 0x80, 0x00, 0x00, 0x01, 0x09 };
/* QUIC sub-packet with 1-byte length prefix, containing a 1-byte vlint */
0x40, 0x01, 0x11, 0x40, 0x01, 0x12, 0x40, 0x01, 0x13
};
+#endif
+
static BUF_MEM *buf;
static int cleanup(WPACKET *pkt)
return 1;
}
+#ifndef OPENSSL_NO_QUIC
+
static int test_WPACKET_quic(void)
{
WPACKET pkt;
return 1;
}
+#endif
+
int setup_tests(void)
{
if (!TEST_ptr(buf = BUF_MEM_new()))
ADD_TEST(test_WPACKET_allocate_bytes);
ADD_TEST(test_WPACKET_memcpy);
ADD_TEST(test_WPACKET_init_der);
+#ifndef OPENSSL_NO_QUIC
ADD_TEST(test_WPACKET_quic);
ADD_TEST(test_WPACKET_quic_vlint_random);
+#endif
return 1;
}