1255767Sdes/* $OpenBSD: buffer.h,v 1.22 2013/07/12 00:19:58 djm Exp $ */
2224638Sbrooks/* $FreeBSD$ */
392555Sdes
457429Smarkm/*
557429Smarkm * Author: Tatu Ylonen <ylo@cs.hut.fi>
657429Smarkm * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
757429Smarkm *                    All rights reserved
857429Smarkm * Code for manipulating FIFO buffers.
960573Skris *
1065668Skris * As far as I am concerned, the code I have written for this software
1165668Skris * can be used freely for any purpose.  Any derived versions of this
1265668Skris * software must be clearly marked as such, and if the derived work is
1365668Skris * incompatible with the protocol description in the RFC file, it must be
1465668Skris * called by a name other than "ssh" or "Secure Shell".
1557429Smarkm */
1657429Smarkm
1757429Smarkm#ifndef BUFFER_H
1857429Smarkm#define BUFFER_H
1957429Smarkm
2057429Smarkmtypedef struct {
2192555Sdes	u_char	*buf;		/* Buffer for data. */
2292555Sdes	u_int	 alloc;		/* Number of bytes allocated for data. */
2392555Sdes	u_int	 offset;	/* Offset of first byte containing data. */
2492555Sdes	u_int	 end;		/* Offset of last byte containing data. */
2557429Smarkm}       Buffer;
2657429Smarkm
2792555Sdesvoid	 buffer_init(Buffer *);
2892555Sdesvoid	 buffer_clear(Buffer *);
2992555Sdesvoid	 buffer_free(Buffer *);
3057429Smarkm
31204917Sdesu_int	 buffer_len(const Buffer *);
32204917Sdesvoid	*buffer_ptr(const Buffer *);
3357429Smarkm
3492555Sdesvoid	 buffer_append(Buffer *, const void *, u_int);
3592555Sdesvoid	*buffer_append_space(Buffer *, u_int);
3657429Smarkm
37162852Sdesint	 buffer_check_alloc(Buffer *, u_int);
38162852Sdes
3992555Sdesvoid	 buffer_get(Buffer *, void *, u_int);
4057429Smarkm
4192555Sdesvoid	 buffer_consume(Buffer *, u_int);
4292555Sdesvoid	 buffer_consume_end(Buffer *, u_int);
4357429Smarkm
44204917Sdesvoid     buffer_dump(const Buffer *);
4557429Smarkm
46146998Sdesint	 buffer_get_ret(Buffer *, void *, u_int);
47146998Sdesint	 buffer_consume_ret(Buffer *, u_int);
48146998Sdesint	 buffer_consume_end_ret(Buffer *, u_int);
49146998Sdes
50224638Sbrooksu_int	 buffer_get_max_len(void);
51224638Sbrooks
52162852Sdes#include <openssl/bn.h>
53162852Sdes
54162852Sdesvoid    buffer_put_bignum(Buffer *, const BIGNUM *);
55162852Sdesvoid    buffer_put_bignum2(Buffer *, const BIGNUM *);
56162852Sdesvoid	buffer_get_bignum(Buffer *, BIGNUM *);
57162852Sdesvoid	buffer_get_bignum2(Buffer *, BIGNUM *);
58162852Sdes
59162852Sdesu_short	buffer_get_short(Buffer *);
60162852Sdesvoid	buffer_put_short(Buffer *, u_short);
61162852Sdes
62162852Sdesu_int	buffer_get_int(Buffer *);
63162852Sdesvoid    buffer_put_int(Buffer *, u_int);
64162852Sdes
65162852Sdesu_int64_t buffer_get_int64(Buffer *);
66162852Sdesvoid	buffer_put_int64(Buffer *, u_int64_t);
67162852Sdes
68162852Sdesint     buffer_get_char(Buffer *);
69162852Sdesvoid    buffer_put_char(Buffer *, int);
70162852Sdes
71162852Sdesvoid   *buffer_get_string(Buffer *, u_int *);
72181111Sdesvoid   *buffer_get_string_ptr(Buffer *, u_int *);
73162852Sdesvoid    buffer_put_string(Buffer *, const void *, u_int);
74221420Sdeschar   *buffer_get_cstring(Buffer *, u_int *);
75162852Sdesvoid	buffer_put_cstring(Buffer *, const char *);
76162852Sdes
77162852Sdes#define buffer_skip_string(b) \
78162852Sdes    do { u_int l = buffer_get_int(b); buffer_consume(b, l); } while (0)
79162852Sdes
80162852Sdesint	buffer_put_bignum_ret(Buffer *, const BIGNUM *);
81162852Sdesint	buffer_get_bignum_ret(Buffer *, BIGNUM *);
82162852Sdesint	buffer_put_bignum2_ret(Buffer *, const BIGNUM *);
83162852Sdesint	buffer_get_bignum2_ret(Buffer *, BIGNUM *);
84162852Sdesint	buffer_get_short_ret(u_short *, Buffer *);
85162852Sdesint	buffer_get_int_ret(u_int *, Buffer *);
86162852Sdesint	buffer_get_int64_ret(u_int64_t *, Buffer *);
87162852Sdesvoid	*buffer_get_string_ret(Buffer *, u_int *);
88221420Sdeschar	*buffer_get_cstring_ret(Buffer *, u_int *);
89204917Sdesvoid	*buffer_get_string_ptr_ret(Buffer *, u_int *);
90255767Sdesint	buffer_get_char_ret(u_char *, Buffer *);
91162852Sdes
92221420Sdes#ifdef OPENSSL_HAS_ECC
93221420Sdes#include <openssl/ec.h>
94221420Sdes
95221420Sdesint	buffer_put_ecpoint_ret(Buffer *, const EC_GROUP *, const EC_POINT *);
96221420Sdesvoid	buffer_put_ecpoint(Buffer *, const EC_GROUP *, const EC_POINT *);
97221420Sdesint	buffer_get_ecpoint_ret(Buffer *, const EC_GROUP *, EC_POINT *);
98221420Sdesvoid	buffer_get_ecpoint(Buffer *, const EC_GROUP *, EC_POINT *);
99221420Sdes#endif
100221420Sdes
10157429Smarkm#endif				/* BUFFER_H */
102