digest.c 16.7 KB
Newer Older
R
Rich Salz 已提交
1
/*
P
Paul Yang 已提交
2
 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
R
Rich Salz 已提交
5 6 7
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
8
 */
9 10

#include <stdio.h>
11
#include "internal/cryptlib.h"
12 13
#include <openssl/objects.h>
#include <openssl/evp.h>
R
Rich Salz 已提交
14
#include <openssl/engine.h>
15
#include "internal/evp_int.h"
M
Matt Caswell 已提交
16
#include "internal/provider.h"
17
#include "evp_locl.h"
18

19
/* This call frees resources associated with the context */
20
int EVP_MD_CTX_reset(EVP_MD_CTX *ctx)
21
{
22 23 24
    if (ctx == NULL)
        return 1;

25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    if (ctx->provctx != NULL) {
        if (ctx->digest->freectx != NULL)
            ctx->digest->freectx(ctx->provctx);
        ctx->provctx = NULL;
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
    }

    if (ctx->pctx != NULL)
        goto legacy;

    return 1;

    /* TODO(3.0): Remove legacy code below */
 legacy:

43 44 45 46 47 48 49 50 51 52 53
    /*
     * Don't assume ctx->md_data was cleaned in EVP_Digest_Final, because
     * sometimes only copies of the context are ever finalised.
     */
    if (ctx->digest && ctx->digest->cleanup
        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))
        ctx->digest->cleanup(ctx);
    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data
        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {
        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
    }
P
Paul Yang 已提交
54 55
    /*
     * pctx should be freed by the user of EVP_MD_CTX
P
Paul Yang 已提交
56
     * if EVP_MD_CTX_FLAG_KEEP_PKEY_CTX is set
P
Paul Yang 已提交
57
     */
P
Paul Yang 已提交
58
    if (!EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX))
P
Paul Yang 已提交
59
        EVP_PKEY_CTX_free(ctx->pctx);
60
#ifndef OPENSSL_NO_ENGINE
R
Rich Salz 已提交
61
    ENGINE_finish(ctx->engine);
62
#endif
63
    OPENSSL_cleanse(ctx, sizeof(*ctx));
64 65

    return 1;
66
}
67

68
EVP_MD_CTX *EVP_MD_CTX_new(void)
69
{
70 71
    return OPENSSL_zalloc(sizeof(EVP_MD_CTX));
}
72

73
void EVP_MD_CTX_free(EVP_MD_CTX *ctx)
74
{
75 76 77 78 79 80 81 82 83 84 85
    if (ctx == NULL)
        return;

    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    EVP_MD_CTX_reset(ctx);

    EVP_MD_meth_free(ctx->fetched_digest);
    ctx->fetched_digest = NULL;
    ctx->digest = NULL;
86
    ctx->reqdigest = NULL;
87 88 89 90 91 92

    OPENSSL_free(ctx);
    return;

    /* TODO(3.0): Remove legacy code below */
 legacy:
93
    EVP_MD_CTX_reset(ctx);
94
    OPENSSL_free(ctx);
95
}
96

D
 
Dr. Stephen Henson 已提交
97
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
98
{
99
    EVP_MD_CTX_reset(ctx);
100 101
    return EVP_DigestInit_ex(ctx, type, NULL);
}
B
Ben Laurie 已提交
102

