void mbedtls_sha512(
    const unsigned char *input,
    size_t inputLength,
    unsigned char output[64],
    int is384
)
1.0、参考
1.1、此函数的作用

SHA-384SHA-512算法

1.2、参数说明

const unsigned char *input是输入的字节数据C语言中没有其他语言中的byte类型,C语言中表达byte类型就是用unsigned charunsigned char的意思就是告诉编译器, 不要把我的最高位当成符号位,这样这8bit就都表示真实的数据了。

size_t的定义:

typedef long unsigned int __darwin_size_t;
typedef __darwin_size_t size_t;

size_t inputLengthconst unsigned char *input的大小,单位是字节

unsigned char output[64]是输出的字节数据。是个长度为64的字节数组。

int is384表示是否是SHA-384算法。

1.3、使用示例

step1、创建一个项目目录SHA-512,并进入该目录

mkdir SHA-512 && cd SHA-512

step2、使用curl命令下载代码

curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/sha512.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/sha512.c

curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/platform_util.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/platform_util.c

curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/include/mbedtls/threading.h
curl -LO https://raw.githubusercontent.com/ARMmbed/mbedtls/master/library/threading.c

step3、编写一个config.h文件,其内容如下

#define MBEDTLS_SHA512_C

step4、将代码中的mbedtls/字符串去掉

sed -i    's@mbedtls/@@g' sha512.c platform_util.h platform_util.c threading.h threading.c 2> /dev/null ||
sed -i "" 's@mbedtls/@@g' sha512.c platform_util.h platform_util.c threading.h threading.c

step6、编写一个C语言源程序sha512Test.c,其内容如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include"sha512.h"

void showHelp() {
    printf("usage: sha512 [option] <str>\n");
    printf("option: -x lower case, default true\n");
    printf("        -X upper case\n");
    printf("example:sha512 -X sssssss\n");
    exit(1);
}

void base16(unsigned char input[64], char* output, bool isToUpper) {
    const char* format = isToUpper ? "%02X" : "%02x";
    char tmp[3] = {0};
    for(int i = 0; i < 64; i++) {
        sprintf(tmp, format, input[i]);
        strcat(output, tmp);
    }
}

void performSHA512(char* input, bool isToUpper) {
    //SHA-512算法能够根据任意长度的数据计算出一个固定长度(512bit=64byte)的唯一数据
    unsigned char output[64] = {0};
    mbedtls_sha512((unsigned char*)input, strlen(input), output, 0);
    //为了便于比较,通常会把SHA-512运算后得到的512bit数据再用base16编码。因为每4bit可以表示一个十六进制字符,用十六进制表示就是128个字符。
    char hex[129] = {0};
    base16(output, hex, isToUpper);
    printf("sha512(%s)=%s\n", input, hex);
}

int main(int argc, char* argv[]) {
    if (argc == 1) {
        showHelp();
    } else if (argc == 2) {
        if (strcmp("-h", argv[1]) == 0 
        || strcmp("--help", argv[1]) == 0
        || strcmp("-x", argv[1]) == 0
        || strcmp("-X", argv[1]) == 0) {
            showHelp();
        } else {
            performSHA512(argv[1], 0);
        }
    } else {
        if (strcmp("-x", argv[1]) == 0) {
            performSHA512(argv[2], 0);
        } else if (strcmp("-X", argv[1]) == 0) {
            performSHA512(argv[2], 1);
        } else {
            showHelp();
        }
    }

    return 0;
}

step7、使用cc命令进行编译

cc -o sha512Test *.c

step8、运行sha512Test

./sha512Test -x abc
sha512(abc)=ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f

./sha512Test -X abc
sha512(abc)=DDAF35A193617ABACC417349AE20413112E6FA4E89A97EA20A9EEEE64B55D39A2192992A274FC1A836BA3C23A3FEEBBD454D4423643CE80E2A9AC94FA54CA49F

step9、验证结果是否正确。在线工具中输入相同的字符,看看输出是否一样。

SHA-512 source code on GitHubSHA-384 source code on GitHub