mirror of
https://git.rtems.org/rtems-libbsd/
synced 2025-10-16 08:47:25 +08:00
Update to FreeBSD head 2017-08-01
Git mirror commit f5002f5e5f78cae9f0269d812dc0aedb0339312c. Update #3472.
This commit is contained in:
@@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$");
|
||||
void
|
||||
sctp_clear_chunklist(sctp_auth_chklist_t *chklist)
|
||||
{
|
||||
bzero(chklist, sizeof(*chklist));
|
||||
memset(chklist, 0, sizeof(*chklist));
|
||||
/* chklist->num_chunks = 0; */
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ sctp_copy_chunklist(sctp_auth_chklist_t *list)
|
||||
if (new_list == NULL)
|
||||
return (NULL);
|
||||
/* copy it */
|
||||
bcopy(list, new_list, sizeof(*new_list));
|
||||
memcpy(new_list, list, sizeof(*new_list));
|
||||
|
||||
return (new_list);
|
||||
}
|
||||
@@ -340,7 +340,7 @@ sctp_set_key(uint8_t *key, uint32_t keylen)
|
||||
/* out of memory */
|
||||
return (NULL);
|
||||
}
|
||||
bcopy(key, new_key->key, keylen);
|
||||
memcpy(new_key->key, key, keylen);
|
||||
return (new_key);
|
||||
}
|
||||
|
||||
@@ -429,28 +429,28 @@ sctp_compute_hashkey(sctp_key_t *key1, sctp_key_t *key2, sctp_key_t *shared)
|
||||
if (sctp_compare_key(key1, key2) <= 0) {
|
||||
/* key is shared + key1 + key2 */
|
||||
if (sctp_get_keylen(shared)) {
|
||||
bcopy(shared->key, key_ptr, shared->keylen);
|
||||
memcpy(key_ptr, shared->key, shared->keylen);
|
||||
key_ptr += shared->keylen;
|
||||
}
|
||||
if (sctp_get_keylen(key1)) {
|
||||
bcopy(key1->key, key_ptr, key1->keylen);
|
||||
memcpy(key_ptr, key1->key, key1->keylen);
|
||||
key_ptr += key1->keylen;
|
||||
}
|
||||
if (sctp_get_keylen(key2)) {
|
||||
bcopy(key2->key, key_ptr, key2->keylen);
|
||||
memcpy(key_ptr, key2->key, key2->keylen);
|
||||
}
|
||||
} else {
|
||||
/* key is shared + key2 + key1 */
|
||||
if (sctp_get_keylen(shared)) {
|
||||
bcopy(shared->key, key_ptr, shared->keylen);
|
||||
memcpy(key_ptr, shared->key, shared->keylen);
|
||||
key_ptr += shared->keylen;
|
||||
}
|
||||
if (sctp_get_keylen(key2)) {
|
||||
bcopy(key2->key, key_ptr, key2->keylen);
|
||||
memcpy(key_ptr, key2->key, key2->keylen);
|
||||
key_ptr += key2->keylen;
|
||||
}
|
||||
if (sctp_get_keylen(key1)) {
|
||||
bcopy(key1->key, key_ptr, key1->keylen);
|
||||
memcpy(key_ptr, key1->key, key1->keylen);
|
||||
}
|
||||
}
|
||||
return (new_key);
|
||||
@@ -766,7 +766,7 @@ sctp_serialize_hmaclist(sctp_hmaclist_t *list, uint8_t *ptr)
|
||||
|
||||
for (i = 0; i < list->num_algo; i++) {
|
||||
hmac_id = htons(list->hmac[i]);
|
||||
bcopy(&hmac_id, ptr, sizeof(hmac_id));
|
||||
memcpy(ptr, &hmac_id, sizeof(hmac_id));
|
||||
ptr += sizeof(hmac_id);
|
||||
}
|
||||
return (list->num_algo * sizeof(hmac_id));
|
||||
@@ -797,7 +797,7 @@ sctp_alloc_authinfo(void)
|
||||
/* out of memory */
|
||||
return (NULL);
|
||||
}
|
||||
bzero(new_authinfo, sizeof(*new_authinfo));
|
||||
memset(new_authinfo, 0, sizeof(*new_authinfo));
|
||||
return (new_authinfo);
|
||||
}
|
||||
|
||||
@@ -955,10 +955,10 @@ sctp_hmac(uint16_t hmac_algo, uint8_t *key, uint32_t keylen,
|
||||
key = temp;
|
||||
}
|
||||
/* initialize the inner/outer pads with the key and "append" zeroes */
|
||||
bzero(ipad, blocklen);
|
||||
bzero(opad, blocklen);
|
||||
bcopy(key, ipad, keylen);
|
||||
bcopy(key, opad, keylen);
|
||||
memset(ipad, 0, blocklen);
|
||||
memset(opad, 0, blocklen);
|
||||
memcpy(ipad, key, keylen);
|
||||
memcpy(opad, key, keylen);
|
||||
|
||||
/* XOR the key with ipad and opad values */
|
||||
for (i = 0; i < blocklen; i++) {
|
||||
@@ -1015,10 +1015,10 @@ sctp_hmac_m(uint16_t hmac_algo, uint8_t *key, uint32_t keylen,
|
||||
key = temp;
|
||||
}
|
||||
/* initialize the inner/outer pads with the key and "append" zeroes */
|
||||
bzero(ipad, blocklen);
|
||||
bzero(opad, blocklen);
|
||||
bcopy(key, ipad, keylen);
|
||||
bcopy(key, opad, keylen);
|
||||
memset(ipad, 0, blocklen);
|
||||
memset(opad, 0, blocklen);
|
||||
memcpy(ipad, key, keylen);
|
||||
memcpy(opad, key, keylen);
|
||||
|
||||
/* XOR the key with ipad and opad values */
|
||||
for (i = 0; i < blocklen; i++) {
|
||||
@@ -1126,7 +1126,7 @@ sctp_compute_hmac(uint16_t hmac_algo, sctp_key_t *key, uint8_t *text,
|
||||
sctp_hmac_final(hmac_algo, &ctx, temp);
|
||||
/* save the hashed key as the new key */
|
||||
key->keylen = digestlen;
|
||||
bcopy(temp, key->key, key->keylen);
|
||||
memcpy(key->key, temp, key->keylen);
|
||||
}
|
||||
return (sctp_hmac(hmac_algo, key->key, key->keylen, text, textlen,
|
||||
digest));
|
||||
@@ -1160,7 +1160,7 @@ sctp_compute_hmac_m(uint16_t hmac_algo, sctp_key_t *key, struct mbuf *m,
|
||||
sctp_hmac_final(hmac_algo, &ctx, temp);
|
||||
/* save the hashed key as the new key */
|
||||
key->keylen = digestlen;
|
||||
bcopy(temp, key->key, key->keylen);
|
||||
memcpy(key->key, temp, key->keylen);
|
||||
}
|
||||
return (sctp_hmac_m(hmac_algo, key->key, key->keylen, m, m_offset, digest, 0));
|
||||
}
|
||||
@@ -1436,7 +1436,7 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
if (plen > sizeof(random_store))
|
||||
break;
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)random_store, min(plen, sizeof(random_store)));
|
||||
(struct sctp_paramhdr *)random_store, plen);
|
||||
if (phdr == NULL)
|
||||
return;
|
||||
/* save the random and length for the key */
|
||||
@@ -1449,7 +1449,7 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
if (plen > sizeof(hmacs_store))
|
||||
break;
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)hmacs_store, min(plen, sizeof(hmacs_store)));
|
||||
(struct sctp_paramhdr *)hmacs_store, plen);
|
||||
if (phdr == NULL)
|
||||
return;
|
||||
/* save the hmacs list and num for the key */
|
||||
@@ -1471,7 +1471,7 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
if (plen > sizeof(chunks_store))
|
||||
break;
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)chunks_store, min(plen, sizeof(chunks_store)));
|
||||
(struct sctp_paramhdr *)chunks_store, plen);
|
||||
if (phdr == NULL)
|
||||
return;
|
||||
chunks = (struct sctp_auth_chunk_list *)phdr;
|
||||
@@ -1503,17 +1503,17 @@ sctp_auth_get_cookie_params(struct sctp_tcb *stcb, struct mbuf *m,
|
||||
/* copy in the RANDOM */
|
||||
if (p_random != NULL) {
|
||||
keylen = sizeof(*p_random) + random_len;
|
||||
bcopy(p_random, new_key->key, keylen);
|
||||
memcpy(new_key->key, p_random, keylen);
|
||||
}
|
||||
/* append in the AUTH chunks */
|
||||
if (chunks != NULL) {
|
||||
bcopy(chunks, new_key->key + keylen,
|
||||
memcpy(new_key->key + keylen, chunks,
|
||||
sizeof(*chunks) + num_chunks);
|
||||
keylen += sizeof(*chunks) + num_chunks;
|
||||
}
|
||||
/* append in the HMACs */
|
||||
if (hmacs != NULL) {
|
||||
bcopy(hmacs, new_key->key + keylen,
|
||||
memcpy(new_key->key + keylen, hmacs,
|
||||
sizeof(*hmacs) + hmacs_len);
|
||||
}
|
||||
}
|
||||
@@ -1552,7 +1552,7 @@ sctp_fill_hmac_digest_m(struct mbuf *m, uint32_t auth_offset,
|
||||
|
||||
/* zero the digest + chunk padding */
|
||||
digestlen = sctp_get_hmac_digest_len(stcb->asoc.peer_hmac_id);
|
||||
bzero(auth->hmac, SCTP_SIZE32(digestlen));
|
||||
memset(auth->hmac, 0, SCTP_SIZE32(digestlen));
|
||||
|
||||
/* is the desired key cached? */
|
||||
if ((keyid != stcb->asoc.authinfo.assoc_keyid) ||
|
||||
@@ -1590,7 +1590,7 @@ sctp_fill_hmac_digest_m(struct mbuf *m, uint32_t auth_offset,
|
||||
|
||||
|
||||
static void
|
||||
sctp_bzero_m(struct mbuf *m, uint32_t m_offset, uint32_t size)
|
||||
sctp_zero_m(struct mbuf *m, uint32_t m_offset, uint32_t size)
|
||||
{
|
||||
struct mbuf *m_tmp;
|
||||
uint8_t *data;
|
||||
@@ -1609,10 +1609,10 @@ sctp_bzero_m(struct mbuf *m, uint32_t m_offset, uint32_t size)
|
||||
while ((m_tmp != NULL) && (size > 0)) {
|
||||
data = mtod(m_tmp, uint8_t *)+m_offset;
|
||||
if (size > (uint32_t)SCTP_BUF_LEN(m_tmp)) {
|
||||
bzero(data, SCTP_BUF_LEN(m_tmp));
|
||||
memset(data, 0, SCTP_BUF_LEN(m_tmp));
|
||||
size -= SCTP_BUF_LEN(m_tmp);
|
||||
} else {
|
||||
bzero(data, size);
|
||||
memset(data, 0, size);
|
||||
size = 0;
|
||||
}
|
||||
/* clear the offset since it's only for the first mbuf */
|
||||
@@ -1729,8 +1729,8 @@ sctp_handle_auth(struct sctp_tcb *stcb, struct sctp_auth_chunk *auth,
|
||||
return (-1);
|
||||
}
|
||||
/* save a copy of the digest, zero the pseudo header, and validate */
|
||||
bcopy(auth->hmac, digest, digestlen);
|
||||
sctp_bzero_m(m, offset + sizeof(*auth), SCTP_SIZE32(digestlen));
|
||||
memcpy(digest, auth->hmac, digestlen);
|
||||
sctp_zero_m(m, offset + sizeof(*auth), SCTP_SIZE32(digestlen));
|
||||
(void)sctp_compute_hmac_m(hmac_id, stcb->asoc.authinfo.recv_key,
|
||||
m, offset, computed_digest);
|
||||
|
||||
@@ -1799,8 +1799,8 @@ sctp_notify_authentication(struct sctp_tcb *stcb, uint32_t indication,
|
||||
sctp_m_freem(m_notify);
|
||||
return;
|
||||
}
|
||||
control->spec_flags = M_NOTIFICATION;
|
||||
control->length = SCTP_BUF_LEN(m_notify);
|
||||
control->spec_flags = M_NOTIFICATION;
|
||||
/* not that we need this */
|
||||
control->tail_mbuf = m_notify;
|
||||
sctp_add_to_readq(stcb->sctp_ep, stcb, control,
|
||||
@@ -1816,7 +1816,7 @@ sctp_notify_authentication(struct sctp_tcb *stcb, uint32_t indication,
|
||||
int
|
||||
sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
{
|
||||
struct sctp_paramhdr *phdr, parm_buf;
|
||||
struct sctp_paramhdr *phdr, param_buf;
|
||||
uint16_t ptype, plen;
|
||||
int peer_supports_asconf = 0;
|
||||
int peer_supports_auth = 0;
|
||||
@@ -1825,7 +1825,7 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
uint8_t saw_asconf_ack = 0;
|
||||
|
||||
/* go through each of the params. */
|
||||
phdr = sctp_get_next_param(m, offset, &parm_buf, sizeof(parm_buf));
|
||||
phdr = sctp_get_next_param(m, offset, ¶m_buf, sizeof(param_buf));
|
||||
while (phdr) {
|
||||
ptype = ntohs(phdr->param_type);
|
||||
plen = ntohs(phdr->param_length);
|
||||
@@ -1839,11 +1839,15 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
if (ptype == SCTP_SUPPORTED_CHUNK_EXT) {
|
||||
/* A supported extension chunk */
|
||||
struct sctp_supported_chunk_types_param *pr_supported;
|
||||
uint8_t local_store[SCTP_PARAM_BUFFER_SIZE];
|
||||
uint8_t local_store[SCTP_SMALL_CHUNK_STORE];
|
||||
int num_ent, i;
|
||||
|
||||
if (plen > sizeof(local_store)) {
|
||||
break;
|
||||
}
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)&local_store, min(plen, sizeof(local_store)));
|
||||
(struct sctp_paramhdr *)&local_store,
|
||||
plen);
|
||||
if (phdr == NULL) {
|
||||
return (-1);
|
||||
}
|
||||
@@ -1861,7 +1865,6 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
}
|
||||
}
|
||||
} else if (ptype == SCTP_RANDOM) {
|
||||
got_random = 1;
|
||||
/* enforce the random length */
|
||||
if (plen != (sizeof(struct sctp_auth_random) +
|
||||
SCTP_AUTH_RANDOM_SIZE_REQUIRED)) {
|
||||
@@ -1869,20 +1872,23 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
"SCTP: invalid RANDOM len\n");
|
||||
return (-1);
|
||||
}
|
||||
got_random = 1;
|
||||
} else if (ptype == SCTP_HMAC_LIST) {
|
||||
uint8_t store[SCTP_PARAM_BUFFER_SIZE];
|
||||
struct sctp_auth_hmac_algo *hmacs;
|
||||
uint8_t store[SCTP_PARAM_BUFFER_SIZE];
|
||||
int num_hmacs;
|
||||
|
||||
if (plen > sizeof(store))
|
||||
if (plen > sizeof(store)) {
|
||||
break;
|
||||
}
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)store, min(plen, sizeof(store)));
|
||||
if (phdr == NULL)
|
||||
(struct sctp_paramhdr *)store,
|
||||
plen);
|
||||
if (phdr == NULL) {
|
||||
return (-1);
|
||||
}
|
||||
hmacs = (struct sctp_auth_hmac_algo *)phdr;
|
||||
num_hmacs = (plen - sizeof(*hmacs)) /
|
||||
sizeof(hmacs->hmac_ids[0]);
|
||||
num_hmacs = (plen - sizeof(*hmacs)) / sizeof(hmacs->hmac_ids[0]);
|
||||
/* validate the hmac list */
|
||||
if (sctp_verify_hmac_param(hmacs, num_hmacs)) {
|
||||
SCTPDBG(SCTP_DEBUG_AUTH1,
|
||||
@@ -1891,18 +1897,19 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
}
|
||||
got_hmacs = 1;
|
||||
} else if (ptype == SCTP_CHUNK_LIST) {
|
||||
int i, num_chunks;
|
||||
struct sctp_auth_chunk_list *chunks;
|
||||
uint8_t chunks_store[SCTP_SMALL_CHUNK_STORE];
|
||||
int i, num_chunks;
|
||||
|
||||
/* did the peer send a non-empty chunk list? */
|
||||
struct sctp_auth_chunk_list *chunks = NULL;
|
||||
|
||||
if (plen > sizeof(chunks_store)) {
|
||||
break;
|
||||
}
|
||||
phdr = sctp_get_next_param(m, offset,
|
||||
(struct sctp_paramhdr *)chunks_store,
|
||||
min(plen, sizeof(chunks_store)));
|
||||
if (phdr == NULL)
|
||||
plen);
|
||||
if (phdr == NULL) {
|
||||
return (-1);
|
||||
|
||||
}
|
||||
/*-
|
||||
* Flip through the list and mark that the
|
||||
* peer supports asconf/asconf_ack.
|
||||
@@ -1924,8 +1931,8 @@ sctp_validate_init_auth_params(struct mbuf *m, int offset, int limit)
|
||||
if (offset >= limit) {
|
||||
break;
|
||||
}
|
||||
phdr = sctp_get_next_param(m, offset, &parm_buf,
|
||||
sizeof(parm_buf));
|
||||
phdr = sctp_get_next_param(m, offset, ¶m_buf,
|
||||
sizeof(param_buf));
|
||||
}
|
||||
/* validate authentication required parameters */
|
||||
if (got_random && got_hmacs) {
|
||||
|
Reference in New Issue
Block a user