103
int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
104
{
105 106 107
    EVP_MD *provmd;
    ENGINE *tmpimpl = NULL;

108
    EVP_MD_CTX_clear_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
109

110 111 112
    if (type != NULL)
        ctx->reqdigest = type;

113
    /* TODO(3.0): Legacy work around code below. Remove this */
114
#ifndef OPENSSL_NO_ENGINE
115 116 117 118
    /*
     * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so
     * this context may already have an ENGINE! Try to avoid releasing the
     * previous handle, re-querying for an ENGINE, and having a
F
FdaSilvaYY 已提交
119
     * reinitialisation, when it may all be unnecessary.
120
     */
121 122
    if (ctx->engine && ctx->digest &&
        (type == NULL || (type->type == ctx->digest->type)))
123
        goto skip_to_init;
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

    if (type != NULL && impl == NULL)
        tmpimpl = ENGINE_get_digest_engine(type->type);
#endif

    /*
     * If there are engines involved or if we're being used as part of
     * EVP_DigestSignInit then we should use legacy handling for now.
     */
    if (ctx->engine != NULL
            || impl != NULL
            || tmpimpl != NULL
            || ctx->pctx != NULL
            || (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) != 0) {
        if (ctx->digest == ctx->fetched_digest)
            ctx->digest = NULL;
        EVP_MD_meth_free(ctx->fetched_digest);
        ctx->fetched_digest = NULL;
        goto legacy;
    }

    if (type->prov == NULL) {
        switch(type->type) {
147
        case NID_sha256:
148
        case NID_md2:
149
            break;
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
        default:
            goto legacy;
        }
    }

    if (ctx->digest != NULL && ctx->digest->ctx_size > 0) {
        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
        ctx->md_data = NULL;
    }

    /* TODO(3.0): Start of non-legacy code below */

    if (type->prov == NULL) {
        provmd = EVP_MD_fetch(NULL, OBJ_nid2sn(type->type), "");
        if (provmd == NULL) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
            return 0;
        }
        type = provmd;
        EVP_MD_meth_free(ctx->fetched_digest);
        ctx->fetched_digest = provmd;
    }

    ctx->digest = type;
    if (ctx->provctx == NULL) {
175
        ctx->provctx = ctx->digest->newctx(ossl_provider_ctx(type->prov));
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
        if (ctx->provctx == NULL) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
            return 0;
        }
    }

    if (ctx->digest->dinit == NULL) {
        EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
        return 0;
    }

    return ctx->digest->dinit(ctx->provctx);

    /* TODO(3.0): Remove legacy code below */
 legacy:

#ifndef OPENSSL_NO_ENGINE
193 194 195 196 197 198
    if (type) {
        /*
         * Ensure an ENGINE left lying around from last time is cleared (the
         * previous check attempted to avoid this if the same ENGINE and
         * EVP_MD could be used).
         */
R
Rich Salz 已提交
199 200
        ENGINE_finish(ctx->engine);
        if (impl != NULL) {
201 202 203 204
            if (!ENGINE_init(impl)) {
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
                return 0;
            }
R
Rich Salz 已提交
205
        } else {
206
            /* Ask if an ENGINE is reserved for this job */
207
            impl = tmpimpl;
R
Rich Salz 已提交
208 209
        }
        if (impl != NULL) {
210 211
            /* There's an ENGINE for this job ... (apparently) */
            const EVP_MD *d = ENGINE_get_digest(impl, type->type);
R
Rich Salz 已提交
212 213

            if (d == NULL) {
214 215 216 217 218 219 220 221 222 223 224 225 226
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_INITIALIZATION_ERROR);
                ENGINE_finish(impl);
                return 0;
            }
            /* We'll use the ENGINE's private digest definition */
            type = d;
            /*
             * Store the ENGINE functional reference so we know 'type' came
             * from an ENGINE and we need to release it when done.
             */
            ctx->engine = impl;
        } else
            ctx->engine = NULL;
227 228 229 230 231 232
    } else {
        if (!ctx->digest) {
            EVPerr(EVP_F_EVP_DIGESTINIT_EX, EVP_R_NO_DIGEST_SET);
            return 0;
        }
        type = ctx->digest;
233
    }
234
#endif
235
    if (ctx->digest != type) {
236
        if (ctx->digest && ctx->digest->ctx_size) {
237
            OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);
238 239
            ctx->md_data = NULL;
        }
240 241 242
        ctx->digest = type;
        if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size) {
            ctx->update = type->update;
R
Rich Salz 已提交
243
            ctx->md_data = OPENSSL_zalloc(type->ctx_size);
244 245 246 247 248 249
            if (ctx->md_data == NULL) {
                EVPerr(EVP_F_EVP_DIGESTINIT_EX, ERR_R_MALLOC_FAILURE);
                return 0;
            }
        }
    }
