]>
Commit | Line | Data |
---|---|---|
62867571 | 1 | /* |
f32b0abe | 2 | * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. |
d02b48c6 | 3 | * |
62867571 RS |
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 | |
d02b48c6 RE |
8 | */ |
9 | ||
10 | #include <stdio.h> | |
b39fc560 | 11 | #include "internal/cryptlib.h" |
ec577822 BM |
12 | #include <openssl/objects.h> |
13 | #include <openssl/buffer.h> | |
2e430277 | 14 | #include "internal/asn1_int.h" |
d02b48c6 | 15 | |
8d28d5f8 | 16 | ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o) |
0f113f3e MC |
17 | { |
18 | ASN1_OBJECT *r; | |
d02b48c6 | 19 | |
0f113f3e | 20 | if (o == NULL) |
52832e47 DSH |
21 | return NULL; |
22 | /* If object isn't dynamic it's an internal OID which is never freed */ | |
0f113f3e | 23 | if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC)) |
52832e47 | 24 | return ((ASN1_OBJECT *)o); |
d02b48c6 | 25 | |
0f113f3e MC |
26 | r = ASN1_OBJECT_new(); |
27 | if (r == NULL) { | |
28 | OBJerr(OBJ_F_OBJ_DUP, ERR_R_ASN1_LIB); | |
29 | return (NULL); | |
30 | } | |
d02b48c6 | 31 | |
52832e47 DSH |
32 | /* Set dynamic flags so everything gets freed up on error */ |
33 | ||
0f113f3e MC |
34 | r->flags = o->flags | (ASN1_OBJECT_FLAG_DYNAMIC | |
35 | ASN1_OBJECT_FLAG_DYNAMIC_STRINGS | | |
36 | ASN1_OBJECT_FLAG_DYNAMIC_DATA); | |
52832e47 DSH |
37 | |
38 | if (o->length > 0 && (r->data = OPENSSL_memdup(o->data, o->length)) == NULL) | |
39 | goto err; | |
40 | ||
41 | r->length = o->length; | |
42 | r->nid = o->nid; | |
43 | ||
44 | if (o->ln != NULL && (r->ln = OPENSSL_strdup(o->ln)) == NULL) | |
45 | goto err; | |
46 | ||
47 | if (o->sn != NULL && (r->sn = OPENSSL_strdup(o->sn)) == NULL) | |
48 | goto err; | |
49 | ||
50 | return r; | |
0f113f3e | 51 | err: |
52832e47 | 52 | ASN1_OBJECT_free(r); |
0f113f3e | 53 | OBJerr(OBJ_F_OBJ_DUP, ERR_R_MALLOC_FAILURE); |
52832e47 | 54 | return NULL; |
0f113f3e | 55 | } |
d02b48c6 | 56 | |
8d28d5f8 | 57 | int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b) |
0f113f3e MC |
58 | { |
59 | int ret; | |
d02b48c6 | 60 | |
0f113f3e MC |
61 | ret = (a->length - b->length); |
62 | if (ret) | |
63 | return (ret); | |
64 | return (memcmp(a->data, b->data, a->length)); | |
65 | } |