使用openssl进行base64解码的一个非常奇怪的错误

时间:2014-01-20 16:32:11

标签: c debugging openssl base64

我使用此代码进行base64解码工作,但发生了一个奇怪的错误。像这样的短代码:

#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <string.h>
#include <stdint.h>
int main()
{
        char *str = "aGVsbG8=";
        char *xa_en = NULL;
        int xa_en_len = 0;
        int q=1, sid=1;

        printf("q:%d; sid:%d;\n", q, sid);
        Base64Decode(str, &xa_en, &xa_en_len);

        printf("q:%d; sid:%d; xa_en:%s;\n", q, sid, xa_en);
}

size_t calcDecodeLength(const char* b64input) { //Calculates the length of a decoded string
        size_t len = strlen(b64input),
                padding = 0;

        if (b64input[len-1] == '=' && b64input[len-2] == '=') //last two chars are =
                padding = 2;
        else if (b64input[len-1] == '=') //last char is =
                padding = 1;

        return (size_t)len*0.75 - padding;
}

int Base64Decode(char* b64message, uint8_t** buffer, size_t* length) { //Decodes a base64 encoded string
        BIO *bio, *b64;

        int decodeLen = calcDecodeLength(b64message);
        *buffer = (uint8_t*)malloc(decodeLen);

        bio = BIO_new_mem_buf(b64message, -1);
        b64 = BIO_new(BIO_f_base64());
        bio = BIO_push(b64, bio);

        BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
        *length = BIO_read(bio, *buffer, strlen(b64message));
        BIO_free_all(bio);

        return (0); //success
}

使用以下代码编译此代码:

gcc -g -o Base64 Base64.c  -lssl -lcrypto

并运行:

./Base64

预期输出

问:1; SID:1; 问:1; SID:1; xa_en:你好;

到达输出

问:1; SID:1; 问:0; SID:1; xa_en:你好;

我的问题

这怎么可能发生? Base64Decode函数如何影响q的值?

我想它应该是一些缓冲区溢出bug但无法搞清楚。这是openssl的错误还是什么? 请帮助我,谢谢。

1 个答案:

答案 0 :(得分:0)

如果sizeof(size_t)大于sizeof(int),则可能会解释行为,因为在分配给*length时,您将覆盖部分堆栈。您的编译器应该能够就此问题向您发出警告。