250
#ifndef OPENSSL_NO_ENGINE
251
 skip_to_init:
252
#endif
253 254 255 256 257 258 259 260 261 262 263
    if (ctx->pctx) {
        int r;
        r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
                              EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
        if (r <= 0 && (r != -2))
            return 0;
    }
    if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
        return 1;
    return ctx->digest->init(ctx);
}
264

B
Ben Laurie 已提交
265
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
266
{
267 268 269
    if (count == 0)
        return 1;

270 271 272 273 274 275 276 277 278 279 280
    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;

    if (ctx->digest->dupdate == NULL) {
        EVPerr(EVP_F_EVP_DIGESTUPDATE, EVP_R_UPDATE_ERROR);
        return 0;
    }
    return ctx->digest->dupdate(ctx->provctx, data, count);

    /* TODO(3.0): Remove legacy code below */
 legacy:
281 282
    return ctx->update(ctx, data, count);
}
283

284
/* The caller can assume that this removes any secret data from the context */
D
 
Dr. Stephen Henson 已提交
285
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
286 287 288
{
    int ret;
    ret = EVP_DigestFinal_ex(ctx, md, size);
289
    EVP_MD_CTX_reset(ctx);
290 291
    return ret;
}
D
 
Dr. Stephen Henson 已提交
292 293

/* The caller can assume that this removes any secret data from the context */
294
int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *isize)
295 296
{
    int ret;
297
    size_t size = 0;
298
    size_t mdsize = EVP_MD_size(ctx->digest);
299 300 301

    if (ctx->digest == NULL || ctx->digest->prov == NULL)
        goto legacy;
302

303 304 305 306 307
    if (ctx->digest->dfinal == NULL) {
        EVPerr(EVP_F_EVP_DIGESTFINAL_EX, EVP_R_FINAL_ERROR);
        return 0;
    }

308
    ret = ctx->digest->dfinal(ctx->provctx, md, &size, mdsize);
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324

    if (isize != NULL) {
        if (size <= UINT_MAX) {
            *isize = (int)size;
        } else {
            EVPerr(EVP_F_EVP_DIGESTFINAL_EX, EVP_R_FINAL_ERROR);
            ret = 0;
        }
    }

    EVP_MD_CTX_reset(ctx);

    return ret;

    /* TODO(3.0): Remove legacy code below */
 legacy:
325
    OPENSSL_assert(mdsize <= EVP_MAX_MD_SIZE);
326
    ret = ctx->digest->final(ctx, md);
327
    if (isize != NULL)
328
        *isize = mdsize;
329 330 331 332
    if (ctx->digest->cleanup) {
        ctx->digest->cleanup(ctx);
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
    }
333
    OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
334 335
    return ret;
}
336

337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t size)
{
    int ret = 0;

    if (ctx->digest->flags & EVP_MD_FLAG_XOF
        && size <= INT_MAX
        && ctx->digest->md_ctrl(ctx, EVP_MD_CTRL_XOF_LEN, (int)size, NULL)) {
        ret = ctx->digest->final(ctx, md);

        if (ctx->digest->cleanup != NULL) {
            ctx->digest->cleanup(ctx);
            EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_CLEANED);
        }
        OPENSSL_cleanse(ctx->md_data, ctx->digest->ctx_size);
    } else {
        EVPerr(EVP_F_EVP_DIGESTFINALXOF, EVP_R_NOT_XOF_OR_INVALID_LENGTH);
    }

    return ret;
}

358
int EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
359
{
360
    EVP_MD_CTX_reset(out);
361 362
    return EVP_MD_CTX_copy_ex(out, in);
}
D
 
Dr. Stephen Henson 已提交
363 364

int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
365 366
{
    unsigned char *tmp_buf;
367 368

    if (in == NULL || in->digest == NULL) {
369 370 371
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_INPUT_NOT_INITIALIZED);
        return 0;
    }
