2 * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
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
11 #include <openssl/x509.h>
12 #include <openssl/asn1.h>
13 #include <openssl/asn1t.h>
14 #include "internal/evp_int.h"
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
)
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
)
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
)
29 int X509_ALGOR_set0(X509_ALGOR
*alg
, ASN1_OBJECT
*aobj
, int ptype
, void *pval
)
33 if (ptype
!= V_ASN1_UNDEF
) {
34 if (alg
->parameter
== NULL
)
35 alg
->parameter
= ASN1_TYPE_new();
36 if (alg
->parameter
== NULL
)
40 ASN1_OBJECT_free(alg
->algorithm
);
41 alg
->algorithm
= aobj
;
45 if (ptype
== V_ASN1_UNDEF
) {
46 ASN1_TYPE_free(alg
->parameter
);
47 alg
->parameter
= NULL
;
49 ASN1_TYPE_set(alg
->parameter
, ptype
, pval
);
53 void X509_ALGOR_get0(ASN1_OBJECT
**paobj
, int *pptype
, void **ppval
,
57 *paobj
= algor
->algorithm
;
59 if (algor
->parameter
== NULL
) {
60 *pptype
= V_ASN1_UNDEF
;
63 *pptype
= algor
->parameter
->type
;
65 *ppval
= algor
->parameter
->value
.ptr
;
69 /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
71 void X509_ALGOR_set_md(X509_ALGOR
*alg
, const EVP_MD
*md
)
75 if (md
->flags
& EVP_MD_FLAG_DIGALGID_ABSENT
)
76 param_type
= V_ASN1_UNDEF
;
78 param_type
= V_ASN1_NULL
;
80 X509_ALGOR_set0(alg
, OBJ_nid2obj(EVP_MD_type(md
)), param_type
, NULL
);
84 int X509_ALGOR_cmp(const X509_ALGOR
*a
, const X509_ALGOR
*b
)
87 rv
= OBJ_cmp(a
->algorithm
, b
->algorithm
);
90 if (!a
->parameter
&& !b
->parameter
)
92 return ASN1_TYPE_cmp(a
->parameter
, b
->parameter
);