version 1.4, 2019/09/18 09:59:05 |
version 1.4.2.1, 2019/10/27 20:05:12 |
|
|
usm->userlen = userlen; |
usm->userlen = userlen; |
return -1; |
return -1; |
} |
} |
ber_free_element(ber); |
ober_free_element(ber); |
|
|
agent->v3->level = level; |
agent->v3->level = level; |
usm->userlen = userlen; |
usm->userlen = userlen; |
|
|
if (!usm->engineidset || !usm->bootsset || !usm->timeset) { |
if (!usm->engineidset || !usm->bootsset || !usm->timeset) { |
if ((ber = snmp_get(agent, NULL, 0)) == NULL) |
if ((ber = snmp_get(agent, NULL, 0)) == NULL) |
return -1; |
return -1; |
ber_free_element(ber); |
ober_free_element(ber); |
} |
} |
return 0; |
return 0; |
} |
} |
|
|
if (agent->v3->level & SNMP_MSGFLAG_PRIV) |
if (agent->v3->level & SNMP_MSGFLAG_PRIV) |
saltlen = sizeof(usmcookie->salt); |
saltlen = sizeof(usmcookie->salt); |
|
|
if ((params = ber_printf_elements(NULL, "{xddxxx}", usm->engineid, |
if ((params = ober_printf_elements(NULL, "{xddxxx}", usm->engineid, |
usm->engineidlen, usmcookie->boots, usmcookie->time, usm->user, |
usm->engineidlen, usmcookie->boots, usmcookie->time, usm->user, |
usm->userlen, digest, digestlen, &(usmcookie->salt), |
usm->userlen, digest, digestlen, &(usmcookie->salt), |
saltlen)) == NULL) { |
saltlen)) == NULL) { |
|
|
return NULL; |
return NULL; |
} |
} |
|
|
if (ber_scanf_elements(params, "{SSSSe", &digestelm) == -1) { |
if (ober_scanf_elements(params, "{SSSSe", &digestelm) == -1) { |
ber_free_element(params); |
ober_free_element(params); |
free(usmcookie); |
free(usmcookie); |
return NULL; |
return NULL; |
} |
} |
|
|
ber_set_writecallback(digestelm, usm_digest_pos, usmcookie); |
ober_set_writecallback(digestelm, usm_digest_pos, usmcookie); |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
if (ber_write_elements(&ber, params) != -1) |
if (ober_write_elements(&ber, params) != -1) |
berlen = ber_copy_writebuf(&ber, (void **)&secparams); |
berlen = ber_copy_writebuf(&ber, (void **)&secparams); |
|
|
*len = berlen; |
*len = berlen; |
ber_free_element(params); |
ober_free_element(params); |
ber_free(&ber); |
ober_free(&ber); |
return secparams; |
return secparams; |
} |
} |
|
|
|
|
size_t encpdulen; |
size_t encpdulen; |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
pdulen = ber_write_elements(&ber, pdu); |
pdulen = ober_write_elements(&ber, pdu); |
if (pdulen == -1) |
if (pdulen == -1) |
return NULL; |
return NULL; |
|
|
ber_get_writebuf(&ber, (void **)&serialpdu); |
ober_get_writebuf(&ber, (void **)&serialpdu); |
|
|
encpdu = usm_crypt(usm->cipher, 1, usm->privkey, usmcookie, serialpdu, |
encpdu = usm_crypt(usm->cipher, 1, usm->privkey, usmcookie, serialpdu, |
pdulen, &encpdulen); |
pdulen, &encpdulen); |
ber_free(&ber); |
ober_free(&ber); |
if (encpdu == NULL) |
if (encpdu == NULL) |
return NULL; |
return NULL; |
|
|
retpdu = ber_add_nstring(NULL, encpdu, encpdulen); |
retpdu = ober_add_nstring(NULL, encpdu, encpdulen); |
free(encpdu); |
free(encpdu); |
return retpdu; |
return retpdu; |
} |
} |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
bzero(exp_digest, sizeof(exp_digest)); |
bzero(exp_digest, sizeof(exp_digest)); |
|
|
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
ber_set_readbuf(&ber, buf, buflen); |
ober_set_readbuf(&ber, buf, buflen); |
if ((secparams = ber_read_elements(&ber, NULL)) == NULL) |
if ((secparams = ober_read_elements(&ber, NULL)) == NULL) |
return -1; |
return -1; |
ber_free(&ber); |
ober_free(&ber); |
|
|
if ((usmcookie = malloc(sizeof(*usmcookie))) == NULL) |
if ((usmcookie = malloc(sizeof(*usmcookie))) == NULL) |
goto fail; |
goto fail; |
*cookie = usmcookie; |
*cookie = usmcookie; |
|
|
if (ber_scanf_elements(secparams, "{xddxpxx}", &engineid, &engineidlen, |
if (ober_scanf_elements(secparams, "{xddxpxx}", &engineid, &engineidlen, |
&(usmcookie->boots), &(usmcookie->time), &user, &userlen, |
&(usmcookie->boots), &(usmcookie->time), &user, &userlen, |
&digestoffset, &digest, &digestlen, &salt, &saltlen) == -1) |
&digestoffset, &digest, &digestlen, &salt, &saltlen) == -1) |
goto fail; |
goto fail; |
|
|
if (digestlen != 0) |
if (digestlen != 0) |
goto fail; |
goto fail; |
|
|
ber_free_element(secparams); |
ober_free_element(secparams); |
return 0; |
return 0; |
|
|
fail: |
fail: |
free(usmcookie); |
free(usmcookie); |
ber_free_element(secparams); |
ober_free_element(secparams); |
return -1; |
return -1; |
} |
} |
|
|
|
|
return NULL; |
return NULL; |
|
|
bzero(&ber, sizeof(ber)); |
bzero(&ber, sizeof(ber)); |
ber_set_application(&ber, smi_application); |
ober_set_application(&ber, smi_application); |
ber_set_readbuf(&ber, rawpdu, rawpdulen); |
ober_set_readbuf(&ber, rawpdu, rawpdulen); |
scopedpdu = ber_read_elements(&ber, NULL); |
scopedpdu = ober_read_elements(&ber, NULL); |
ber_free(&ber); |
ober_free(&ber); |
free(rawpdu); |
free(rawpdu); |
|
|
return scopedpdu; |
return scopedpdu; |