mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright 1998-2020 The OpenSSL Project Authors. All Rights Reserved.
 | |
|  *
 | |
|  * Licensed under the OpenSSL license (the "License").  You may not use
 | |
|  * 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
 | |
|  */
 | |
| 
 | |
| #include <stddef.h>
 | |
| #include <openssl/x509.h>
 | |
| #include <openssl/asn1.h>
 | |
| #include <openssl/asn1t.h>
 | |
| #include "crypto/evp.h"
 | |
| 
 | |
| ASN1_SEQUENCE(X509_ALGOR) = {
 | |
|         ASN1_SIMPLE(X509_ALGOR, algorithm, ASN1_OBJECT),
 | |
|         ASN1_OPT(X509_ALGOR, parameter, ASN1_ANY)
 | |
| } ASN1_SEQUENCE_END(X509_ALGOR)
 | |
| 
 | |
| ASN1_ITEM_TEMPLATE(X509_ALGORS) =
 | |
|         ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, algorithms, X509_ALGOR)
 | |
| ASN1_ITEM_TEMPLATE_END(X509_ALGORS)
 | |
| 
 | |
| IMPLEMENT_ASN1_FUNCTIONS(X509_ALGOR)
 | |
| IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(X509_ALGORS, X509_ALGORS, X509_ALGORS)
 | |
| IMPLEMENT_ASN1_DUP_FUNCTION(X509_ALGOR)
 | |
| 
 | |
| int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval)
 | |
| {
 | |
|     if (alg == NULL)
 | |
|         return 0;
 | |
| 
 | |
|     if (ptype != V_ASN1_UNDEF) {
 | |
|         if (alg->parameter == NULL)
 | |
|             alg->parameter = ASN1_TYPE_new();
 | |
|         if (alg->parameter == NULL)
 | |
|             return 0;
 | |
|     }
 | |
| 
 | |
|     ASN1_OBJECT_free(alg->algorithm);
 | |
|     alg->algorithm = aobj;
 | |
| 
 | |
|     if (ptype == 0)
 | |
|         return 1;
 | |
|     if (ptype == V_ASN1_UNDEF) {
 | |
|         ASN1_TYPE_free(alg->parameter);
 | |
|         alg->parameter = NULL;
 | |
|     } else
 | |
|         ASN1_TYPE_set(alg->parameter, ptype, pval);
 | |
|     return 1;
 | |
| }
 | |
| 
 | |
| void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
 | |
|                      const void **ppval, const X509_ALGOR *algor)
 | |
| {
 | |
|     if (paobj)
 | |
|         *paobj = algor->algorithm;
 | |
|     if (pptype) {
 | |
|         if (algor->parameter == NULL) {
 | |
|             *pptype = V_ASN1_UNDEF;
 | |
|             return;
 | |
|         } else
 | |
|             *pptype = algor->parameter->type;
 | |
|         if (ppval)
 | |
|             *ppval = algor->parameter->value.ptr;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* Set up an X509_ALGOR DigestAlgorithmIdentifier from an EVP_MD */
 | |
| 
 | |
| void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md)
 | |
| {
 | |
|     int param_type;
 | |
| 
 | |
|     if (md->flags & EVP_MD_FLAG_DIGALGID_ABSENT)
 | |
|         param_type = V_ASN1_UNDEF;
 | |
|     else
 | |
|         param_type = V_ASN1_NULL;
 | |
| 
 | |
|     X509_ALGOR_set0(alg, OBJ_nid2obj(EVP_MD_type(md)), param_type, NULL);
 | |
| 
 | |
| }
 | |
| 
 | |
| int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b)
 | |
| {
 | |
|     int rv;
 | |
|     rv = OBJ_cmp(a->algorithm, b->algorithm);
 | |
|     if (rv)
 | |
|         return rv;
 | |
|     if (!a->parameter && !b->parameter)
 | |
|         return 0;
 | |
|     return ASN1_TYPE_cmp(a->parameter, b->parameter);
 | |
| }
 | |
| 
 | |
| int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src)
 | |
| {
 | |
|     if (src == NULL || dest == NULL)
 | |
| 	return 0;
 | |
| 
 | |
|     if (dest->algorithm)
 | |
|          ASN1_OBJECT_free(dest->algorithm);
 | |
|     dest->algorithm = NULL;
 | |
| 
 | |
|     if (dest->parameter)
 | |
|         ASN1_TYPE_free(dest->parameter);
 | |
|     dest->parameter = NULL;
 | |
| 
 | |
|     if (src->algorithm)
 | |
|         if ((dest->algorithm = OBJ_dup(src->algorithm)) == NULL)
 | |
| 	    return 0;
 | |
| 
 | |
|     if (src->parameter) {
 | |
|         dest->parameter = ASN1_TYPE_new();
 | |
|         if (dest->parameter == NULL)
 | |
|             return 0;
 | |
| 
 | |
|         /* Assuming this is also correct for a BOOL.
 | |
|          * set does copy as a side effect.
 | |
|          */
 | |
|         if (ASN1_TYPE_set1(dest->parameter, 
 | |
|                 src->parameter->type, src->parameter->value.ptr) == 0)
 | |
|             return 0;
 | |
|     }
 | |
|     return 1;
 | |
| }
 |