| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | /* * Copyright (c) 2006-2019, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2019-05-14     tyx          the first version */#include <rtthread.h>#include <rtdevice.h>#include <hw_gcm.h>/** * @brief           Creating GCM Context * * @param device    Hardware crypto device * @param type      Type of symmetric crypto context * * @return          GCM context */struct rt_hwcrypto_ctx *rt_hwcrypto_gcm_create(struct rt_hwcrypto_device *device,                                               hwcrypto_type crypt_type){    struct rt_hwcrypto_ctx *ctx;    ctx = rt_hwcrypto_ctx_create(device, HWCRYPTO_TYPE_GCM, sizeof(struct hwcrypto_gcm));    if (ctx)    {        ((struct hwcrypto_gcm *)ctx)->crypt_type = crypt_type;    }    return ctx;}/** * @brief           Destroy GCM Context * * @param ctx       GCM context */void rt_hwcrypto_gcm_destroy(struct rt_hwcrypto_ctx *ctx){    rt_hwcrypto_ctx_destroy(ctx);}/** * @brief           This function starts a GCM encryption or decryption operation * * @param ctx       GCM context * @param add       The buffer holding the additional data * @param add_len   The length of the additional data * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_start(struct rt_hwcrypto_ctx *ctx, const rt_uint8_t *add,                               rt_size_t add_len){    struct hwcrypto_gcm *gcm_ctx = (struct hwcrypto_gcm *)ctx;    if (gcm_ctx && gcm_ctx->ops->start)    {        return gcm_ctx->ops->start(gcm_ctx, add, add_len);    }    return -RT_EINVAL;}/** * @brief           This function finishes the GCM operation and generates the authentication tag * * @param ctx       GCM context * @param tag       The buffer for holding the tag * @param tag_len   The length of the tag to generate * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_finish(struct rt_hwcrypto_ctx *ctx, const rt_uint8_t *tag,                                rt_size_t tag_len){    struct hwcrypto_gcm *gcm_ctx = (struct hwcrypto_gcm *)ctx;    if (gcm_ctx && gcm_ctx->ops->finish)    {        return gcm_ctx->ops->finish(gcm_ctx, tag, tag_len);    }    return -RT_EINVAL;}/** * @brief           This function performs a symmetric encryption or decryption operation * * @param ctx       GCM context * @param mode      Operation mode. HWCRYPTO_MODE_ENCRYPT or HWCRYPTO_MODE_DECRYPT * @param length    The length of the input data in Bytes. This must be a multiple of the block size * @param in        The buffer holding the input data * @param out       The buffer holding the output data * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_crypt(struct rt_hwcrypto_ctx *ctx, hwcrypto_mode mode,                               rt_size_t length, const rt_uint8_t *in, rt_uint8_t *out){    return rt_hwcrypto_symmetric_crypt(ctx, mode, length, in, out);}/** * @brief           Set Symmetric Encryption and Decryption Key * * @param ctx       GCM context * @param key       The crypto key * @param bitlen    The crypto key bit length * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_setkey(struct rt_hwcrypto_ctx *ctx,                                const rt_uint8_t *key, rt_uint32_t bitlen){    return rt_hwcrypto_symmetric_setkey(ctx, key, bitlen);}/** * @brief           Get Symmetric Encryption and Decryption Key * * @param ctx       GCM context * @param key       The crypto key buffer * @param bitlen    The crypto key bit length * * @return          Key length of copy */rt_err_t rt_hwcrypto_gcm_getkey(struct rt_hwcrypto_ctx *ctx,                                rt_uint8_t *key, rt_uint32_t bitlen){    return rt_hwcrypto_symmetric_getkey(ctx, key, bitlen);}/** * @brief           Set Symmetric Encryption and Decryption initialization vector * * @param ctx       GCM context * @param iv        The crypto initialization vector * @param len       The crypto initialization vector length * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_setiv(struct rt_hwcrypto_ctx *ctx,                               const rt_uint8_t *iv, rt_size_t len){    return rt_hwcrypto_symmetric_setiv(ctx, iv, len);}/** * @brief           Get Symmetric Encryption and Decryption initialization vector * * @param ctx       GCM context * @param iv        The crypto initialization vector buffer * @param len       The crypto initialization vector buffer length * * @return          IV length of copy */rt_err_t rt_hwcrypto_gcm_getiv(struct rt_hwcrypto_ctx *ctx,                               rt_uint8_t *iv, rt_size_t len){    return rt_hwcrypto_symmetric_getiv(ctx, iv, len);}/** * @brief           Set offset in initialization vector * * @param ctx       GCM context * @param iv_off    The offset in IV */void rt_hwcrypto_gcm_set_ivoff(struct rt_hwcrypto_ctx *ctx, rt_int32_t iv_off){    rt_hwcrypto_symmetric_set_ivoff(ctx, iv_off);}/** * @brief           Get offset in initialization vector * * @param ctx       GCM context * @param iv_off    It must point to a valid memory */void rt_hwcrypto_gcm_get_ivoff(struct rt_hwcrypto_ctx *ctx, rt_int32_t *iv_off){    rt_hwcrypto_symmetric_get_ivoff(ctx, iv_off);}/** * @brief           This function copy GCM context * * @param des       The destination GCM context * @param src       The GCM context to be copy * * @return          RT_EOK on success. */rt_err_t rt_hwcrypto_gcm_cpy(struct rt_hwcrypto_ctx *des,                             const struct rt_hwcrypto_ctx *src){    struct hwcrypto_gcm *gcm_des = (struct hwcrypto_gcm *)des;    struct hwcrypto_gcm *gcm_src = (struct hwcrypto_gcm *)src;    if (des != RT_NULL && src != RT_NULL)    {        gcm_des->crypt_type = gcm_src->crypt_type;        /* symmetric crypto context copy */        return rt_hwcrypto_symmetric_cpy(des, src);    }    return -RT_EINVAL;}/** * @brief           Reset GCM context * * @param ctx       GCM context */void rt_hwcrypto_gcm_reset(struct rt_hwcrypto_ctx *ctx){    rt_hwcrypto_symmetric_reset(ctx);}
 |