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);
147 int sshbuf_allocate(
struct sshbuf *buf,
size_t len);
154 int sshbuf_reserve(
struct sshbuf *buf,
size_t len, u_char **dpp);
160 int sshbuf_consume(
struct sshbuf *buf,
size_t len);
166 int sshbuf_consume_end(
struct sshbuf *buf,
size_t len);
169 int sshbuf_get(
struct sshbuf *buf,
void *v,
size_t len);
170 int sshbuf_put(
struct sshbuf *buf,
const void *v,
size_t len);
171 int sshbuf_putb(
struct sshbuf *buf,
const struct sshbuf *v);
174 int sshbuf_putf(
struct sshbuf *buf,
const char *fmt, ...)
175 __attribute__((format(printf, 2, 3)));
176 int sshbuf_putfv(struct sshbuf *buf, const
char *fmt, va_list ap);
179 int sshbuf_get_u64(struct sshbuf *buf, u_int64_t *valp);
180 int sshbuf_get_u32(struct sshbuf *buf, u_int32_t *valp);
181 int sshbuf_get_u16(struct sshbuf *buf, u_int16_t *valp);
182 int sshbuf_get_u8(struct sshbuf *buf, u_char *valp);
183 int sshbuf_put_u64(struct sshbuf *buf, u_int64_t val);
184 int sshbuf_put_u32(struct sshbuf *buf, u_int32_t val);
185 int sshbuf_put_u16(struct sshbuf *buf, u_int16_t val);
186 int sshbuf_put_u8(struct sshbuf *buf, u_char val);
193 int sshbuf_get_string(struct sshbuf *buf, u_char **valp,
size_t *lenp);
194 int sshbuf_get_cstring(struct sshbuf *buf,
char **valp,
size_t *lenp);
195 int sshbuf_get_stringb(struct sshbuf *buf, struct sshbuf *v);
196 int sshbuf_put_string(struct sshbuf *buf, const
void *v,
size_t len);
197 int sshbuf_put_cstring(struct sshbuf *buf, const
char *v);
198 int sshbuf_put_stringb(struct sshbuf *buf, const struct sshbuf *v);
205 int sshbuf_get_string_direct(struct sshbuf *buf, const u_char **valp,
209 #define sshbuf_skip_string(buf) sshbuf_get_string_direct(buf, NULL, NULL) 212 int sshbuf_peek_string_direct(
const struct sshbuf *buf,
const u_char **valp,
219 int sshbuf_put_bignum2_bytes(
struct sshbuf *buf,
const void *v,
size_t len);
220 int sshbuf_get_bignum2_bytes_direct(
struct sshbuf *buf,
221 const u_char **valp,
size_t *lenp);
223 int sshbuf_get_bignum2(
struct sshbuf *buf, BIGNUM *v);
224 int sshbuf_get_bignum1(
struct sshbuf *buf, BIGNUM *v);
225 int sshbuf_put_bignum2(
struct sshbuf *buf,
const BIGNUM *v);
226 int sshbuf_put_bignum1(
struct sshbuf *buf,
const BIGNUM *v);
227 # ifdef OPENSSL_HAS_ECC 228 int sshbuf_get_ec(
struct sshbuf *buf, EC_POINT *v,
const EC_GROUP *g);
229 int sshbuf_get_eckey(
struct sshbuf *buf, EC_KEY *v);
230 int sshbuf_put_ec(
struct sshbuf *buf,
const EC_POINT *v,
const EC_GROUP *g);
231 int sshbuf_put_eckey(
struct sshbuf *buf,
const EC_KEY *v);
236 void sshbuf_dump(
struct sshbuf *buf, FILE *f);
239 void sshbuf_dump_data(
const void *s,
size_t len, FILE *f);
242 char *sshbuf_dtob16(
struct sshbuf *buf);
245 char *sshbuf_dtob64(
struct sshbuf *buf);
248 int sshbuf_b64tod(
struct sshbuf *buf,
const char *b64);
255 char *sshbuf_dup_string(
struct sshbuf *buf);
258 #define PEEK_U64(p) \ 259 (((u_int64_t)(((const u_char *)(p))[0]) << 56) | \ 260 ((u_int64_t)(((const u_char *)(p))[1]) << 48) | \ 261 ((u_int64_t)(((const u_char *)(p))[2]) << 40) | \ 262 ((u_int64_t)(((const u_char *)(p))[3]) << 32) | \ 263 ((u_int64_t)(((const u_char *)(p))[4]) << 24) | \ 264 ((u_int64_t)(((const u_char *)(p))[5]) << 16) | \ 265 ((u_int64_t)(((const u_char *)(p))[6]) << 8) | \ 266 (u_int64_t)(((const u_char *)(p))[7])) 267 #define PEEK_U32(p) \ 268 (((u_int32_t)(((const u_char *)(p))[0]) << 24) | \ 269 ((u_int32_t)(((const u_char *)(p))[1]) << 16) | \ 270 ((u_int32_t)(((const u_char *)(p))[2]) << 8) | \ 271 (u_int32_t)(((const u_char *)(p))[3])) 272 #define PEEK_U16(p) \ 273 (((u_int16_t)(((const u_char *)(p))[0]) << 8) | \ 274 (u_int16_t)(((const u_char *)(p))[1])) 276 #define POKE_U64(p, v) \ 278 const u_int64_t __v = (v); \ 279 ((u_char *)(p))[0] = (__v >> 56) & 0xff; \ 280 ((u_char *)(p))[1] = (__v >> 48) & 0xff; \ 281 ((u_char *)(p))[2] = (__v >> 40) & 0xff; \ 282 ((u_char *)(p))[3] = (__v >> 32) & 0xff; \ 283 ((u_char *)(p))[4] = (__v >> 24) & 0xff; \ 284 ((u_char *)(p))[5] = (__v >> 16) & 0xff; \ 285 ((u_char *)(p))[6] = (__v >> 8) & 0xff; \ 286 ((u_char *)(p))[7] = __v & 0xff; \ 288 #define POKE_U32(p, v) \ 290 const u_int32_t __v = (v); \ 291 ((u_char *)(p))[0] = (__v >> 24) & 0xff; \ 292 ((u_char *)(p))[1] = (__v >> 16) & 0xff; \ 293 ((u_char *)(p))[2] = (__v >> 8) & 0xff; \ 294 ((u_char *)(p))[3] = __v & 0xff; \ 296 #define POKE_U16(p, v) \ 298 const u_int16_t __v = (v); \ 299 ((u_char *)(p))[0] = (__v >> 8) & 0xff; \ 300 ((u_char *)(p))[1] = __v & 0xff; \ 304 #ifdef SSHBUF_INTERNAL 309 size_t sshbuf_alloc(
const struct sshbuf *buf);
314 int sshbuf_set_parent(
struct sshbuf *child,
struct sshbuf *parent);
319 const struct sshbuf *sshbuf_parent(
const struct sshbuf *buf);
324 u_int sshbuf_refcount(
const struct sshbuf *buf);
326 # define SSHBUF_SIZE_INIT 256 327 # define SSHBUF_SIZE_INC 256 328 # define SSHBUF_PACK_MIN 8192 333 # ifndef SSHBUF_ABORT 334 # define SSHBUF_ABORT() 338 # define SSHBUF_TELL(what) do { \ 339 printf("%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ 340 __FILE__, __LINE__, __func__, what, \ 341 buf->size, buf->alloc, buf->off, buf->max_size); \ 344 # define SSHBUF_DBG(x) do { \ 345 printf("%s:%d %s: ", __FILE__, __LINE__, __func__); \ 351 # define SSHBUF_TELL(what) 352 # define SSHBUF_DBG(x)