2 * Copyright 1998-2016 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (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 "crypto/evp.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
)
34 if (ptype
!= V_ASN1_UNDEF
) {
35 if (alg
->parameter
== NULL
)
36 alg
->parameter
= ASN1_TYPE_new();
37 if (alg
->parameter
== NULL
)
41 ASN1_OBJECT_free(alg
->algorithm
);
42 alg
->algorithm
= aobj
;
46 if (ptype
== V_ASN1_UNDEF
) {
47 ASN1_TYPE_free(alg
->parameter
);
48 alg
->parameter
= NULL
;
50 ASN1_TYPE_set(alg
->parameter
, ptype
, pval
);
54 void X509_ALGOR_get0(const ASN1_OBJECT
**paobj
, int *pptype
,
55 const void **ppval
, const X509_ALGOR
*algor
)
58 *paobj
= algor
->algorithm
;
60 if (algor
->parameter
== NULL
) {
61 *pptype
= V_ASN1_UNDEF
;
64 *pptype
= algor
->parameter
->type
;
66 *ppval
= algor
->parameter
->value
.ptr
;
70 /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
72 void X509_ALGOR_set_md(X509_ALGOR
*alg
, const EVP_MD
*md
)
76 if (md
->flags
& EVP_MD_FLAG_DIGALGID_ABSENT
)
77 param_type
= V_ASN1_UNDEF
;
79 param_type
= V_ASN1_NULL
;
81 X509_ALGOR_set0(alg
, OBJ_nid2obj(EVP_MD_type(md
)), param_type
, NULL
);
85 int X509_ALGOR_cmp(const X509_ALGOR
*a
, const X509_ALGOR
*b
)
88 rv
= OBJ_cmp(a
->algorithm
, b
->algorithm
);
91 if (!a
->parameter
&& !b
->parameter
)
93 return ASN1_TYPE_cmp(a
->parameter
, b
->parameter
);