Simple API for signatures - implementation 92/70192/14
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Wed, 18 May 2016 13:35:39 +0000 (15:35 +0200)
committerDariusz Michaluk <d.michaluk@samsung.com>
Fri, 27 May 2016 08:47:05 +0000 (01:47 -0700)
Change-Id: I0beab0dd414d2c12e08a262b5c2750acbc711763

src/simple.c

index 80414f8..3db1098 100644 (file)
@@ -33,6 +33,7 @@
 #include <yaca/encrypt.h>
 #include <yaca/digest.h>
 #include <yaca/key.h>
+#include <yaca/sign.h>
 
 #include "internal.h"
 
@@ -236,3 +237,121 @@ err:
        yaca_ctx_free(ctx);
        return ret;
 }
+
+static int sign(const yaca_ctx_h ctx, const char *data, size_t data_len,
+                char** signature, size_t* signature_len)
+{
+       int ret;
+
+       assert(signature != NULL);
+       assert(signature_len != NULL);
+
+       ret = yaca_sign_update(ctx, data, data_len);
+       if (ret != 0)
+               return ret;
+
+       ret = yaca_get_sign_length(ctx, signature_len);
+       if (ret != 0)
+               return ret;
+
+       *signature = yaca_malloc(*signature_len);
+       if (signature == NULL)
+               return YACA_ERROR_OUT_OF_MEMORY;
+
+       ret = yaca_sign_final(ctx, *signature, signature_len);
+       if (ret != 0) {
+               yaca_free(*signature);
+               *signature = NULL;
+       }
+
+       return ret;
+}
+
+API int yaca_sign(yaca_digest_algo_e algo,
+                  const yaca_key_h key,
+                  const char *data,
+                  size_t data_len,
+                  char** signature,
+                  size_t* signature_len)
+{
+       int ret;
+       yaca_ctx_h ctx = YACA_CTX_NULL;
+
+       ret = yaca_sign_init(&ctx, algo, key);
+       if (ret != 0)
+               return ret;
+
+       ret = sign(ctx, data, data_len, signature, signature_len);
+
+       yaca_ctx_free(ctx);
+
+       return ret;
+}
+
+API int yaca_verify(yaca_digest_algo_e algo,
+                    const yaca_key_h key,
+                    const char *data,
+                    size_t data_len,
+                    const char* signature,
+                    size_t signature_len)
+{
+       int ret;
+       yaca_ctx_h ctx = YACA_CTX_NULL;
+
+       ret = yaca_verify_init(&ctx, algo, key);
+       if (ret != 0)
+               return ret;
+
+       ret = yaca_verify_update(ctx, data, data_len);
+       if (ret != 0)
+               goto free_ctx;
+
+       ret = yaca_verify_final(ctx, signature, signature_len);
+
+free_ctx:
+       yaca_ctx_free(ctx);
+
+       return ret;
+}
+
+API int yaca_hmac(yaca_digest_algo_e algo,
+                  const yaca_key_h key,
+                  const char *data,
+                  size_t data_len,
+                  char** mac,
+                  size_t* mac_len)
+{
+       int ret;
+       yaca_ctx_h ctx = YACA_CTX_NULL;
+
+       ret = yaca_sign_hmac_init(&ctx, algo, key);
+       if (ret != 0)
+               return ret;
+
+       ret = sign(ctx, data, data_len, mac, mac_len);
+
+       yaca_ctx_free(ctx);
+
+       return ret;
+}
+
+API int yaca_cmac(yaca_enc_algo_e algo,
+                  const yaca_key_h key,
+                  const char *data,
+                  size_t data_len,
+                  char** mac,
+                  size_t* mac_len)
+{
+       int ret;
+       yaca_ctx_h ctx = YACA_CTX_NULL;
+
+       ret = yaca_sign_cmac_init(&ctx, algo, key);
+       if (ret != 0)
+               return ret;
+
+       ret = sign(ctx, data, data_len, mac, mac_len);
+
+       yaca_ctx_free(ctx);
+
+       return ret;
+}