372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412

    if (in->digest->prov == NULL)
        goto legacy;

    if (in->digest->dupctx == NULL) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
        return 0;
    }

    EVP_MD_CTX_reset(out);
    if (out->fetched_digest != NULL)
        EVP_MD_meth_free(out->fetched_digest);
    *out = *in;
    /* NULL out pointers in case of error */
    out->pctx = NULL;
    out->provctx = NULL;

    if (in->fetched_digest != NULL)
        EVP_MD_upref(in->fetched_digest);

    out->provctx = in->digest->dupctx(in->provctx);
    if (out->provctx == NULL) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
        return 0;
    }

    /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */
    EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);
    if (in->pctx != NULL) {
        out->pctx = EVP_PKEY_CTX_dup(in->pctx);
        if (out->pctx == NULL) {
            EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, EVP_R_NOT_ABLE_TO_COPY_CTX);
            EVP_MD_CTX_reset(out);
            return 0;
        }
    }

    return 1;

    /* TODO(3.0): Remove legacy code below */
 legacy:
413
#ifndef OPENSSL_NO_ENGINE
414 415 416 417 418
    /* Make sure it's safe to copy a digest context using an ENGINE */
    if (in->engine && !ENGINE_init(in->engine)) {
        EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_ENGINE_LIB);
        return 0;
    }
419
#endif
420

421 422 423 424 425
    if (out->digest == in->digest) {
        tmp_buf = out->md_data;
        EVP_MD_CTX_set_flags(out, EVP_MD_CTX_FLAG_REUSE);
    } else
        tmp_buf = NULL;
426
    EVP_MD_CTX_reset(out);
R
Rich Salz 已提交
427
    memcpy(out, in, sizeof(*out));
428

P
Paul Yang 已提交
429 430 431
    /* copied EVP_MD_CTX should free the copied EVP_PKEY_CTX */
    EVP_MD_CTX_clear_flags(out, EVP_MD_CTX_FLAG_KEEP_PKEY_CTX);

R
Richard Levitte 已提交
432 433 434 435 436 437 438
    /* Null these variables, since they are getting fixed up
     * properly below.  Anything else may cause a memleak and/or
     * double free if any of the memory allocations below fail
     */
    out->md_data = NULL;
    out->pctx = NULL;

439 440 441 442 443
    if (in->md_data && out->digest->ctx_size) {
        if (tmp_buf)
            out->md_data = tmp_buf;
        else {
            out->md_data = OPENSSL_malloc(out->digest->ctx_size);
444
            if (out->md_data == NULL) {
445 446 447 448 449 450
                EVPerr(EVP_F_EVP_MD_CTX_COPY_EX, ERR_R_MALLOC_FAILURE);
                return 0;
            }
        }
        memcpy(out->md_data, in->md_data, out->digest->ctx_size);
    }
451

452
    out->update = in->update;
453

454 455 456
    if (in->pctx) {
        out->pctx = EVP_PKEY_CTX_dup(in->pctx);
        if (!out->pctx) {
457
            EVP_MD_CTX_reset(out);
458 459 460
            return 0;
        }
    }
461

462 463
    if (out->digest->copy)
        return out->digest->copy(out, in);
464

465 466
    return 1;
}
467

468
int EVP_Digest(const void *data, size_t count,
469 470 471
               unsigned char *md, unsigned int *size, const EVP_MD *type,
               ENGINE *impl)
{
472
    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
473
    int ret;
474

475 476 477 478 479 480
    if (ctx == NULL)
        return 0;
    EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_ONESHOT);
    ret = EVP_DigestInit_ex(ctx, type, impl)
        && EVP_DigestUpdate(ctx, data, count)
        && EVP_DigestFinal_ex(ctx, md, size);
481
    EVP_MD_CTX_free(ctx);
482

483 484
    return ret;
}
485

