2 * Copyright 1995-2020 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 "internal/cryptlib.h"
12 #include <openssl/objects.h>
13 #include <openssl/buffer.h>
14 #include "crypto/asn1.h"
16 ASN1_OBJECT
*OBJ_dup(const ASN1_OBJECT
*o
)
22 /* If object isn't dynamic it's an internal OID which is never freed */
23 if (!(o
->flags
& ASN1_OBJECT_FLAG_DYNAMIC
))
24 return (ASN1_OBJECT
*)o
;
26 r
= ASN1_OBJECT_new();
28 ERR_raise(ERR_LIB_OBJ
, ERR_R_ASN1_LIB
);
32 /* Set dynamic flags so everything gets freed up on error */
34 r
->flags
= o
->flags
| (ASN1_OBJECT_FLAG_DYNAMIC
|
35 ASN1_OBJECT_FLAG_DYNAMIC_STRINGS
|
36 ASN1_OBJECT_FLAG_DYNAMIC_DATA
);
38 if (o
->length
> 0 && (r
->data
= OPENSSL_memdup(o
->data
, o
->length
)) == NULL
)
41 r
->length
= o
->length
;
44 if (o
->ln
!= NULL
&& (r
->ln
= OPENSSL_strdup(o
->ln
)) == NULL
)
47 if (o
->sn
!= NULL
&& (r
->sn
= OPENSSL_strdup(o
->sn
)) == NULL
)
56 int OBJ_cmp(const ASN1_OBJECT
*a
, const ASN1_OBJECT
*b
)
60 ret
= (a
->length
- b
->length
);
63 return memcmp(a
->data
, b
->data
, a
->length
);