21 #include <sys/types.h> 25 # include <openssl/bn.h> 26 # ifdef OPENSSL_HAS_ECC 27 # include <openssl/ec.h> 31 #define SSHBUF_SIZE_MAX 0xF000000 32 #define SSHBUF_REFS_MAX 0x100000 33 #define SSHBUF_MAX_BIGNUM (16384 / 8) 34 #define SSHBUF_MAX_ECPOINT ((528 * 2 / 8) + 1) 50 struct sshbuf *parent;
53 #ifndef SSHBUF_NO_DEPREACTED 59 void sshbuf_init(
struct sshbuf *buf);
66 struct sshbuf *sshbuf_new(
void);
72 struct sshbuf *sshbuf_from(
const void *blob,
size_t len);
80 struct sshbuf *sshbuf_fromb(
struct sshbuf *buf);
89 int sshbuf_froms(
struct sshbuf *buf,
struct sshbuf **bufp);
94 void sshbuf_free(
struct sshbuf *buf);
99 void sshbuf_reset(
struct sshbuf *buf);
104 size_t sshbuf_max_size(
const struct sshbuf *buf);
110 int sshbuf_set_max_size(
struct sshbuf *buf,
size_t max_size);
115 size_t sshbuf_len(
const struct sshbuf *buf);
120 size_t sshbuf_avail(
const struct sshbuf *buf);
125 const u_char *sshbuf_ptr(
const struct sshbuf *buf);
131 u_char *sshbuf_mutable_ptr(
const struct sshbuf *buf);
139 int sshbuf_check_reserve(
const struct sshbuf *buf,
size_t len);
146 int sshbuf_reserve(
struct sshbuf *buf,
size_t len, u_char **dpp);
152 int sshbuf_consume(
struct sshbuf *buf,
size_t len);
158 int sshbuf_consume_end(
struct sshbuf *buf,
size_t len);
161 int sshbuf_get(
struct sshbuf *buf,
void *v,
size_t len);
162 int sshbuf_put(
struct sshbuf *buf,
const void *v,
size_t len);
163 int sshbuf_putb(
struct sshbuf *buf,
const struct sshbuf *v);
166 int sshbuf_putf(
struct sshbuf *buf,
const char *fmt, ...)
167 __attribute__((format(printf, 2, 3)));
168 int sshbuf_putfv(struct sshbuf *buf, const
char *fmt, va_list ap);
171 int sshbuf_get_u64(struct sshbuf *buf, u_int64_t *valp);
172 int sshbuf_get_u32(struct sshbuf *buf, u_int32_t *valp);
173 int sshbuf_get_u16(struct sshbuf *buf, u_int16_t *valp);
174 int sshbuf_get_u8(struct sshbuf *buf, u_char *valp);
175 int sshbuf_put_u64(struct sshbuf *buf, u_int64_t val);
176 int sshbuf_put_u32(struct sshbuf *buf, u_int32_t val);
177 int sshbuf_put_u16(struct sshbuf *buf, u_int16_t val);
178 int sshbuf_put_u8(struct sshbuf *buf, u_char val);
185 int sshbuf_get_string(struct sshbuf *buf, u_char **valp,
size_t *lenp);
186 int sshbuf_get_cstring(struct sshbuf *buf,
char **valp,
size_t *lenp);
187 int sshbuf_get_stringb(struct sshbuf *buf, struct sshbuf *v);
188 int sshbuf_put_string(struct sshbuf *buf, const
void *v,
size_t len);
189 int sshbuf_put_cstring(struct sshbuf *buf, const
char *v);
190 int sshbuf_put_stringb(struct sshbuf *buf, const struct sshbuf *v);
197 int sshbuf_get_string_direct(struct sshbuf *buf, const u_char **valp,
201 #define sshbuf_skip_string(buf) sshbuf_get_string_direct(buf, NULL, NULL) 204 int sshbuf_peek_string_direct(
const struct sshbuf *buf,
const u_char **valp,
211 int sshbuf_put_bignum2_bytes(
struct sshbuf *buf,
const void *v,
size_t len);
212 int sshbuf_get_bignum2_bytes_direct(
struct sshbuf *buf,
213 const u_char **valp,
size_t *lenp);
215 int sshbuf_get_bignum2(
struct sshbuf *buf, BIGNUM *v);
216 int sshbuf_get_bignum1(
struct sshbuf *buf, BIGNUM *v);
217 int sshbuf_put_bignum2(
struct sshbuf *buf,
const BIGNUM *v);
218 int sshbuf_put_bignum1(
struct sshbuf *buf,
const BIGNUM *v);
219 # ifdef OPENSSL_HAS_ECC 220 int sshbuf_get_ec(
struct sshbuf *buf, EC_POINT *v,
const EC_GROUP *g);
221 int sshbuf_get_eckey(
struct sshbuf *buf, EC_KEY *v);
222 int sshbuf_put_ec(
struct sshbuf *buf,
const EC_POINT *v,
const EC_GROUP *g);
223 int sshbuf_put_eckey(
struct sshbuf *buf,
const EC_KEY *v);
228 void sshbuf_dump(
struct sshbuf *buf, FILE *f);
231 void sshbuf_dump_data(
const void *s,
size_t len, FILE *f);
234 char *sshbuf_dtob16(
struct sshbuf *buf);
237 char *sshbuf_dtob64(
struct sshbuf *buf);
240 int sshbuf_b64tod(
struct sshbuf *buf,
const char *b64);
247 char *sshbuf_dup_string(
struct sshbuf *buf);
250 #define PEEK_U64(p) \ 251 (((u_int64_t)(((const u_char *)(p))[0]) << 56) | \ 252 ((u_int64_t)(((const u_char *)(p))[1]) << 48) | \ 253 ((u_int64_t)(((const u_char *)(p))[2]) << 40) | \ 254 ((u_int64_t)(((const u_char *)(p))[3]) << 32) | \ 255 ((u_int64_t)(((const u_char *)(p))[4]) << 24) | \ 256 ((u_int64_t)(((const u_char *)(p))[5]) << 16) | \ 257 ((u_int64_t)(((const u_char *)(p))[6]) << 8) | \ 258 (u_int64_t)(((const u_char *)(p))[7])) 259 #define PEEK_U32(p) \ 260 (((u_int32_t)(((const u_char *)(p))[0]) << 24) | \ 261 ((u_int32_t)(((const u_char *)(p))[1]) << 16) | \ 262 ((u_int32_t)(((const u_char *)(p))[2]) << 8) | \ 263 (u_int32_t)(((const u_char *)(p))[3])) 264 #define PEEK_U16(p) \ 265 (((u_int16_t)(((const u_char *)(p))[0]) << 8) | \ 266 (u_int16_t)(((const u_char *)(p))[1])) 268 #define POKE_U64(p, v) \ 270 const u_int64_t __v = (v); \ 271 ((u_char *)(p))[0] = (__v >> 56) & 0xff; \ 272 ((u_char *)(p))[1] = (__v >> 48) & 0xff; \ 273 ((u_char *)(p))[2] = (__v >> 40) & 0xff; \ 274 ((u_char *)(p))[3] = (__v >> 32) & 0xff; \ 275 ((u_char *)(p))[4] = (__v >> 24) & 0xff; \ 276 ((u_char *)(p))[5] = (__v >> 16) & 0xff; \ 277 ((u_char *)(p))[6] = (__v >> 8) & 0xff; \ 278 ((u_char *)(p))[7] = __v & 0xff; \ 280 #define POKE_U32(p, v) \ 282 const u_int32_t __v = (v); \ 283 ((u_char *)(p))[0] = (__v >> 24) & 0xff; \ 284 ((u_char *)(p))[1] = (__v >> 16) & 0xff; \ 285 ((u_char *)(p))[2] = (__v >> 8) & 0xff; \ 286 ((u_char *)(p))[3] = __v & 0xff; \ 288 #define POKE_U16(p, v) \ 290 const u_int16_t __v = (v); \ 291 ((u_char *)(p))[0] = (__v >> 8) & 0xff; \ 292 ((u_char *)(p))[1] = __v & 0xff; \ 296 #ifdef SSHBUF_INTERNAL 301 size_t sshbuf_alloc(
const struct sshbuf *buf);
306 int sshbuf_set_parent(
struct sshbuf *child,
struct sshbuf *parent);
311 const struct sshbuf *sshbuf_parent(
const struct sshbuf *buf);
316 u_int sshbuf_refcount(
const struct sshbuf *buf);
318 # define SSHBUF_SIZE_INIT 256 319 # define SSHBUF_SIZE_INC 256 320 # define SSHBUF_PACK_MIN 8192 325 # ifndef SSHBUF_ABORT 326 # define SSHBUF_ABORT() 330 # define SSHBUF_TELL(what) do { \ 331 printf("%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ 332 __FILE__, __LINE__, __func__, what, \ 333 buf->size, buf->alloc, buf->off, buf->max_size); \ 336 # define SSHBUF_DBG(x) do { \ 337 printf("%s:%d %s: ", __FILE__, __LINE__, __func__); \ 343 # define SSHBUF_TELL(what) 344 # define SSHBUF_DBG(x)