buffer.h revision 221420
1221420Sdes/* $OpenBSD: buffer.h,v 1.21 2010/08/31 11:54:45 djm Exp $ */
292555Sdes
357429Smarkm/*
457429Smarkm * Author: Tatu Ylonen <ylo@cs.hut.fi>
557429Smarkm * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
657429Smarkm *                    All rights reserved
757429Smarkm * Code for manipulating FIFO buffers.
860573Skris *
965668Skris * As far as I am concerned, the code I have written for this software
1065668Skris * can be used freely for any purpose.  Any derived versions of this
1165668Skris * software must be clearly marked as such, and if the derived work is
1265668Skris * incompatible with the protocol description in the RFC file, it must be
1365668Skris * called by a name other than "ssh" or "Secure Shell".
1457429Smarkm */
1557429Smarkm
1657429Smarkm#ifndef BUFFER_H
1757429Smarkm#define BUFFER_H
1857429Smarkm
1957429Smarkmtypedef struct {
2092555Sdes	u_char	*buf;		/* Buffer for data. */
2192555Sdes	u_int	 alloc;		/* Number of bytes allocated for data. */
2292555Sdes	u_int	 offset;	/* Offset of first byte containing data. */
2392555Sdes	u_int	 end;		/* Offset of last byte containing data. */
2457429Smarkm}       Buffer;
2557429Smarkm
2692555Sdesvoid	 buffer_init(Buffer *);
2792555Sdesvoid	 buffer_clear(Buffer *);
2892555Sdesvoid	 buffer_free(Buffer *);
2957429Smarkm
30204917Sdesu_int	 buffer_len(const Buffer *);
31204917Sdesvoid	*buffer_ptr(const Buffer *);
3257429Smarkm
3392555Sdesvoid	 buffer_append(Buffer *, const void *, u_int);
3492555Sdesvoid	*buffer_append_space(Buffer *, u_int);
3557429Smarkm
36162852Sdesint	 buffer_check_alloc(Buffer *, u_int);
37162852Sdes
3892555Sdesvoid	 buffer_get(Buffer *, void *, u_int);
3957429Smarkm
4092555Sdesvoid	 buffer_consume(Buffer *, u_int);
4192555Sdesvoid	 buffer_consume_end(Buffer *, u_int);
4257429Smarkm
43204917Sdesvoid     buffer_dump(const Buffer *);
4457429Smarkm
45146998Sdesint	 buffer_get_ret(Buffer *, void *, u_int);
46146998Sdesint	 buffer_consume_ret(Buffer *, u_int);
47146998Sdesint	 buffer_consume_end_ret(Buffer *, u_int);
48146998Sdes
49162852Sdes#include <openssl/bn.h>
50162852Sdes
51162852Sdesvoid    buffer_put_bignum(Buffer *, const BIGNUM *);
52162852Sdesvoid    buffer_put_bignum2(Buffer *, const BIGNUM *);
53162852Sdesvoid	buffer_get_bignum(Buffer *, BIGNUM *);
54162852Sdesvoid	buffer_get_bignum2(Buffer *, BIGNUM *);
55162852Sdes
56162852Sdesu_short	buffer_get_short(Buffer *);
57162852Sdesvoid	buffer_put_short(Buffer *, u_short);
58162852Sdes
59162852Sdesu_int	buffer_get_int(Buffer *);
60162852Sdesvoid    buffer_put_int(Buffer *, u_int);
61162852Sdes
62162852Sdesu_int64_t buffer_get_int64(Buffer *);
63162852Sdesvoid	buffer_put_int64(Buffer *, u_int64_t);
64162852Sdes
65162852Sdesint     buffer_get_char(Buffer *);
66162852Sdesvoid    buffer_put_char(Buffer *, int);
67162852Sdes
68162852Sdesvoid   *buffer_get_string(Buffer *, u_int *);
69181111Sdesvoid   *buffer_get_string_ptr(Buffer *, u_int *);
70162852Sdesvoid    buffer_put_string(Buffer *, const void *, u_int);
71221420Sdeschar   *buffer_get_cstring(Buffer *, u_int *);
72162852Sdesvoid	buffer_put_cstring(Buffer *, const char *);
73162852Sdes
74162852Sdes#define buffer_skip_string(b) \
75162852Sdes    do { u_int l = buffer_get_int(b); buffer_consume(b, l); } while (0)
76162852Sdes
77162852Sdesint	buffer_put_bignum_ret(Buffer *, const BIGNUM *);
78162852Sdesint	buffer_get_bignum_ret(Buffer *, BIGNUM *);
79162852Sdesint	buffer_put_bignum2_ret(Buffer *, const BIGNUM *);
80162852Sdesint	buffer_get_bignum2_ret(Buffer *, BIGNUM *);
81162852Sdesint	buffer_get_short_ret(u_short *, Buffer *);
82162852Sdesint	buffer_get_int_ret(u_int *, Buffer *);
83162852Sdesint	buffer_get_int64_ret(u_int64_t *, Buffer *);
84162852Sdesvoid	*buffer_get_string_ret(Buffer *, u_int *);
85221420Sdeschar	*buffer_get_cstring_ret(Buffer *, u_int *);
86204917Sdesvoid	*buffer_get_string_ptr_ret(Buffer *, u_int *);
87162852Sdesint	buffer_get_char_ret(char *, Buffer *);
88162852Sdes
89221420Sdes#ifdef OPENSSL_HAS_ECC
90221420Sdes#include <openssl/ec.h>
91221420Sdes
92221420Sdesint	buffer_put_ecpoint_ret(Buffer *, const EC_GROUP *, const EC_POINT *);
93221420Sdesvoid	buffer_put_ecpoint(Buffer *, const EC_GROUP *, const EC_POINT *);
94221420Sdesint	buffer_get_ecpoint_ret(Buffer *, const EC_GROUP *, EC_POINT *);
95221420Sdesvoid	buffer_get_ecpoint(Buffer *, const EC_GROUP *, EC_POINT *);
96221420Sdes#endif
97221420Sdes
9857429Smarkm#endif				/* BUFFER_H */
99