Home | History | Annotate | Line # | Download | only in evp
      1 /*
      2  * Copyright 2017-2019 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the OpenSSL license (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #include <stdio.h>
     11 #include <string.h>
     12 
     13 #include <openssl/evp.h>
     14 #include <openssl/objects.h>
     15 #include "crypto/evp.h"
     16 #include "evp_local.h"
     17 
     18 size_t SHA3_absorb(uint64_t A[5][5], const unsigned char *inp, size_t len,
     19                    size_t r);
     20 void SHA3_squeeze(uint64_t A[5][5], unsigned char *out, size_t len, size_t r);
     21 
     22 #define KECCAK1600_WIDTH 1600
     23 
     24 typedef struct {
     25     uint64_t A[5][5];
     26     size_t block_size;          /* cached ctx->digest->block_size */
     27     size_t md_size;             /* output length, variable in XOF */
     28     size_t num;                 /* used bytes in below buffer */
     29     unsigned char buf[KECCAK1600_WIDTH / 8 - 32];
     30     unsigned char pad;
     31 } KECCAK1600_CTX;
     32 
     33 static int init(EVP_MD_CTX *evp_ctx, unsigned char pad)
     34 {
     35     KECCAK1600_CTX *ctx = evp_ctx->md_data;
     36     size_t bsz = evp_ctx->digest->block_size;
     37 
     38     if (bsz <= sizeof(ctx->buf)) {
     39         memset(ctx->A, 0, sizeof(ctx->A));
     40 
     41         ctx->num = 0;
     42         ctx->block_size = bsz;
     43         ctx->md_size = evp_ctx->digest->md_size;
     44         ctx->pad = pad;
     45 
     46         return 1;
     47     }
     48 
     49     return 0;
     50 }
     51 
     52 static int sha3_init(EVP_MD_CTX *evp_ctx)
     53 {
     54     return init(evp_ctx, '\x06');
     55 }
     56 
     57 static int shake_init(EVP_MD_CTX *evp_ctx)
     58 {
     59     return init(evp_ctx, '\x1f');
     60 }
     61 
     62 static int sha3_update(EVP_MD_CTX *evp_ctx, const void *_inp, size_t len)
     63 {
     64     KECCAK1600_CTX *ctx = evp_ctx->md_data;
     65     const unsigned char *inp = _inp;
     66     size_t bsz = ctx->block_size;
     67     size_t num, rem;
     68 
     69     if (len == 0)
     70         return 1;
     71 
     72     if ((num = ctx->num) != 0) {      /* process intermediate buffer? */
     73         rem = bsz - num;
     74 
     75         if (len < rem) {
     76             memcpy(ctx->buf + num, inp, len);
     77             ctx->num += len;
     78             return 1;
     79         }
     80         /*
     81          * We have enough data to fill or overflow the intermediate
     82          * buffer. So we append |rem| bytes and process the block,
     83          * leaving the rest for later processing...
     84          */
     85         memcpy(ctx->buf + num, inp, rem);
     86         inp += rem, len -= rem;
     87         (void)SHA3_absorb(ctx->A, ctx->buf, bsz, bsz);
     88         ctx->num = 0;
     89         /* ctx->buf is processed, ctx->num is guaranteed to be zero */
     90     }
     91 
     92     if (len >= bsz)
     93         rem = SHA3_absorb(ctx->A, inp, len, bsz);
     94     else
     95         rem = len;
     96 
     97     if (rem) {
     98         memcpy(ctx->buf, inp + len - rem, rem);
     99         ctx->num = rem;
    100     }
    101 
    102     return 1;
    103 }
    104 
    105 static int sha3_final(EVP_MD_CTX *evp_ctx, unsigned char *md)
    106 {
    107     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    108     size_t bsz = ctx->block_size;
    109     size_t num = ctx->num;
    110 
    111     if (ctx->md_size == 0)
    112         return 1;
    113 
    114     /*
    115      * Pad the data with 10*1. Note that |num| can be |bsz - 1|
    116      * in which case both byte operations below are performed on
    117      * same byte...
    118      */
    119     memset(ctx->buf + num, 0, bsz - num);
    120     ctx->buf[num] = ctx->pad;
    121     ctx->buf[bsz - 1] |= 0x80;
    122 
    123     (void)SHA3_absorb(ctx->A, ctx->buf, bsz, bsz);
    124 
    125     SHA3_squeeze(ctx->A, md, ctx->md_size, bsz);
    126 
    127     return 1;
    128 }
    129 
    130 static int shake_ctrl(EVP_MD_CTX *evp_ctx, int cmd, int p1, void *p2)
    131 {
    132     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    133 
    134     switch (cmd) {
    135     case EVP_MD_CTRL_XOF_LEN:
    136         ctx->md_size = p1;
    137         return 1;
    138     default:
    139         return 0;
    140     }
    141 }
    142 
    143 #if defined(OPENSSL_CPUID_OBJ) && defined(__s390__) && defined(KECCAK1600_ASM)
    144 /*
    145  * IBM S390X support
    146  */
    147 # include "s390x_arch.h"
    148 
    149 # define S390X_SHA3_FC(ctx)     ((ctx)->pad)
    150 
    151 # define S390X_sha3_224_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    152                                   S390X_CAPBIT(S390X_SHA3_224)) &&  \
    153                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    154                                   S390X_CAPBIT(S390X_SHA3_224)))
    155 # define S390X_sha3_256_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    156                                   S390X_CAPBIT(S390X_SHA3_256)) &&  \
    157                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    158                                   S390X_CAPBIT(S390X_SHA3_256)))
    159 # define S390X_sha3_384_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    160                                   S390X_CAPBIT(S390X_SHA3_384)) &&  \
    161                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    162                                   S390X_CAPBIT(S390X_SHA3_384)))
    163 # define S390X_sha3_512_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    164                                   S390X_CAPBIT(S390X_SHA3_512)) &&  \
    165                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    166                                   S390X_CAPBIT(S390X_SHA3_512)))
    167 # define S390X_shake128_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    168                                   S390X_CAPBIT(S390X_SHAKE_128)) && \
    169                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    170                                   S390X_CAPBIT(S390X_SHAKE_128)))
    171 # define S390X_shake256_CAPABLE ((OPENSSL_s390xcap_P.kimd[0] &      \
    172                                   S390X_CAPBIT(S390X_SHAKE_256)) && \
    173                                  (OPENSSL_s390xcap_P.klmd[0] &      \
    174                                   S390X_CAPBIT(S390X_SHAKE_256)))
    175 
    176 /* Convert md-size to block-size. */
    177 # define S390X_KECCAK1600_BSZ(n) ((KECCAK1600_WIDTH - ((n) << 1)) >> 3)
    178 
    179 static int s390x_sha3_init(EVP_MD_CTX *evp_ctx)
    180 {
    181     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    182     const size_t bsz = evp_ctx->digest->block_size;
    183 
    184     /*-
    185      * KECCAK1600_CTX structure's pad field is used to store the KIMD/KLMD
    186      * function code.
    187      */
    188     switch (bsz) {
    189     case S390X_KECCAK1600_BSZ(224):
    190         ctx->pad = S390X_SHA3_224;
    191         break;
    192     case S390X_KECCAK1600_BSZ(256):
    193         ctx->pad = S390X_SHA3_256;
    194         break;
    195     case S390X_KECCAK1600_BSZ(384):
    196         ctx->pad = S390X_SHA3_384;
    197         break;
    198     case S390X_KECCAK1600_BSZ(512):
    199         ctx->pad = S390X_SHA3_512;
    200         break;
    201     default:
    202         return 0;
    203     }
    204 
    205     memset(ctx->A, 0, sizeof(ctx->A));
    206     ctx->num = 0;
    207     ctx->block_size = bsz;
    208     ctx->md_size = evp_ctx->digest->md_size;
    209     return 1;
    210 }
    211 
    212 static int s390x_shake_init(EVP_MD_CTX *evp_ctx)
    213 {
    214     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    215     const size_t bsz = evp_ctx->digest->block_size;
    216 
    217     /*-
    218      * KECCAK1600_CTX structure's pad field is used to store the KIMD/KLMD
    219      * function code.
    220      */
    221     switch (bsz) {
    222     case S390X_KECCAK1600_BSZ(128):
    223         ctx->pad = S390X_SHAKE_128;
    224         break;
    225     case S390X_KECCAK1600_BSZ(256):
    226         ctx->pad = S390X_SHAKE_256;
    227         break;
    228     default:
    229         return 0;
    230     }
    231 
    232     memset(ctx->A, 0, sizeof(ctx->A));
    233     ctx->num = 0;
    234     ctx->block_size = bsz;
    235     ctx->md_size = evp_ctx->digest->md_size;
    236     return 1;
    237 }
    238 
    239 static int s390x_sha3_update(EVP_MD_CTX *evp_ctx, const void *_inp, size_t len)
    240 {
    241     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    242     const unsigned char *inp = _inp;
    243     const size_t bsz = ctx->block_size;
    244     size_t num, rem;
    245 
    246     if (len == 0)
    247         return 1;
    248 
    249     if ((num = ctx->num) != 0) {
    250         rem = bsz - num;
    251 
    252         if (len < rem) {
    253             memcpy(ctx->buf + num, inp, len);
    254             ctx->num += len;
    255             return 1;
    256         }
    257         memcpy(ctx->buf + num, inp, rem);
    258         inp += rem;
    259         len -= rem;
    260         s390x_kimd(ctx->buf, bsz, ctx->pad, ctx->A);
    261         ctx->num = 0;
    262     }
    263     rem = len % bsz;
    264 
    265     s390x_kimd(inp, len - rem, ctx->pad, ctx->A);
    266 
    267     if (rem) {
    268         memcpy(ctx->buf, inp + len - rem, rem);
    269         ctx->num = rem;
    270     }
    271     return 1;
    272 }
    273 
    274 static int s390x_sha3_final(EVP_MD_CTX *evp_ctx, unsigned char *md)
    275 {
    276     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    277 
    278     s390x_klmd(ctx->buf, ctx->num, NULL, 0, ctx->pad, ctx->A);
    279     memcpy(md, ctx->A, ctx->md_size);
    280     return 1;
    281 }
    282 
    283 static int s390x_shake_final(EVP_MD_CTX *evp_ctx, unsigned char *md)
    284 {
    285     KECCAK1600_CTX *ctx = evp_ctx->md_data;
    286 
    287     s390x_klmd(ctx->buf, ctx->num, md, ctx->md_size, ctx->pad, ctx->A);
    288     return 1;
    289 }
    290 
    291 # define EVP_MD_SHA3(bitlen)                         \
    292 const EVP_MD *EVP_sha3_##bitlen(void)                \
    293 {                                                    \
    294     static const EVP_MD s390x_sha3_##bitlen##_md = { \
    295         NID_sha3_##bitlen,                           \
    296         NID_RSA_SHA3_##bitlen,                       \
    297         bitlen / 8,                                  \
    298         EVP_MD_FLAG_DIGALGID_ABSENT,                 \
    299         s390x_sha3_init,                             \
    300         s390x_sha3_update,                           \
    301         s390x_sha3_final,                            \
    302         NULL,                                        \
    303         NULL,                                        \
    304         (KECCAK1600_WIDTH - bitlen * 2) / 8,         \
    305         sizeof(KECCAK1600_CTX),                      \
    306     };                                               \
    307     static const EVP_MD sha3_##bitlen##_md = {       \
    308         NID_sha3_##bitlen,                           \
    309         NID_RSA_SHA3_##bitlen,                       \
    310         bitlen / 8,                                  \
    311         EVP_MD_FLAG_DIGALGID_ABSENT,                 \
    312         sha3_init,                                   \
    313         sha3_update,                                 \
    314         sha3_final,                                  \
    315         NULL,                                        \
    316         NULL,                                        \
    317         (KECCAK1600_WIDTH - bitlen * 2) / 8,         \
    318         sizeof(KECCAK1600_CTX),                      \
    319     };                                               \
    320     return S390X_sha3_##bitlen##_CAPABLE ?           \
    321            &s390x_sha3_##bitlen##_md :               \
    322            &sha3_##bitlen##_md;                      \
    323 }
    324 
    325 # define EVP_MD_SHAKE(bitlen)                        \
    326 const EVP_MD *EVP_shake##bitlen(void)                \
    327 {                                                    \
    328     static const EVP_MD s390x_shake##bitlen##_md = { \
    329         NID_shake##bitlen,                           \
    330         0,                                           \
    331         bitlen / 8,                                  \
    332         EVP_MD_FLAG_XOF,                             \
    333         s390x_shake_init,                            \
    334         s390x_sha3_update,                           \
    335         s390x_shake_final,                           \
    336         NULL,                                        \
    337         NULL,                                        \
    338         (KECCAK1600_WIDTH - bitlen * 2) / 8,         \
    339         sizeof(KECCAK1600_CTX),                      \
    340         shake_ctrl                                   \
    341     };                                               \
    342     static const EVP_MD shake##bitlen##_md = {       \
    343         NID_shake##bitlen,                           \
    344         0,                                           \
    345         bitlen / 8,                                  \
    346         EVP_MD_FLAG_XOF,                             \
    347         shake_init,                                  \
    348         sha3_update,                                 \
    349         sha3_final,                                  \
    350         NULL,                                        \
    351         NULL,                                        \
    352         (KECCAK1600_WIDTH - bitlen * 2) / 8,         \
    353         sizeof(KECCAK1600_CTX),                      \
    354         shake_ctrl                                   \
    355     };                                               \
    356     return S390X_shake##bitlen##_CAPABLE ?           \
    357            &s390x_shake##bitlen##_md :               \
    358            &shake##bitlen##_md;                      \
    359 }
    360 
    361 #else
    362 
    363 # define EVP_MD_SHA3(bitlen)                    \
    364 const EVP_MD *EVP_sha3_##bitlen(void)           \
    365 {                                               \
    366     static const EVP_MD sha3_##bitlen##_md = {  \
    367         NID_sha3_##bitlen,                      \
    368         NID_RSA_SHA3_##bitlen,                  \
    369         bitlen / 8,                             \
    370         EVP_MD_FLAG_DIGALGID_ABSENT,            \
    371         sha3_init,                              \
    372         sha3_update,                            \
    373         sha3_final,                             \
    374         NULL,                                   \
    375         NULL,                                   \
    376         (KECCAK1600_WIDTH - bitlen * 2) / 8,    \
    377         sizeof(KECCAK1600_CTX),                 \
    378     };                                          \
    379     return &sha3_##bitlen##_md;                 \
    380 }
    381 
    382 # define EVP_MD_SHAKE(bitlen)                   \
    383 const EVP_MD *EVP_shake##bitlen(void)           \
    384 {                                               \
    385     static const EVP_MD shake##bitlen##_md = {  \
    386         NID_shake##bitlen,                      \
    387         0,                                      \
    388         bitlen / 8,                             \
    389         EVP_MD_FLAG_XOF,                        \
    390         shake_init,                             \
    391         sha3_update,                            \
    392         sha3_final,                             \
    393         NULL,                                   \
    394         NULL,                                   \
    395         (KECCAK1600_WIDTH - bitlen * 2) / 8,    \
    396         sizeof(KECCAK1600_CTX),                 \
    397         shake_ctrl                              \
    398     };                                          \
    399     return &shake##bitlen##_md;                 \
    400 }
    401 #endif
    402 
    403 EVP_MD_SHA3(224)
    404 EVP_MD_SHA3(256)
    405 EVP_MD_SHA3(384)
    406 EVP_MD_SHA3(512)
    407 
    408 EVP_MD_SHAKE(128)
    409 EVP_MD_SHAKE(256)
    410