📄 ipmi_auth.cpp
字号:
/* * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard <minyard@mvista.com> * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser <thomas.kanngieser@fci.com> */#include "ipmi_auth.h"#include <string.h>#include <errno.h>#include <assert.h>cIpmiAuth *IpmiAuthFactory( tIpmiAuthType type ){ switch( type ) { case eIpmiAuthTypeNone: return new cIpmiAuthNone; case eIpmiAuthTypeMd2:#ifdef HAVE_OPENSSL_MD2_H return new cIpmiAuthMd2;#else break;#endif case eIpmiAuthTypeMd5:#ifdef HAVE_OPENSSL_MD5_H return new cIpmiAuthMd5;#else break;#endif case eIpmiAuthTypeStraight: return new cIpmiAuthStraight; case eIpmiAuthTypeOem: break; } assert( 0 ); return 0;}intcIpmiAuthNone::Init( const unsigned char * /*password*/ ){ return 0;}intcIpmiAuthNone::Gen( cIpmiAuthSg /*d*/[], void *output ){ memset( output, 0, 16 ); return 0;}intcIpmiAuthNone::Check( cIpmiAuthSg /*d*/[], void * /*code*/ ){ return 0;}#ifdef HAVE_OPENSSL_MD2_H#include <openssl/md2.h>intcIpmiAuthMd2::Init( const unsigned char *password ){ memcpy( data, password, 16 ); return 0;}intcIpmiAuthMd2::Gen( cIpmiAuthSg d[], void *output ){ MD2_CTX ctx; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( (unsigned char *)output, &ctx ); return 0;}intcIpmiAuthMd2::Check( cIpmiAuthSg d[], void *code ){ MD2_CTX ctx; unsigned char md[16]; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0;}#endif#ifdef HAVE_OPENSSL_MD5_H#include <openssl/md5.h>intcIpmiAuthMd5::Init( const unsigned char *password ){ memcpy( data, password, 16 ); return 0;}intcIpmiAuthMd5::Gen( cIpmiAuthSg d[], void *output ){ MD5_CTX ctx; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( (unsigned char *)output, &ctx ); return 0;}intcIpmiAuthMd5::Check( cIpmiAuthSg d[], void *code ){ MD5_CTX ctx; unsigned char md[16]; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0;}#endifintcIpmiAuthStraight::Init( const unsigned char *password ){ memcpy( data, password, 16 ); return 0;}intcIpmiAuthStraight::Gen( cIpmiAuthSg /*d*/[], void *output ){ memcpy( output, data, 16 ); return 0;}intcIpmiAuthStraight::Check( cIpmiAuthSg /*d*/[], void *code ){ if ( strncmp( (char *)data, (char *)code, 16 ) != 0 ) return EINVAL; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -