openssl 错误:MD5Init 的隐式声明

发布于 2024-12-06 05:03:21 字数 4034 浏览 0 评论 0原文

首先,我显示我的 c 文件的代码 ..

#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <memory.h>
#include <string.h>
#include <ctype.h>
#include "sendip_module.h"
#include "ipv6ext.h"
#include "../ipv6.h"
#include "../ipv4.h"
#include "ah.h"
#include "esp.h"
#include "crypto_module.h"

#include <openssl/hmac.h>
#include <openssl/md5.h>

/*
code for hmac_md5 here....

void
hmac_md5(text, text_len, key, key_len, digest)
unsigned char*  text;                /* pointer to data stream */
int text_len;            /* length of data stream */
unsigned char* key;                 /* pointer to authentication key */
int key_len;             /* length of authentication key */
caddr_t digest;              /* caller digest to be filled in */

{
    MD5_CTX context;
    unsigned char k_ipad[65];    /* inner padding -
                                  * key XORd with ipad
                                  */
    unsigned char k_opad[65];    /* outer padding -
                                  * key XORd with opad
                                  */
    unsigned char tk[16];
    int i;
    /* if key is longer than 64 bytes reset it to key=MD5(key) */
    if (key_len > 64) {

            MD5_CTX      tctx;

            MD5Init(&tctx);
            MD5Update(&tctx, key, key_len);
            MD5Final(tk, &tctx);

            key = tk;
            key_len = 16;
    }

    /*
     * the HMAC_MD5 transform looks like:
     *
     * MD5(K XOR opad, MD5(K XOR ipad, text))
     *
     * where K is an n byte key
     * ipad is the byte 0x36 repeated 64 times
     * opad is the byte 0x5c repeated 64 times
     * and text is the data being protected
     */

    /* start out by storing key in pads */
    bzero( k_ipad, sizeof k_ipad);
    bzero( k_opad, sizeof k_opad);
    bcopy( key, k_ipad, key_len);
    bcopy( key, k_opad, key_len);

    /* XOR key with ipad and opad values */
    for (i=0; i<64; i++) {
            k_ipad[i] ^= 0x36;
            k_opad[i] ^= 0x5c;
    }
    /*
     * perform inner MD5
     */
    MD5Init(&context);                   /* init context for 1st
                                          * pass */
    MD5Update(&context, k_ipad, 64);      /* start with inner pad */
    MD5Update(&context, text, text_len); /* then text of datagram */
    MD5Final(digest, &context);          /* finish up 1st pass */
    /*
     * perform outer MD5
     */
    MD5Init(&context);                   /* init context for 2nd
                                          * pass */
    MD5Update(&context, k_opad, 64);     /* start with outer pad */
    MD5Update(&context, digest, 16);     /* then results of 1st
                                          * hash */
    MD5Final(digest, &context);          /* finish up 2nd pass */

}

*/

/*
rest of the program logic...
*/

我已经包含 ...<.安装 openssl 的路径.....>../openssl/include 到 C_INCLUDE_PATH 并将其导出。

现在,当我尝试编译它时出现错误:

 $ make

gcc -o xorauth.so -I.. -fPIC -fsigned-char -pipe -Wall -Wpointer-arith -Wwrite-strings
wstrict-prototypes -Wnested-externs -Winline -Werror -g -Wcast-align -  
DSENDIP_LIBS=\"/usr/local/lib/sendip\" -shared xorauth.c ../libsendipaux.a  
../libsendipaux.a

cc1: warnings being treated as errors

xorauth.c:34:1: error: function declaration isn’t a prototype
xorauth.c: In function ‘hmac_md5’:
xorauth.c:56:17: error: implicit declaration of function ‘MD5Init’
xorauth.c:56:17: error: nested extern declaration of ‘MD5Init’
xorauth.c:57:17: error: implicit declaration of function ‘MD5Update’
xorauth.c:57:17: error: nested extern declaration of ‘MD5Update’ 
xorauth.c:58:17: error: implicit declaration of function ‘MD5Final’
xorauth.c:58:17: error: nested extern declaration of ‘MD5Final’
make: *** [xorauth.so] Error 1

如果需要,我将编辑其他实现细节,我跳过它们只是为了使帖子变小,因为我认为我需要做一些关于包含路径和头文件的事情,我是浑然不觉。

出了什么问题请帮帮我???

First of all I am showing the code for my c file ..

#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <memory.h>
#include <string.h>
#include <ctype.h>
#include "sendip_module.h"
#include "ipv6ext.h"
#include "../ipv6.h"
#include "../ipv4.h"
#include "ah.h"
#include "esp.h"
#include "crypto_module.h"

#include <openssl/hmac.h>
#include <openssl/md5.h>

/*
code for hmac_md5 here....

void
hmac_md5(text, text_len, key, key_len, digest)
unsigned char*  text;                /* pointer to data stream */
int text_len;            /* length of data stream */
unsigned char* key;                 /* pointer to authentication key */
int key_len;             /* length of authentication key */
caddr_t digest;              /* caller digest to be filled in */

