diff options
Diffstat (limited to 'sshbuf-getput-basic.c')
-rw-r--r-- | sshbuf-getput-basic.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c index 06d6cc492..8ff8a0a28 100644 --- a/sshbuf-getput-basic.c +++ b/sshbuf-getput-basic.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sshbuf-getput-basic.c,v 1.3 2015/01/12 15:18:07 djm Exp $ */ | 1 | /* $OpenBSD: sshbuf-getput-basic.c,v 1.4 2015/01/14 15:02:39 djm Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2011 Damien Miller | 3 | * Copyright (c) 2011 Damien Miller |
4 | * | 4 | * |
@@ -424,3 +424,39 @@ sshbuf_put_bignum2_bytes(struct sshbuf *buf, const void *v, size_t len) | |||
424 | memcpy(d + 4 + prepend, s, len); | 424 | memcpy(d + 4 + prepend, s, len); |
425 | return 0; | 425 | return 0; |
426 | } | 426 | } |
427 | |||
428 | int | ||
429 | sshbuf_get_bignum2_bytes_direct(struct sshbuf *buf, | ||
430 | const u_char **valp, size_t *lenp) | ||
431 | { | ||
432 | const u_char *d; | ||
433 | size_t len, olen; | ||
434 | int r; | ||
435 | |||
436 | if ((r = sshbuf_peek_string_direct(buf, &d, &olen)) < 0) | ||
437 | return r; | ||
438 | len = olen; | ||
439 | /* Refuse negative (MSB set) bignums */ | ||
440 | if ((len != 0 && (*d & 0x80) != 0)) | ||
441 | return SSH_ERR_BIGNUM_IS_NEGATIVE; | ||
442 | /* Refuse overlong bignums, allow prepended \0 to avoid MSB set */ | ||
443 | if (len > SSHBUF_MAX_BIGNUM + 1 || | ||
444 | (len == SSHBUF_MAX_BIGNUM + 1 && *d != 0)) | ||
445 | return SSH_ERR_BIGNUM_TOO_LARGE; | ||
446 | /* Trim leading zeros */ | ||
447 | while (len > 0 && *d == 0x00) { | ||
448 | d++; | ||
449 | len--; | ||
450 | } | ||
451 | if (valp != 0) | ||
452 | *valp = d; | ||
453 | if (lenp != NULL) | ||
454 | *lenp = len; | ||
455 | if (sshbuf_consume(buf, olen + 4) != 0) { | ||
456 | /* Shouldn't happen */ | ||
457 | SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); | ||
458 | SSHBUF_ABORT(); | ||
459 | return SSH_ERR_INTERNAL_ERROR; | ||
460 | } | ||
461 | return 0; | ||
462 | } | ||