⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmpksm.c

📁 snmp up 2
💻 C
📖 第 1 页 / 共 4 页
字号:
                                         *offset - seq_offset);    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm security parameters failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    DEBUGMSGTL(("ksm", "KSM: Security parameter encoding completed\n"));    /*     * We're done with the KSM security parameters - now we do the global     * header and wrap up the whole PDU.     */    if (*parms->wholeMsgLen < parms->globalDataLen) {        DEBUGMSGTL(("ksm", "Building global data failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    *offset += parms->globalDataLen;    memcpy(*wholeMsg + *parms->wholeMsgLen - *offset,	   parms->globalData, parms->globalDataLen);    rc = asn_realloc_rbuild_sequence(wholeMsg, parms->wholeMsgLen,                                           offset, 1,                                           (u_char) (ASN_SEQUENCE |                                                     ASN_CONSTRUCTOR),                                           *offset);    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building master packet sequence.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    DEBUGMSGTL(("ksm", "KSM: PDU master packet encoding complete.\n"));    /*     * Now we need to checksum the entire PDU (since it's built).     */    pdu_checksum.contents = malloc(pdu_checksum.length);    if (!pdu_checksum.contents) {        DEBUGMSGTL(("ksm", "Unable to malloc %d bytes for checksum\n",                    pdu_checksum.length));        retval = SNMPERR_MALLOC;        goto error;    }    /*     * If we didn't encrypt the packet, we haven't yet got the subkey.     * Get that now.     */    if (!subkey) {        if (ksm_state)            retcode = krb5_auth_con_getremotesubkey(kcontext, auth_context,                                                    &subkey);        else            retcode = krb5_auth_con_getlocalsubkey(kcontext, auth_context,                                                   &subkey);        if (retcode) {            DEBUGMSGTL(("ksm", "krb5_auth_con_getlocalsubkey failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }    }#ifdef MIT_NEW_CRYPTO    input.data = (char *) (*wholeMsg + *parms->wholeMsgLen - *offset);    input.length = *offset;        retcode = krb5_c_make_checksum(kcontext, cksumtype, subkey,                                       KSM_KEY_USAGE_CHECKSUM, &input,                                       &pdu_checksum);#else                           /* MIT_NEW_CRYPTO */    retcode = krb5_calculate_checksum(kcontext, cksumtype, *wholeMsg +				      *parms->wholeMsgLen - *offset,                                      *offset,                                      (krb5_pointer) subkey->contents,                                      subkey->length, &pdu_checksum);#endif                          /* MIT_NEW_CRYPTO */    if (retcode) {        DEBUGMSGTL(("ksm", "Calculate checksum failed: %s\n",                    error_message(retcode)));        retval = SNMPERR_KRB5;        snmp_set_detail(error_message(retcode));        goto error;    }    DEBUGMSGTL(("ksm", "KSM: Checksum calculation complete.\n"));    memcpy(cksum_pointer, pdu_checksum.contents, pdu_checksum.length);    DEBUGMSGTL(("ksm", "KSM: Writing checksum of %d bytes at offset %d\n",                pdu_checksum.length, cksum_pointer - (*wholeMsg + 1)));    DEBUGMSGTL(("ksm", "KSM: Checksum:"));    for (i = 0; i < pdu_checksum.length; i++)        DEBUGMSG(("ksm", " %02x",                  (unsigned int) pdu_checksum.contents[i]));    DEBUGMSG(("ksm", "\n"));    /*     * If we're _not_ called as part of a response (null ksm_state),     * then save the auth_context for later using our cache routines.     */    if (!ksm_state) {        if ((retval = ksm_insert_cache(parms->pdu->msgid, auth_context,                                       (u_char *) parms->secName,                                       parms->secNameLen)) !=            SNMPERR_SUCCESS)            goto error;        auth_context = NULL;    }    DEBUGMSGTL(("ksm", "KSM processing complete!\n"));  error:    if (pdu_checksum.contents)#ifdef MIT_NEW_CRYPTO        krb5_free_checksum_contents(kcontext, &pdu_checksum);#else                           /* MIT_NEW_CRYPTO */        free(pdu_checksum.contents);#endif                          /* MIT_NEW_CRYPTO */    if (ivector.data)        free(ivector.data);    if (subkey)        krb5_free_keyblock(kcontext, subkey);    if (encrypted_data)        free(encrypted_data);    if (cc)        krb5_cc_close(kcontext, cc);    if (auth_context && !ksm_state)        krb5_auth_con_free(kcontext, auth_context);    return retval;}/**************************************************************************** * * ksm_process_in_msg * * Parameters: *	(See list below...) * * Returns: *	KSM_ERR_NO_ERROR                        On success. *	SNMPERR_KRB5 *	KSM_ERR_GENERIC_ERROR *	KSM_ERR_UNSUPPORTED_SECURITY_LEVEL * * * Processes an incoming message. * ****************************************************************************/intksm_process_in_msg(struct snmp_secmod_incoming_params *parms){    long            temp;    krb5_cksumtype  cksumtype;    krb5_auth_context auth_context = NULL;    krb5_error_code retcode;    krb5_checksum   checksum;    krb5_data       ap_req, ivector;    krb5_flags      flags;    krb5_keyblock  *subkey = NULL;#ifdef MIT_NEW_CRYPTO    krb5_data       input, output;    krb5_boolean    valid;    krb5_enc_data   in_crypt;#else                           /* MIT_NEW_CRYPTO */    krb5_encrypt_block eblock;#endif                          /* MIT_NEW_CRYPTO */    krb5_ticket    *ticket = NULL;    int             retval = SNMPERR_SUCCESS, response = 0;    size_t          length =        parms->wholeMsgLen - (u_int) (parms->secParams - parms->wholeMsg);    u_char         *current = parms->secParams, type;    size_t          cksumlength, blocksize;    long            hint;    char           *cname;    struct ksm_secStateRef *ksm_state;    struct ksm_cache_entry *entry;    DEBUGMSGTL(("ksm", "Processing has begun\n"));    checksum.contents = NULL;    ap_req.data = NULL;    ivector.length = 0;    ivector.data = NULL;    /*     * First, parse the security parameters (because we need the subkey inside     * of the ticket to do anything     */    if ((current = asn_parse_sequence(current, &length, &type,                                      (ASN_UNIVERSAL | ASN_PRIMITIVE |                                       ASN_OCTET_STR),                                      "ksm first octet")) == NULL) {        DEBUGMSGTL(("ksm", "Initial security paramter parsing failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    if ((current = asn_parse_sequence(current, &length, &type,                                      (ASN_SEQUENCE | ASN_CONSTRUCTOR),                                      "ksm sequence")) == NULL) {        DEBUGMSGTL(("ksm",                    "Security parameter sequence parsing failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    if ((current = asn_parse_int(current, &length, &type, &temp,                                 sizeof(temp))) == NULL) {        DEBUGMSGTL(("ksm", "Security parameter checksum type parsing"                    "failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    cksumtype = temp;    if (!valid_cksumtype(cksumtype)) {        DEBUGMSGTL(("ksm", "Invalid checksum type (%d)\n", cksumtype));        retval = SNMPERR_KRB5;        snmp_set_detail("Invalid checksum type");        goto error;    }    if (!is_keyed_cksum(cksumtype)) {        DEBUGMSGTL(("ksm", "Checksum type %d is not a keyed checksum\n",                    cksumtype));        snmp_set_detail("Checksum is not a keyed checksum");        retval = SNMPERR_KRB5;        goto error;    }    if (!is_coll_proof_cksum(cksumtype)) {        DEBUGMSGTL(("ksm", "Checksum type %d is not a collision-proof "                    "checksum\n", cksumtype));        snmp_set_detail("Checksum is not a collision-proof checksum");        retval = SNMPERR_KRB5;        goto error;    }    checksum.checksum_type = cksumtype;    cksumlength = length;    if ((current = asn_parse_sequence(current, &cksumlength, &type,                                      (ASN_UNIVERSAL | ASN_PRIMITIVE |                                       ASN_OCTET_STR), "ksm checksum")) ==        NULL) {        DEBUGMSGTL(("ksm",                    "Security parameter checksum parsing failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    checksum.contents = malloc(cksumlength);    if (!checksum.contents) {        DEBUGMSGTL(("ksm", "Unable to malloc %d bytes for checksum.\n",                    cksumlength));        retval = SNMPERR_MALLOC;        goto error;    }    memcpy(checksum.contents, current, cksumlength);    checksum.length = cksumlength;    checksum.checksum_type = cksumtype;    /*     * Zero out the checksum so the validation works correctly     */    memset(current, 0, cksumlength);    current += cksumlength;    length = parms->wholeMsgLen - (u_int) (current - parms->wholeMsg);    if ((current = asn_parse_sequence(current, &length, &type,                                      (ASN_UNIVERSAL | ASN_PRIMITIVE |                                       ASN_OCTET_STR), "ksm ap_req")) ==        NULL) {        DEBUGMSGTL(("ksm", "KSM security parameter AP_REQ/REP parsing "                    "failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    ap_req.length = length;    ap_req.data = malloc(length);    if (!ap_req.data) {        DEBUGMSGTL(("ksm",                    "KSM unable to malloc %d bytes for AP_REQ/REP.\n",                    length));        retval = SNMPERR_MALLOC;        goto error;    }    memcpy(ap_req.data, current, length);    current += length;    length = parms->wholeMsgLen - (u_int) (current - parms->wholeMsg);    if ((current = asn_parse_int(current, &length, &type, &hint,                                 sizeof(hint))) == NULL) {        DEBUGMSGTL(("ksm",                    "KSM security parameter hint parsing failed\n"));        retval = SNMPERR_ASN_PARSE_ERR;        goto error;    }    /*     * Okay!  We've got it all!  Now try decoding the damn ticket.     *     * But of course there's a WRINKLE!  We need to figure out if we're     * processing a AP_REQ or an AP_REP.  How do we do that?  We're going     * to cheat, and look at the first couple of bytes (which is what     * the Kerberos library routines do anyway).     *     * If there are ever new Kerberos message formats, we'll need to fix     * this here.     *     * If it's a _response_, then we need to get the auth_context     * from our cache.     */    if (ap_req.length        && (ap_req.data[0] == 0x6e || ap_req.data[0] == 0x4e)) {        /*         * We need to initalize the authorization context, and set the         * replay cache in it (and initialize the replay cache if we         * haven't already         */        retcode = krb5_auth_con_init(kcontext, &auth_context);        if (retcode) {            DEBUGMSGTL(("ksm", "krb5_auth_con_init failed: %s\n",                        error_message(retcode)));            retval = SNMPERR_KRB5;            snmp_set_detail(error_message(retcode));            goto error;        }        if (!rcache) {            krb5_data       server;            server.data = "host";            server.length = strlen(server.data);            retcode = krb5_get_server_rcache(kcontext, &server, &rcache);            if (retcode) {                DEBUGMSGTL(("ksm", "krb5_get_server_rcache failed: %s\n",                            error_message(retcode)));                retval = SNMPERR_KRB5;                snmp_set_detail(error_message(retcode));                goto error;            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -