Replace some ibuf_data() + offset constructs to use ibuf_seek() the actual
interface built exactly for this.
Should behave the same unless the code is already broken and overflowing
the buffer.
--
:wq Claudio
Index: crypto.c
===================================================================
RCS file: /cvs/src/sbin/iked/crypto.c,v
retrieving revision 1.43
diff -u -p -r1.43 crypto.c
--- crypto.c 23 May 2023 13:12:19 -0000 1.43
+++ crypto.c 6 Jun 2023 10:52:59 -0000
@@ -567,9 +567,9 @@ cipher_init(struct iked_cipher *encr, in
return (-1);
if (encr->encr_saltlength > 0) {
/* For AEADs the nonce is salt + IV (see RFC5282) */
- nonce = ibuf_new(ibuf_data(encr->encr_key) +
+ nonce = ibuf_new(ibuf_seek(encr->encr_key,
ibuf_size(encr->encr_key) - encr->encr_saltlength,
- encr->encr_saltlength);
+ encr->encr_saltlength), encr->encr_saltlength);
if (nonce == NULL)
return (-1);
if (ibuf_add(nonce, ibuf_data(encr->encr_iv) ,
ibuf_size(encr->encr_iv)) != 0)
Index: ikev2_msg.c
===================================================================
RCS file: /cvs/src/sbin/iked/ikev2_msg.c,v
retrieving revision 1.93
diff -u -p -r1.93 ikev2_msg.c
--- ikev2_msg.c 30 May 2023 08:41:15 -0000 1.93
+++ ikev2_msg.c 6 Jun 2023 10:51:45 -0000
@@ -644,7 +644,7 @@ ikev2_msg_decrypt(struct iked *env, stru
}
cipher_setkey(sa->sa_encr, encr->buf, ibuf_length(encr));
- cipher_setiv(sa->sa_encr, ibuf_data(src) + ivoff, ivlen);
+ cipher_setiv(sa->sa_encr, ibuf_seek(src, ivoff, ivlen), ivlen);
if (cipher_init_decrypt(sa->sa_encr) == -1) {
log_info("%s: error initiating cipher.", __func__);
goto done;
@@ -676,7 +676,7 @@ ikev2_msg_decrypt(struct iked *env, stru
}
if ((outlen = ibuf_length(out)) != 0) {
- if (cipher_update(sa->sa_encr, ibuf_data(src) + encroff,
+ if (cipher_update(sa->sa_encr, ibuf_seek(src, encroff, encrlen),
encrlen, ibuf_data(out), &outlen) == -1) {
log_info("%s: error updating cipher.", __func__);
goto done;