Coverage Report

Created: 2018-08-29 13:53

/src/openssl/crypto/asn1/x_algor.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1998-2016 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 <stddef.h>
11
#include <openssl/x509.h>
12
#include <openssl/asn1.h>
13
#include <openssl/asn1t.h>
14
#include "internal/evp_int.h"
15
16
ASN1_SEQUENCE(X509_ALGOR) = {
17
        ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT),
18
        ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY)
19
} ASN1_SEQUENCE_END(X509_ALGOR)
20
21
ASN1_ITEM_TEMPLATE(X509_ALGORS) =
22
        ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, algorithms, X509_ALGOR)
23
ASN1_ITEM_TEMPLATE_END(X509_ALGORS)
24
25
IMPLEMENT_ASN1_FUNCTIONS(X509_ALGOR)
26
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_ALGORS, X509_ALGORS, X509_ALGORS)
27
IMPLEMENT_ASN1_DUP_FUNCTION(X509_ALGOR)
28
29
int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval)
30
0
{
31
0
    if (alg == NULL)
32
0
        return 0;
33
0
34
0
    if (ptype != V_ASN1_UNDEF) {
35
0
        if (alg->parameter == NULL)
36
0
            alg->parameter = ASN1_TYPE_new();
37
0
        if (alg->parameter == NULL)
38
0
            return 0;
39
0
    }
40
0
41
0
    ASN1_OBJECT_free(alg->algorithm);
42
0
    alg->algorithm = aobj;
43
0
44
0
    if (ptype == 0)
45
0
        return 1;
46
0
    if (ptype == V_ASN1_UNDEF) {
47
0
        ASN1_TYPE_free(alg->parameter);
48
0
        alg->parameter = NULL;
49
0
    } else
50
0
        ASN1_TYPE_set(alg->parameter, ptype, pval);
51
0
    return 1;
52
0
}
53
54
void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
55
                     const void **ppval, const X509_ALGOR *algor)
56
0
{
57
0
    if (paobj)
58
0
        *paobj = algor->algorithm;
59
0
    if (pptype) {
60
0
        if (algor->parameter == NULL) {
61
0
            *pptype = V_ASN1_UNDEF;
62
0
            return;
63
0
        } else
64
0
            *pptype = algor->parameter->type;
65
0
        if (ppval)
66
0
            *ppval = algor->parameter->value.ptr;
67
0
    }
68
0
}
69
70
/* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
71
72
void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md)
73
0
{
74
0
    int param_type;
75
0
76
0
    if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT)
77
0
        param_type = V_ASN1_UNDEF;
78
0
    else
79
0
        param_type = V_ASN1_NULL;
80
0
81
0
    X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL);
82
0
83
0
}
84
85
int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
86
0
{
87
0
    int rv;
88
0
    rv = OBJ_cmp(a->algorithm, b->algorithm);
89
0
    if (rv)
90
0
        return rv;
91
0
    if (!a->parameter && !b->parameter)
92
0
        return 0;
93
0
    return ASN1_TYPE_cmp(a->parameter, b->parameter);
94
0
}