]> www.wagner.pp.ru Git - openssl-gost/engine.git/blobdiff - gost_gost2015.h
tcl_tests: ca.try: Ignore openssl crl exit status for 'corrupted CRL' test
[openssl-gost/engine.git] / gost_gost2015.h
index 31f71e49c00bb21ce14e1ba57f19574bf63e9eb3..37b94d0876b4fe3e17f9a9b730caeaa1ac73433d 100644 (file)
@@ -1,13 +1,64 @@
+/*
+ * Copyright (c) 2020 Dmitry Belyavskiy <beldmit@gmail.com>
+ *
+ * Contents licensed under the terms of the OpenSSL license
+ * See https://www.openssl.org/source/license.html for details
+ */
 #ifndef GOST_GOST2015_H
 #define GOST_GOST2015_H
 
+#include "gost_grasshopper_cipher.h"
+
 #include <openssl/evp.h>
 #include <openssl/x509.h>
+#include <openssl/modes.h>
 
 #define MAGMA_MAC_MAX_SIZE 8
 #define KUZNYECHIK_MAC_MAX_SIZE 16
 #define OID_GOST_CMS_MAC "1.2.643.7.1.0.6.1.1"
 
+#define SN_magma_mgm            "magma-mgm"
+
+#define BSWAP64(x) \
+    (((x & 0xFF00000000000000ULL) >> 56) | \
+     ((x & 0x00FF000000000000ULL) >> 40) | \
+     ((x & 0x0000FF0000000000ULL) >> 24) | \
+     ((x & 0x000000FF00000000ULL) >>  8) | \
+     ((x & 0x00000000FF000000ULL) <<  8) | \
+     ((x & 0x0000000000FF0000ULL) << 24) | \
+     ((x & 0x000000000000FF00ULL) << 40) | \
+     ((x & 0x00000000000000FFULL) << 56))
+
+typedef void (*mul128_f) (uint64_t *result, uint64_t *arg1, uint64_t *arg2);
+
+typedef struct {
+    union {
+        uint64_t u[2];
+        uint32_t d[4];
+        uint8_t c[16];
+    } nonce, Yi, Zi, EKi, Hi, len, ACi, mul, sum, tag;
+
+    unsigned int mres, ares;
+    block128_f block;
+    mul128_f mul_gf;
+    int blocklen;
+    void *key;
+} mgm128_context;
+
+typedef struct {
+    union {
+        struct ossl_gost_cipher_ctx g_ks;
+        gost_grasshopper_cipher_ctx gh_ks;
+    } ks;
+    int key_set;
+    int iv_set;
+    mgm128_context mgm;
+    unsigned char *iv;
+    int ivlen;
+    int taglen;
+    int tlstree_mode;
+} gost_mgm_ctx;
+
 int gost2015_final_call(EVP_CIPHER_CTX *ctx, EVP_MD_CTX *omac_ctx, size_t mac_size,
                        unsigned char *encrypted_mac,
                        int (*do_cipher) (EVP_CIPHER_CTX *ctx,
@@ -24,4 +75,30 @@ int gost2015_set_asn1_params(ASN1_TYPE *params,
 
 int gost2015_process_unprotected_attributes(STACK_OF(X509_ATTRIBUTE) *attrs,
             int encryption, size_t mac_len, unsigned char *final_tag);
+
+int gost2015_acpkm_omac_init(int nid, int enc, const unsigned char *inkey,
+                             EVP_MD_CTX *omac_ctx,
+                             unsigned char *outkey, unsigned char *kdf_seed);
+int init_zero_kdf_seed(unsigned char *kdf_seed);
+
+
+/* enc/dec mgm mode */
+
+void gost_mgm128_init(mgm128_context *ctx, void *key, block128_f block,
+                                         mul128_f mul_gf, int blen);
+
+int gost_mgm128_setiv(mgm128_context *ctx, const unsigned char *iv, size_t len);
+
+int gost_mgm128_aad(mgm128_context *ctx, const unsigned char *aad, size_t len);
+
+int gost_mgm128_encrypt(mgm128_context *ctx, const unsigned char *in,
+                          unsigned char *out, size_t len);
+
+int gost_mgm128_decrypt(mgm128_context *ctx, const unsigned char *in,
+                          unsigned char *out, size_t len);
+
+int gost_mgm128_finish(mgm128_context *ctx, const unsigned char *tag, size_t len);
+
+void gost_mgm128_tag(mgm128_context *ctx, unsigned char *tag, size_t len);
+
 #endif