D
Dr. Stephen Henson 已提交
486 487 488 489 490 491 492 493 494 495
int EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void *p2)
{
    if (ctx->digest && ctx->digest->md_ctrl) {
        int ret = ctx->digest->md_ctrl(ctx, cmd, p1, p2);
        if (ret <= 0)
            return 0;
        return 1;
    }
    return 0;
}
M
Matt Caswell 已提交
496 497 498 499 500

static void *evp_md_from_dispatch(int mdtype, const OSSL_DISPATCH *fns,
                                    OSSL_PROVIDER *prov)
{
    EVP_MD *md = NULL;
501
    int fncnt = 0;
M
Matt Caswell 已提交
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519

    if ((md = EVP_MD_meth_new(mdtype, NID_undef)) == NULL)
        return NULL;

    for (; fns->function_id != 0; fns++) {
        switch (fns->function_id) {
        case OSSL_FUNC_DIGEST_NEWCTX:
            if (md->newctx != NULL)
                break;
            md->newctx = OSSL_get_OP_digest_newctx(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_INIT:
            if (md->dinit != NULL)
                break;
            md->dinit = OSSL_get_OP_digest_init(fns);
            fncnt++;
            break;
520
        case OSSL_FUNC_DIGEST_UPDATE:
M
Matt Caswell 已提交
521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543
            if (md->dupdate != NULL)
                break;
            md->dupdate = OSSL_get_OP_digest_update(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_FINAL:
            if (md->dfinal != NULL)
                break;
            md->dfinal = OSSL_get_OP_digest_final(fns);
            fncnt++;
            break;
        case OSSL_FUNC_DIGEST_DIGEST:
            if (md->digest != NULL)
                break;
            md->digest = OSSL_get_OP_digest_digest(fns);
            /* We don't increment fnct for this as it is stand alone */
            break;
        case OSSL_FUNC_DIGEST_FREECTX:
            if (md->freectx != NULL)
                break;
            md->freectx = OSSL_get_OP_digest_freectx(fns);
            fncnt++;
            break;
544 545 546 547 548 549 550 551 552 553
        case OSSL_FUNC_DIGEST_DUPCTX:
            if (md->dupctx != NULL)
                break;
            md->dupctx = OSSL_get_OP_digest_dupctx(fns);
            break;
        case OSSL_FUNC_DIGEST_SIZE:
            if (md->size != NULL)
                break;
            md->size = OSSL_get_OP_digest_size(fns);
            break;
554 555 556 557 558
        case OSSL_FUNC_DIGEST_BLOCK_SIZE:
            if (md->dblock_size != NULL)
                break;
            md->dblock_size = OSSL_get_OP_digest_block_size(fns);
            break;
M
Matt Caswell 已提交
559
        }
560 561 562 563 564 565 566 567 568 569 570 571
    }
    if ((fncnt != 0 && fncnt != 5)
        || (fncnt == 0 && md->digest == NULL)
        || md->size == NULL) {
        /*
         * In order to be a consistent set of functions we either need the
         * whole set of init/update/final etc functions or none of them.
         * The "digest" function can standalone. We at least need one way to
         * generate digests.
         */
        EVP_MD_meth_free(md);
        return NULL;
M
Matt Caswell 已提交
572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589
    }
    md->prov = prov;
    if (prov != NULL)
        ossl_provider_upref(prov);

    return md;
}

static int evp_md_upref(void *md)
{
    return EVP_MD_upref(md);
}

static void evp_md_free(void *md)
{
    EVP_MD_meth_free(md);
}

590 591 592 593 594 595 596
static int evp_md_nid(void *vmd)
{
    EVP_MD *md = vmd;

    return md->type;
}

M
Matt Caswell 已提交
597 598 599 600 601
EVP_MD *EVP_MD_fetch(OPENSSL_CTX *ctx, const char *algorithm,
                     const char *properties)
{
    return evp_generic_fetch(ctx, OSSL_OP_DIGEST, algorithm, properties,
                             evp_md_from_dispatch, evp_md_upref,
602
                             evp_md_free, evp_md_nid);
M
Matt Caswell 已提交
603
}