{
    MD5_CTX context;
    unsigned char k_ipad[65];    /* inner padding -
                                  * key XORd with ipad
                                  */
    unsigned char k_opad[65];    /* outer padding -
                                  * key XORd with opad
                                  */
    unsigned char tk[16];
    int i;
    /* if key is longer than 64 bytes reset it to key=MD5(key) */
    if (key_len > 64) {

            MD5_CTX      tctx;

            MD5Init(&tctx);
            MD5Update(&tctx, key, key_len);
            MD5Final(tk, &tctx);

            key = tk;
            key_len = 16;
    }

    /*
     * the HMAC_MD5 transform looks like:
     *
     * MD5(K XOR opad, MD5(K XOR ipad, text))
     *
     * where K is an n byte key
     * ipad is the byte 0x36 repeated 64 times
     * opad is the byte 0x5c repeated 64 times
     * and text is the data being protected
     */

    /* start out by storing key in pads */
    bzero( k_ipad, sizeof k_ipad);
    bzero( k_opad, sizeof k_opad);
    bcopy( key, k_ipad, key_len);
    bcopy( key, k_opad, key_len);

    /* XOR key with ipad and opad values */
    for (i=0; i<64; i++) {
            k_ipad[i] ^= 0x36;
            k_opad[i] ^= 0x5c;
    }
    /*
     * perform inner MD5
     */
    MD5Init(&context);                   /* init context for 1st
                                          * pass */
    MD5Update(&context, k_ipad, 64);      /* start with inner pad */
    MD5Update(&context, text, text_len); /* then text of datagram */
    MD5Final(digest, &context);          /* finish up 1st pass */
    /*
     * perform outer MD5
     */
    MD5Init(&context);                   /* init context for 2nd
                                          * pass */
    MD5Update(&context, k_opad, 64);     /* start with outer pad */
    MD5Update(&context, digest, 16);     /* then results of 1st
                                          * hash */
    MD5Final(digest, &context);          /* finish up 2nd pass */

}

*/

/*
rest of the program logic...
*/

I have already included ...<.path where openssl is installed.....>../openssl/include to C_INCLUDE_PATH and exported it.

and now when i try to compile it getting error :

 $ make

gcc -o xorauth.so -I.. -fPIC -fsigned-char -pipe -Wall -Wpointer-arith -Wwrite-strings
wstrict-prototypes -Wnested-externs -Winline -Werror -g -Wcast-align -  
DSENDIP_LIBS=\"/usr/local/lib/sendip\" -shared xorauth.c ../libsendipaux.a  
../libsendipaux.a

cc1: warnings being treated as errors

xorauth.c:34:1: error: function declaration isn’t a prototype
xorauth.c: In function ‘hmac_md5’:
xorauth.c:56:17: error: implicit declaration of function ‘MD5Init’
xorauth.c:56:17: error: nested extern declaration of ‘MD5Init’
xorauth.c:57:17: error: implicit declaration of function ‘MD5Update’
xorauth.c:57:17: error: nested extern declaration of ‘MD5Update’ 
xorauth.c:58:17: error: implicit declaration of function ‘MD5Final’
xorauth.c:58:17: error: nested extern declaration of ‘MD5Final’
make: *** [xorauth.so] Error 1

if required I will edit the other implementation details I have skiped them just to make the post small because I think there is something which i need to do regarding include path and header files and i am unaware of it.

What is going wrong please help me ???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

唱一曲作罢 2024-12-13 05:03:21

OpenSSL 中没有 MD5Init 函数。 (BSD 实现中有。)

man MD5_Init (注意下划线),或参见 这里

编辑

现在您已经向我们展示了有问题的代码,我还可以帮助解决“不是原型”消息。

你已经(编辑了一下):

void hmac_md5(text, text_len, key, key_len, digest)
unsigned char*  text;                
int text_len;            
unsigned char* key;                 
int key_len;             
caddr_t digest;              
{
    /* ... */
}

这是一个旧式的,或“K&R”,函数定义。它仍然有效,但只是为了向后兼容,这意味着编译器将无法警告您有关参数数量或类型错误的调用。现代(自 1989 年起)版本是:

void hmac_md5(unsigned char *text, 
              int text_len, 
              unsigned char *key, 
              int key_len, 
              caddr_t digest)
{
    /* ... */
}

当将旧式函数声明和定义转换为使用原型时,由于升级,有时必须小心窄类型(float 和比 int 或 unsigned int 窄的整数类型)的参数规则。这不适用于本例。

请注意,如果您愿意,可以保留定义不变。由于您从互联网草案中获得了代码,这甚至可能是一个好主意(如果它没有损坏,请不要修复它)——但正如我所说,如果您调用它,您将无法从编译器获得任何帮助参数数量或类型错误。

There is no MD5Init function in OpenSSL. (There is in the BSD implementation.)

man MD5_Init (note the underscore), or see here.

EDIT:

Now that you've shown us the offending code, I can also help with the "not a prototype" message.

You have (edited a bit):

void hmac_md5(text, text_len, key, key_len, digest)
unsigned char*  text;                
int text_len;            
unsigned char* key;                 
int key_len;             
caddr_t digest;              
{
    /* ... */
}

That's an old-style, or "K&R", function definition. It's still valid, but only for backward compatibility, and it means that the compiler won't be able to warn you about calls with the wrong number or type(s) of arguments. The modern (since 1989) version is:

void hmac_md5(unsigned char *text, 
              int text_len, 
              unsigned char *key, 
              int key_len, 
              caddr_t digest)
{
    /* ... */
}

When converting old-style function declarations and definitions to use prototypes, you sometimes have to be careful about parameters with narrow types (float, and integer types narrower than int or unsigned int) due to the promotion rules. That doesn't apply in this particular case.

Note that you can leave the definition as it is if you like. Since you got the code from an internet draft, that might even be a good idea (if it ain't broke, don't fix it) -- but as I said you'll get no help from the compiler if you call it with the wrong number or type(s) of arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文