Table of Contents

Introduction


The SHA-3 IP core is a high-throughput, area-efficient hardware implementation of the SHA-3/Keccak cryptographic hashing functions, compliant to NISTS’s FIPS 180-4 and FIPS 202 standards.
It’s throughput can optionally be optimized by using input message buffering, which allows it to receive new input while still processing the previous message.
Also, the number of hashing rounds per clock is configurable at synthesis time, allowing users to constrain performance to save silicon resources when desired.

HW IP Features

Features supported in driver

Linux SHA Driver#Related Links

Kernel Configuration




Devicetree

xlnx_keccak_384: sha384 {
        compatible = "xlnx,zynqmp-keccak-384";
};

Test Procedure

AF ALG hashing demo exampleCross compile the below example and Need to create the executable file to test the SHA3 functionality.
/******************************************************************************
* Copyright (c) 2021 Xilinx, Inc. All rights reserved.
* SPDX-License-Identifier: MIT
******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <linux/if_alg.h>
#include <linux/socket.h>
 
#define SHA384_DIGEST_SZ 48
 
int main(void)
{
        struct sockaddr_alg sa = {
        .salg_family = AF_ALG,
        .salg_type = "hash",
        .salg_name = "xilinx-keccak-384"
        };
        unsigned char digest[SHA384_DIGEST_SZ];
        char *input = "Hellhash"; /* Input Data should be multiple of 4-bytes */
        int i, sockfd, fd;
 
        sockfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
		/* Bind with SHA driver */
        bind(sockfd, (struct sockaddr *)&sa, sizeof(sa));
        fd = accept(sockfd, NULL, 0);
		/* Send Sha3 hash request with input data to driver */
        write(fd, input, strlen(input));
		/* Read the Sha3 digest output */
        read(fd, digest, SHA384_DIGEST_SZ);
        close(fd);
        close(sockfd);
        for (i = 0; i < SHA384_DIGEST_SZ; i++)
        printf("%02x", digest[i]);
        printf("\n");
        return 0;
}
Please note as the data provided in user space will be located in virtual space, linux driver before handing off to ATF converts the data buffers to physical address.

Mainline status

Change Log

2017.3
Summary

Commits

2017.4

2018.1

Related Links

https://github.com/Xilinx/linux-xlnx/blob/master/drivers/crypto/zynqmp-sha.c