mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-01-30 03:32:50 +00:00
Partly apply Elias Oenal's SNMP V3 patch, part 2: Add SNMPv3 support routines. Crypto does not work yet.
This commit is contained in:
parent
d0c3baf340
commit
52fdc6bb3e
@ -135,6 +135,7 @@ SNMPFILES=$(LWIPDIR)/apps/snmp/snmp_asn1.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_mib2_tcp.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_mib2_udp.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_msg.c \
|
||||
$(LWIPDIR)/apps/snmp/snmpv3.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_netconn.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_pbuf_stream.c \
|
||||
$(LWIPDIR)/apps/snmp/snmp_raw.c \
|
||||
|
326
src/apps/snmp/snmpv3.c
Normal file
326
src/apps/snmp/snmpv3.c
Normal file
@ -0,0 +1,326 @@
|
||||
/**
|
||||
* @file
|
||||
* Additional SNMPv3 functionality RFC3414 and RFC3826.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Elias Oenal.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE.
|
||||
*
|
||||
* Author: Elias Oenal <lwip@eliasoenal.com>
|
||||
*/
|
||||
|
||||
#include "snmpv3.h"
|
||||
#include "arch/cc.h"
|
||||
#include "snmp_msg.h"
|
||||
#include "lwip/sys.h"
|
||||
#include <string.h>
|
||||
|
||||
#if LWIP_SNMP && LWIP_SNMP_V3
|
||||
|
||||
#ifdef LWIP_SNMPV3_INCLUDE_ENGINE
|
||||
#include LWIP_SNMPV3_INCLUDE_ENGINE
|
||||
#endif
|
||||
|
||||
#ifdef LWIP_SNMP_V3_CRYPTO
|
||||
#ifdef LWIP_INCLUDE_CRYPTO_LIB
|
||||
#include LWIP_INCLUDE_CRYPTO_LIB
|
||||
#endif
|
||||
#ifdef LWIP_INCLUDE_CRYPTO_MD5
|
||||
#include LWIP_INCLUDE_CRYPTO_MD5
|
||||
#endif
|
||||
#ifdef LWIP_INCLUDE_CRYPTO_SHA
|
||||
#include LWIP_INCLUDE_CRYPTO_SHA
|
||||
#endif
|
||||
#ifdef LWIP_INCLUDE_CRYPTO_DES
|
||||
#include LWIP_INCLUDE_CRYPTO_DES
|
||||
#endif
|
||||
#ifdef LWIP_INCLUDE_CRYPTO_AES
|
||||
#include LWIP_INCLUDE_CRYPTO_AES
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef LWIP_SNMP_V3_CRYPTO
|
||||
#if !defined(LWIP_MD5_HMAC_HANDLE) || !defined(LWIP_MD5_HMAC_INIT) || \
|
||||
!defined(LWIP_MD5_HMAC_UPDATE) || !defined(LWIP_MD5_HMAC_FINAL)
|
||||
#error LWIP_SNMP_V3_CRYPTO requires MD5 HMAC
|
||||
#endif
|
||||
#if !defined(LWIP_SHA_HMAC_HANDLE) || !defined(LWIP_SHA_HMAC_INIT) || \
|
||||
!defined(LWIP_SHA_HMAC_UPDATE) || !defined(LWIP_SHA_HMAC_FINAL)
|
||||
#error LWIP_SNMP_V3_CRYPTO requires SHA HMAC
|
||||
#endif
|
||||
#if !defined(LWIP_DES_CBC_ENCRYPT_HANDLE) || !defined(LWIP_DES_CBC_ENCRYPT_INIT) || \
|
||||
!defined(LWIP_DES_CBC_ENCRYPT_UPDATE) || !defined(LWIP_DES_CBC_ENCRYPT_FINAL) || \
|
||||
!defined(LWIP_DES_CBC_DECRYPT_HANDLE) || !defined(LWIP_DES_CBC_DECRYPT_INIT) || \
|
||||
!defined(LWIP_DES_CBC_DECRYPT_UPDATE) || !defined(LWIP_DES_CBC_DECRYPT_FINAL)
|
||||
#error LWIP_SNMP_V3_CRYPTO requires DES CBC
|
||||
#endif
|
||||
#if !defined(LWIP_AES_CFB_ENCRYPT_HANDLE) || !defined(LWIP_AES_CFB_ENCRYPT_INIT) || \
|
||||
!defined(LWIP_AES_CFB_ENCRYPT_UPDATE) || !defined(LWIP_AES_CFB_ENCRYPT_FINAL) || \
|
||||
!defined(LWIP_AES_CFB_DECRYPT_HANDLE) || !defined(LWIP_AES_CFB_DECRYPT_INIT) || \
|
||||
!defined(LWIP_AES_CFB_DECRYPT_UPDATE) || !defined(LWIP_AES_CFB_DECRYPT_FINAL)
|
||||
#error LWIP_SNMP_V3_CRYPTO requires AES CFB
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define SNMP_MAX_TIME_BOOT 2147483647UL
|
||||
|
||||
/* Engine ID, as specified in RFC3411 */
|
||||
const char*
|
||||
snmpv3_get_engine_id(void)
|
||||
{
|
||||
return LWIP_SNMPV3_GET_ENGINE_ID();
|
||||
}
|
||||
|
||||
/* Has to reset boots, see below */
|
||||
void
|
||||
snmpv3_engine_id_changed(void)
|
||||
{
|
||||
LWIP_SNMPV3_SET_ENGINE_BOOTS(0);
|
||||
}
|
||||
|
||||
/* According to RFC3414 2.2.2.
|
||||
*
|
||||
* The number of times that the SNMP engine has
|
||||
* (re-)initialized itself since snmpEngineID
|
||||
* was last configured.
|
||||
*/
|
||||
u32_t
|
||||
snmpv3_get_engine_boots(void)
|
||||
{
|
||||
if (LWIP_SNMPV3_GET_ENGINE_BOOTS() == 0 ||
|
||||
LWIP_SNMPV3_GET_ENGINE_BOOTS() < SNMP_MAX_TIME_BOOT) {
|
||||
return LWIP_SNMPV3_GET_ENGINE_BOOTS();
|
||||
}
|
||||
|
||||
LWIP_SNMPV3_SET_ENGINE_BOOTS(SNMP_MAX_TIME_BOOT);
|
||||
return LWIP_SNMPV3_GET_ENGINE_BOOTS();
|
||||
}
|
||||
|
||||
/* RFC3414 2.2.2.
|
||||
*
|
||||
* Once the timer reaches 2147483647 it gets reset to zero and the
|
||||
* engine boot ups get incremented.
|
||||
*/
|
||||
u32_t
|
||||
snmpv3_get_engine_time(void)
|
||||
{
|
||||
if (LWIP_SNMPV3_GET_ENGINE_TIME() >= SNMP_MAX_TIME_BOOT) {
|
||||
LWIP_SNMPV3_RESET_ENGINE_TIME();
|
||||
|
||||
if (LWIP_SNMPV3_GET_ENGINE_BOOTS() < SNMP_MAX_TIME_BOOT - 1) {
|
||||
LWIP_SNMPV3_SET_ENGINE_BOOTS(LWIP_SNMPV3_GET_ENGINE_BOOTS() + 1);
|
||||
} else {
|
||||
LWIP_SNMPV3_SET_ENGINE_BOOTS(SNMP_MAX_TIME_BOOT);
|
||||
}
|
||||
}
|
||||
|
||||
return LWIP_SNMPV3_GET_ENGINE_TIME();
|
||||
}
|
||||
|
||||
#ifdef LWIP_SNMP_V3_CRYPTO
|
||||
err_t
|
||||
snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length,
|
||||
const u8_t* key, u8_t algo, u8_t* hmac_out)
|
||||
{
|
||||
u32_t i;
|
||||
u8_t byte;
|
||||
struct snmp_pbuf_stream read_stream;
|
||||
snmp_pbuf_stream_init(&read_stream, stream->pbuf, stream->offset,
|
||||
stream->length);
|
||||
|
||||
if (algo == SNMP_V3_AUTH_ALGO_MD5) {
|
||||
LWIP_MD5_HMAC_HANDLE mh;
|
||||
if (LWIP_MD5_HMAC_INIT(&mh, key, SNMP_V3_MD5_LEN))
|
||||
return ERR_ARG;
|
||||
for (i = 0; i < length; i++) {
|
||||
if (snmp_pbuf_stream_read(&read_stream, &byte))
|
||||
return ERR_ARG;
|
||||
if (LWIP_MD5_HMAC_UPDATE(&mh, &byte, 1))
|
||||
return ERR_ARG;
|
||||
}
|
||||
if (LWIP_MD5_HMAC_FINAL(&mh, hmac_out))
|
||||
return ERR_ARG;
|
||||
|
||||
} else if (algo == SNMP_V3_AUTH_ALGO_SHA) {
|
||||
LWIP_SHA_HMAC_HANDLE sh;
|
||||
if (LWIP_SHA_HMAC_INIT(&sh, key, SNMP_V3_SHA_LEN))
|
||||
return ERR_ARG;
|
||||
for (i = 0; i < length; i++) {
|
||||
if (snmp_pbuf_stream_read(&read_stream, &byte))
|
||||
return ERR_ARG;
|
||||
if (LWIP_SHA_HMAC_UPDATE(&sh, &byte, 1))
|
||||
return ERR_ARG;
|
||||
}
|
||||
if (LWIP_SHA_HMAC_FINAL(&sh, hmac_out))
|
||||
return ERR_ARG;
|
||||
} else
|
||||
return ERR_ARG;
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
err_t
|
||||
snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,
|
||||
const u8_t* key, const u8_t* priv_param, const u32_t engine_boots,
|
||||
const u32_t engine_time, u8_t algo, u8_t mode)
|
||||
{
|
||||
u8_t in_bytes[8];
|
||||
u8_t out_bytes[8];
|
||||
u8_t iv_local[16];
|
||||
|
||||
u32_t i, j;
|
||||
/* RFC 3414 mandates padding for DES */
|
||||
if (algo == SNMP_V3_PRIV_ALGO_DES) {
|
||||
if (length % 8)
|
||||
return ERR_ARG;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
iv_local[i] = priv_param[i] ^ key[i + 8];
|
||||
} else if (algo == SNMP_V3_PRIV_ALGO_AES) {
|
||||
/*
|
||||
* IV is the big endian concatenation of boots,
|
||||
* uptime and priv param - see RFC3826.
|
||||
*/
|
||||
iv_local[0 + 0] = (engine_boots >> 24) & 0xFF;
|
||||
iv_local[0 + 1] = (engine_boots >> 16) & 0xFF;
|
||||
iv_local[0 + 2] = (engine_boots >> 8) & 0xFF;
|
||||
iv_local[0 + 3] = (engine_boots >> 0) & 0xFF;
|
||||
iv_local[4 + 0] = (engine_time >> 24) & 0xFF;
|
||||
iv_local[4 + 1] = (engine_time >> 16) & 0xFF;
|
||||
iv_local[4 + 2] = (engine_time >> 8) & 0xFF;
|
||||
iv_local[4 + 3] = (engine_time >> 0) & 0xFF;
|
||||
memcpy(iv_local + 8, priv_param, 8);
|
||||
}
|
||||
|
||||
struct snmp_pbuf_stream read_stream;
|
||||
struct snmp_pbuf_stream write_stream;
|
||||
snmp_pbuf_stream_init(&read_stream, stream->pbuf, stream->offset,
|
||||
stream->length);
|
||||
snmp_pbuf_stream_init(&write_stream, stream->pbuf, stream->offset,
|
||||
stream->length);
|
||||
|
||||
if (algo == SNMP_V3_PRIV_ALGO_DES && mode == SNMP_V3_PRIV_MODE_ENCRYPT) {
|
||||
LWIP_DES_CBC_ENCRYPT_HANDLE handle;
|
||||
LWIP_DES_CBC_ENCRYPT_INIT(&handle, key);
|
||||
|
||||
for (i = 0; i < length; i += 8) {
|
||||
for (j = 0; j < 8; j++)
|
||||
snmp_pbuf_stream_read(&read_stream, &in_bytes[j]);
|
||||
|
||||
LWIP_DES_CBC_ENCRYPT_UPDATE(&handle, 8, iv_local, in_bytes, out_bytes);
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
snmp_pbuf_stream_write(&write_stream, out_bytes[j]);
|
||||
}
|
||||
|
||||
LWIP_DES_CBC_ENCRYPT_FINAL(&handle);
|
||||
} else if (algo == SNMP_V3_PRIV_ALGO_DES && mode == SNMP_V3_PRIV_MODE_DECRYPT) {
|
||||
LWIP_DES_CBC_DECRYPT_HANDLE handle;
|
||||
LWIP_DES_CBC_DECRYPT_INIT(&handle, key);
|
||||
|
||||
for (i = 0; i < length; i += 8) {
|
||||
for (j = 0; j < 8; j++)
|
||||
snmp_pbuf_stream_read(&read_stream, &in_bytes[j]);
|
||||
|
||||
LWIP_DES_CBC_DECRYPT_UPDATE(&handle, 8, iv_local, in_bytes, out_bytes);
|
||||
|
||||
for (j = 0; j < 8; j++)
|
||||
snmp_pbuf_stream_write(&write_stream, out_bytes[j]);
|
||||
}
|
||||
|
||||
LWIP_DES_CBC_DECRYPT_FINAL(&handle);
|
||||
} else if (algo == SNMP_V3_PRIV_ALGO_AES && mode == SNMP_V3_PRIV_MODE_ENCRYPT) {
|
||||
size_t iv_offset = 0;
|
||||
LWIP_AES_CFB_ENCRYPT_HANDLE handle;
|
||||
LWIP_AES_CFB_ENCRYPT_INIT(&handle, key);
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
snmp_pbuf_stream_read(&read_stream, &in_bytes[0]);
|
||||
LWIP_AES_CFB_ENCRYPT_UPDATE(&handle, 1, &iv_offset, iv_local, in_bytes,
|
||||
out_bytes);
|
||||
snmp_pbuf_stream_write(&write_stream, out_bytes[0]);
|
||||
}
|
||||
|
||||
LWIP_AES_CFB_ENCRYPT_FINAL(&handle);
|
||||
} else if (algo == SNMP_V3_PRIV_ALGO_AES && mode == SNMP_V3_PRIV_MODE_DECRYPT) {
|
||||
size_t iv_off = 0;
|
||||
LWIP_AES_CFB_DECRYPT_HANDLE handle;
|
||||
LWIP_AES_CFB_DECRYPT_INIT(&handle, key);
|
||||
|
||||
for (i = 0; i < length; i++) {
|
||||
snmp_pbuf_stream_read(&read_stream, &in_bytes[0]);
|
||||
LWIP_AES_CFB_DECRYPT_UPDATE(&handle, 1, &iv_off, iv_local, in_bytes,
|
||||
out_bytes);
|
||||
snmp_pbuf_stream_write(&write_stream, out_bytes[0]);
|
||||
}
|
||||
|
||||
LWIP_AES_CFB_DECRYPT_FINAL(&handle);
|
||||
} else
|
||||
return ERR_ARG;
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
/* This function ignores the byte order suggestion in RFC3414
|
||||
* since it simply doesn't influence the effectiveness of an IV.
|
||||
*
|
||||
* Implementing RFC3826 priv param algorithm if LWIP_RAND is available.
|
||||
*
|
||||
* TODO: This is a potential thread safety issue.
|
||||
*/
|
||||
err_t
|
||||
snmpv3_build_priv_param(u8_t* priv_param)
|
||||
{
|
||||
#ifdef LWIP_RAND /* Based on RFC3826 */
|
||||
static u8_t init;
|
||||
static u32_t priv1, priv2;
|
||||
|
||||
/* Lazy initialisation */
|
||||
if (init == 0) {
|
||||
init = 1;
|
||||
priv1 = LWIP_RAND();
|
||||
priv2 = LWIP_RAND();
|
||||
}
|
||||
|
||||
memcpy(&priv_param[0], &priv1, sizeof(priv1));
|
||||
memcpy(&priv_param[4], &priv2, sizeof(priv2));
|
||||
|
||||
/* Emulate 64bit increment */
|
||||
priv1++;
|
||||
if (!priv1) /* Overflow */
|
||||
priv2++;
|
||||
#else /* Based on RFC3414 */
|
||||
static u32_t ctr;
|
||||
u32_t boots = LWIP_SNMPV3_GET_ENGINE_BOOTS();
|
||||
memcpy(&priv_param[0], &boots, 4);
|
||||
memcpy(&priv_param[4], &ctr, 4);
|
||||
ctr++;
|
||||
#endif
|
||||
return ERR_OK;
|
||||
}
|
||||
#endif /* LWIP_SNMP_V3_CRYPTO */
|
||||
|
||||
#endif
|
124
src/apps/snmp/snmpv3.h
Normal file
124
src/apps/snmp/snmpv3.h
Normal file
@ -0,0 +1,124 @@
|
||||
/**
|
||||
* @file
|
||||
* Additional SNMPv3 functionality RFC3414 and RFC3826.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2016 Elias Oenal.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||
* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
||||
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
* OF SUCH DAMAGE.
|
||||
*
|
||||
* Author: Elias Oenal <lwip@eliasoenal.com>
|
||||
*/
|
||||
|
||||
#ifndef LWIP_HDR_APPS_SNMP_V3_H
|
||||
#define LWIP_HDR_APPS_SNMP_V3_H
|
||||
|
||||
#include "lwip/apps/snmp_opts.h"
|
||||
|
||||
#if LWIP_SNMP && LWIP_SNMP_V3
|
||||
|
||||
#include "snmp_pbuf_stream.h"
|
||||
|
||||
#ifndef LWIP_SNMPV3_GET_ENGINE_BOOTS
|
||||
/* #warning RFC3414 complicance requires a persistent boot count */
|
||||
#define LWIP_SNMPV3_GET_ENGINE_BOOTS() 0
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_SET_ENGINE_BOOTS
|
||||
/* #warning RFC3414 complicance requires a method to set boot count */
|
||||
#define LWIP_SNMPV3_SET_ENGINE_BOOTS(val)
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_GET_ENGINE_TIME
|
||||
/* #warning RFC3414 complicance requires the uptime to count until 2147483647 */
|
||||
#define LWIP_SNMPV3_GET_ENGINE_TIME() (sys_now() / 10)
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_RESET_ENGINE_TIME
|
||||
/* #warning RFC3414 complicance requires a method to reset uptime */
|
||||
#define LWIP_SNMPV3_RESET_ENGINE_TIME()
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_GET_ENGINE_ID
|
||||
/* #warning RFC3414 complicance requires an engine ID */
|
||||
/* Using the one from the test vectors from RFC3414 */
|
||||
#define LWIP_SNMPV3_GET_ENGINE_ID() "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02"
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_GET_ENGINE_ID_LEN
|
||||
/* #warning RFC3414 complicance requires an engine ID */
|
||||
#define LWIP_SNMPV3_GET_ENGINE_ID_LEN() 12
|
||||
#endif
|
||||
|
||||
#ifndef LWIP_SNMPV3_GET_USER
|
||||
/* #warning Implement user handling */
|
||||
/* @param username is a pointer to a string.
|
||||
* @param auth_algo is a pointer to u8_t. The implementation has to set this if user was found.
|
||||
* @param auth_key is a pointer to a pointer to a string. Implementation has to set this if user was found.
|
||||
* @param priv_algo is a pointer to u8_t. The implementation has to set this if user was found.
|
||||
* @param priv_key is a pointer to a pointer to a string. Implementation has to set this if user was found.
|
||||
*/
|
||||
/* Dummy implementation, pretend the user was found if cryptography isn't used */
|
||||
#define LWIP_SNMPV3_GET_USER(username, auth_algo, auth_key, priv_algo, priv_key) ((auth_algo || auth_key \
|
||||
|| priv_algo || priv_key)?1:0)
|
||||
#endif
|
||||
|
||||
/* According to RFC 3411 */
|
||||
#define SNMP_V3_MAX_ENGINE_ID_LENGTH 32
|
||||
#define SNMP_V3_MAX_USER_LENGTH 32
|
||||
|
||||
#define SNMP_V3_MAX_AUTH_PARAM_LENGTH 12
|
||||
#define SNMP_V3_MAX_PRIV_PARAM_LENGTH 8
|
||||
|
||||
#define SNMP_V3_AUTH_FLAG 0x01
|
||||
#define SNMP_V3_PRIV_FLAG 0x02
|
||||
|
||||
#define SNMP_V3_MD5_LEN 16
|
||||
#define SNMP_V3_SHA_LEN 20
|
||||
|
||||
#define SNMP_V3_AUTH_ALGO_INVAL 0
|
||||
#define SNMP_V3_AUTH_ALGO_MD5 1
|
||||
#define SNMP_V3_AUTH_ALGO_SHA 2
|
||||
|
||||
#define SNMP_V3_PRIV_ALGO_INVAL 0
|
||||
#define SNMP_V3_PRIV_ALGO_DES 1
|
||||
#define SNMP_V3_PRIV_ALGO_AES 2
|
||||
|
||||
#define SNMP_V3_PRIV_MODE_DECRYPT 0
|
||||
#define SNMP_V3_PRIV_MODE_ENCRYPT 1
|
||||
|
||||
const char* snmpv3_get_engine_id(void);
|
||||
void snmpv3_set_engine_id(const char* id);
|
||||
u32_t snmpv3_get_engine_boots(void);
|
||||
u32_t snmpv3_get_engine_time(void);
|
||||
void snmpv3_engine_id_changed(void);
|
||||
err_t snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key, u8_t algo, u8_t* hmac_out);
|
||||
err_t snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key,
|
||||
const u8_t* priv_param, const u32_t engine_boots, const u32_t engine_time, u8_t algo, u8_t mode);
|
||||
err_t snmpv3_build_priv_param(u8_t* priv_param);
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* LWIP_HDR_APPS_SNMP_V3_H */
|
Loading…
x
Reference in New Issue
Block a user