20211215-sdf測試2-openssl

卢泽發表於2024-06-02

以下是按照 Markdown 格式整理的你所需要的程式碼和操作過程,使用中文描述:

任務詳情

在 openEuler(推薦)、Ubuntu 或 Windows(不推薦)中完成以下任務。參考網內容以及 AI 給出的詳細過程,否則不得分。

0. 根據 gmt0018 標準,如何呼叫介面實現基於 SM3 求你的學號姓名的 SM3 值?

#include "sdf.h"
#include <string.h>

#define BUFFER_SIZE 1024

int main() {
    int rv;
    unsigned char buffer[BUFFER_SIZE];
    unsigned int bufferLen;
    unsigned char hash[32]; // SM3雜湊結果為32位元組

    // 計算學號和姓名的SM3雜湊值
    char *id = "20211215";
    char *name = "盧澤";

    bufferLen = strlen(id) + strlen(name);
    memcpy(buffer, id, strlen(id));
    memcpy(buffer + strlen(id), name, strlen(name));

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 會話控制代碼,可以為空
        buffer,
        bufferLen,
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for %s%s: ", id, name);
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    return 0;
}

1. 使用 OpenSSL 實現 SDF 介面中的 hash 運算介面,至少支援 SM3 演算法,把相關函式整合到 src 中的 sdf.c 檔案中

#include "sdf.h"
#include <string.h>
#include <openssl/evp.h>

int SDF_Hash(
    void *hSessionHandle,
    unsigned char *pucData,
    unsigned int uiDataLength,
    unsigned char *pucHash)
{
    if (pucData == NULL || uiDataLength == 0 || pucHash == NULL) {
        return SDR_INVALID_PARAMETER;
    }

    const EVP_MD *md;
    EVP_MD_CTX *mdctx;

    md = EVP_sm3();
    mdctx = EVP_MD_CTX_new();

    EVP_DigestInit_ex(mdctx, md, NULL);
    EVP_DigestUpdate(mdctx, pucData, uiDataLength);
    EVP_DigestFinal_ex(mdctx, pucHash, NULL);

    EVP_MD_CTX_free(mdctx);

    return SDR_OK;
}

3. 在 test 中的 main.c 呼叫進行測試,至少測試計算你的學號(數字),你的學號(字串)的 SM3 值

#include "sdf.h"
#include <stdio.h>

#define BUFFER_SIZE 1024

int main() {
    int rv;
    unsigned char buffer[BUFFER_SIZE];
    unsigned char hash[32]; // SM3雜湊結果為32位元組

    // 計算學號(數字)的SM3雜湊值
    unsigned int id = 20211215;

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 會話控制代碼,可以為空
        (unsigned char *)&id,
        sizeof(id),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (%u): ", id);
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    // 計算學號(字串)的SM3雜湊值
    char *idStr = "20211215";

    rv = SDF_Hash(
        NULL,   // hSessionHandle: 會話控制代碼,可以為空
        (unsigned char *)idStr,
        strlen(idStr),
        hash
    );

    if (rv != SDR_OK) {
        printf("Failed to calculate SM3 hash: %d\n", rv);
        return -1;
    }

    printf("SM3 hash for student ID (string): ");
    for (int i = 0; i < 32; i++) {
        printf("%02X", hash[i]);
    }
    printf("\n");

    return 

0;
}

相關文章