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

📄 snmpksm.c

📁 snmp up 2
💻 C
📖 第 1 页 / 共 4 页
字号:
         * If we don't have a ksm_state, then we're a request.  Get a         * credential cache and build a ap_req.         */        retcode = krb5_cc_default(kcontext, &cc);        if (retcode) {            DEBUGMSGTL(("ksm", "KSM: krb5_cc_default failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }        DEBUGMSGTL(("ksm", "KSM: Set credential cache successfully\n"));        /*         * This seems odd, since we don't need this until later (or earlier,         * depending on how you look at it), but because the most likely         * errors are Kerberos at this point, I'll get this now to save         * time not encoding the rest of the packet.         *         * Also, we need the subkey to encrypt the PDU (if required).         */        retcode =            krb5_mk_req(kcontext, &auth_context,                        AP_OPTS_MUTUAL_REQUIRED | AP_OPTS_USE_SUBKEY,                        (char *) "host", parms->session->peername, NULL,                        cc, &outdata);        if (retcode) {            DEBUGMSGTL(("ksm", "KSM: krb5_mk_req failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }        DEBUGMSGTL(("ksm", "KSM: ticket retrieved successfully\n"));    } else {        /*         * Grab the auth_context from our security state reference         */        auth_context = ksm_state->auth_context;        /*         * Bundle up an AP_REP.  Note that we do this only when we         * have a security state reference (which means we're in an agent         * and we're sending a response).         */        DEBUGMSGTL(("ksm", "KSM: Starting reply processing.\n"));        retcode = krb5_mk_rep(kcontext, auth_context, &outdata);        if (retcode) {            DEBUGMSGTL(("ksm", "KSM: krb5_mk_rep failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }        DEBUGMSGTL(("ksm", "KSM: Finished with krb5_mk_rep()\n"));    }    /*     * If we have to encrypt the PDU, do that now     */    if (parms->secLevel == SNMP_SEC_LEVEL_AUTHPRIV) {        DEBUGMSGTL(("ksm", "KSM: Starting PDU encryption.\n"));        /*         * It's weird -         *         * If we're on the manager, it's a local subkey (because that's in         * our AP_REQ)         *         * If we're on the agent, it's a remote subkey (because that comes         * FROM the received AP_REQ).         */        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",                        "KSM: krb5_auth_con_getlocalsubkey failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }        /*         * Note that here we need to handle different things between the         * old and new crypto APIs.  First, we need to get the final encrypted         * length of the PDU.         */#ifdef MIT_NEW_CRYPTO        retcode = krb5_c_encrypt_length(kcontext, subkey->enctype,                                        parms->scopedPduLen,                                        &encrypted_length);        if (retcode) {            DEBUGMSGTL(("ksm",                        "Encryption length calculation failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }#else                           /* MIT_NEW_CRYPTO */        krb5_use_enctype(kcontext, &eblock, subkey->enctype);        retcode = krb5_process_key(kcontext, &eblock, subkey);        if (retcode) {            DEBUGMSGTL(("ksm", "krb5_process_key failed: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }        encrypted_length = krb5_encrypt_size(parms->scopedPduLen,                                             eblock.crypto_entry);#endif                          /* MIT_NEW_CRYPTO */        encrypted_data = malloc(encrypted_length);        if (!encrypted_data) {            DEBUGMSGTL(("ksm",                        "KSM: Unable to malloc %d bytes for encrypt "                        "buffer: %s\n", parms->scopedPduLen,                        strerror(errno)));            retval = SNMPERR_MALLOC;#ifndef MIT_NEW_CRYPTO            krb5_finish_key(kcontext, &eblock);#endif                          /* ! MIT_NEW_CRYPTO */            goto error;        }        /*         * We need to set up a blank initialization vector for the encryption.         * Use a block of all zero's (which is dependent on the block size         * of the encryption method).         */#ifdef MIT_NEW_CRYPTO        retcode = krb5_c_block_size(kcontext, subkey->enctype, &blocksize);        if (retcode) {            DEBUGMSGTL(("ksm",                        "Unable to determine crypto block size: %s\n",                        error_message(retcode)));            snmp_set_detail(error_message(retcode));            retval = SNMPERR_KRB5;            goto error;        }#else                           /* MIT_NEW_CRYPTO */        blocksize =            krb5_enctype_array[subkey->enctype]->system->block_length;#endif                          /* MIT_NEW_CRYPTO */        ivector.data = malloc(blocksize);        if (!ivector.data) {            DEBUGMSGTL(("ksm", "Unable to allocate %d bytes for ivector\n",                        blocksize));            retval = SNMPERR_MALLOC;            goto error;        }        ivector.length = blocksize;        memset(ivector.data, 0, blocksize);        /*         * Finally!  Do the encryption!         */#ifdef MIT_NEW_CRYPTO        input.data = (char *) parms->scopedPdu;        input.length = parms->scopedPduLen;        output.ciphertext.data = (char *) encrypted_data;        output.ciphertext.length = encrypted_length;        retcode =            krb5_c_encrypt(kcontext, subkey, KSM_KEY_USAGE_ENCRYPTION,                           &ivector, &input, &output);#else                           /* MIT_NEW_CRYPTO */        retcode = krb5_encrypt(kcontext, (krb5_pointer) parms->scopedPdu,                               (krb5_pointer) encrypted_data,                               parms->scopedPduLen, &eblock, ivector.data);        krb5_finish_key(kcontext, &eblock);#endif                          /* MIT_NEW_CRYPTO */        if (retcode) {            DEBUGMSGTL(("ksm", "KSM: krb5_encrypt failed: %s\n",                        error_message(retcode)));            retval = SNMPERR_KRB5;            snmp_set_detail(error_message(retcode));            goto error;        }	*offset = 0;        rc = asn_realloc_rbuild_string(wholeMsg, parms->wholeMsgLen,                                             offset, 1,                                             (u_char) (ASN_UNIVERSAL |                                                       ASN_PRIMITIVE |                                                       ASN_OCTET_STR),                                             encrypted_data,                                             encrypted_length);        if (rc == 0) {            DEBUGMSGTL(("ksm", "Building encrypted payload failed.\n"));            retval = SNMPERR_TOO_LONG;            goto error;        }        DEBUGMSGTL(("ksm", "KSM: Encryption complete.\n"));    } else {        /*         * Plaintext PDU (not encrypted)         */        if (*parms->wholeMsgLen < parms->scopedPduLen) {            DEBUGMSGTL(("ksm", "Not enough room for plaintext PDU.\n"));            retval = SNMPERR_TOO_LONG;            goto error;        }    }    /*     * Start encoding the msgSecurityParameters     *     * For now, use 0 for the response hint     */    DEBUGMSGTL(("ksm", "KSM: scopedPdu added to payload\n"));    seq_offset = *offset;    rc = asn_realloc_rbuild_int(wholeMsg, parms->wholeMsgLen,                                      offset, 1,                                      (u_char) (ASN_UNIVERSAL |                                                ASN_PRIMITIVE |                                                ASN_INTEGER),                                      (long *) &zero, sizeof(zero));    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm security parameters failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    rc = asn_realloc_rbuild_string(wholeMsg, parms->wholeMsgLen,                                         offset, 1,                                         (u_char) (ASN_UNIVERSAL |                                                   ASN_PRIMITIVE |                                                   ASN_OCTET_STR),                                         (u_char *) outdata.data,                                         outdata.length);    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm AP_REQ failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    /*     * Hardcode checksum type FOR NOW! XXX (but make sure the response     * checksum type is the same as the request).     *     * Not sure what we're supposed to do about checksum negotiation.     */    if (ksm_state)        cksumtype = ksm_state->cksumtype;    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;    }#ifdef MIT_NEW_CRYPTO    retcode = krb5_c_checksum_length(kcontext, cksumtype, &blocksize);    if (retcode) {        DEBUGMSGTL(("ksm", "Unable to determine checksum length: %s\n",                    error_message(retcode)));        snmp_set_detail(error_message(retcode));        retval = SNMPERR_KRB5;        goto error;    }    pdu_checksum.length = blocksize;#else                           /* MIT_NEW_CRYPTO */    pdu_checksum.length = krb5_checksum_size(kcontext, cksumtype);    pdu_checksum.checksum_type = cksumtype;#endif                          /* MIT_NEW_CRYPTO */    /*     * Note that here, we're just leaving blank space for the checksum;     * we remember where that is, and we'll fill it in later.     */    *offset += pdu_checksum.length;    memset(*wholeMsg + *parms->wholeMsgLen - *offset, 0, pdu_checksum.length);    cksum_pointer = *wholeMsg + *parms->wholeMsgLen - *offset;    rc = asn_realloc_rbuild_header(wholeMsg, parms->wholeMsgLen,                                         parms->wholeMsgOffset, 1,                                         (u_char) (ASN_UNIVERSAL |                                                   ASN_PRIMITIVE |                                                   ASN_OCTET_STR),                                         pdu_checksum.length);    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm security parameters failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    rc = asn_realloc_rbuild_int(wholeMsg, parms->wholeMsgLen,                                      parms->wholeMsgOffset, 1,                                      (u_char) (ASN_UNIVERSAL |                                                ASN_PRIMITIVE |                                                ASN_OCTET_STR),                                      (long *) &cksumtype,                                      sizeof(cksumtype));    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm security parameters failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    rc = asn_realloc_rbuild_sequence(wholeMsg, parms->wholeMsgLen,                                           parms->wholeMsgOffset, 1,                                           (u_char) (ASN_SEQUENCE |                                                     ASN_CONSTRUCTOR),                                           *offset - seq_offset);    if (rc == 0) {        DEBUGMSGTL(("ksm", "Building ksm security parameters failed.\n"));        retval = SNMPERR_TOO_LONG;        goto error;    }    rc = asn_realloc_rbuild_header(wholeMsg, parms->wholeMsgLen,                                         parms->wholeMsgOffset, 1,                                         (u_char) (ASN_UNIVERSAL |                                                   ASN_PRIMITIVE |                                                   ASN_OCTET_STR),

⌨️ 快捷键说明

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