Ошибка openssl: неявное объявление MD5Init - PullRequest
2 голосов
/ 26 сентября 2011

Прежде всего я показываю код для моего файла 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

если потребуется, я отредактирую другие детали реализации, которые я пропустил, просто чтобы сделать сообщение небольшим, потому что я думаю, что есть кое-что, что мне нужно сделать в отношении включаемых путей и заголовочных файлов, и я не знаю об этом.

Что не так, пожалуйста, помогите мне ???

1 Ответ

1 голос
/ 26 сентября 2011

В OpenSSL нет функции MD5Init. (Есть в реализации BSD.)

man MD5_Init (обратите внимание на подчеркивание) или см. здесь .

EDIT

Теперь, когда вы показали нам код ошибки, я также могу помочь с сообщением «не прототип».

Вы (отредактировали немного):

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)
{
    /* ... */
}

При преобразовании объявлений и определений функций старого стиля для использования прототипов иногда необходимо соблюдать осторожность в отношении параметров с узкими типами (с плавающей точкой и целочисленными типами, более узкими, чем int или unsigned int), из-за правил продвижения. Это не относится в данном конкретном случае.

Обратите внимание, что вы можете оставить определение как есть, если хотите. Поскольку вы получили код из интернет-проекта, это может быть даже хорошей идеей (если он не сломан, не исправляйте его) - но, как я уже сказал, компилятор не получит никакой помощи, если вы вызовете его с неправильным числом или типом (ами) аргументов.

...