Copyright consolidation 04/10
[openssl.git] / crypto / objects / obj_lib.c
1 /*
2  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
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
8  */
9
10 #include <stdio.h>
11 #include "internal/cryptlib.h"
12 #include <openssl/lhash.h>
13 #include <openssl/objects.h>
14 #include <openssl/buffer.h>
15 #include "internal/asn1_int.h"
16
17 ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o)
18 {
19     ASN1_OBJECT *r;
20     int i;
21     char *ln = NULL, *sn = NULL;
22     unsigned char *data = NULL;
23
24     if (o == NULL)
25         return (NULL);
26     if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC))
27         return ((ASN1_OBJECT *)o); /* XXX: ugh! Why? What kind of duplication
28                                     * is this??? */
29
30     r = ASN1_OBJECT_new();
31     if (r == NULL) {
32         OBJerr(OBJ_F_OBJ_DUP, ERR_R_ASN1_LIB);
33         return (NULL);
34     }
35     data = OPENSSL_malloc(o->length);
36     if (data == NULL)
37         goto err;
38     if (o->data != NULL)
39         memcpy(data, o->data, o->length);
40     /* once data attached to object it remains const */
41     r->data = data;
42     r->length = o->length;
43     r->nid = o->nid;
44     r->ln = r->sn = NULL;
45     if (o->ln != NULL) {
46         i = strlen(o->ln) + 1;
47         ln = OPENSSL_malloc(i);
48         if (ln == NULL)
49             goto err;
50         memcpy(ln, o->ln, i);
51         r->ln = ln;
52     }
53
54     if (o->sn != NULL) {
55         i = strlen(o->sn) + 1;
56         sn = OPENSSL_malloc(i);
57         if (sn == NULL)
58             goto err;
59         memcpy(sn, o->sn, i);
60         r->sn = sn;
61     }
62     r->flags = o->flags | (ASN1_OBJECT_FLAG_DYNAMIC |
63                            ASN1_OBJECT_FLAG_DYNAMIC_STRINGS |
64                            ASN1_OBJECT_FLAG_DYNAMIC_DATA);
65     return (r);
66  err:
67     OBJerr(OBJ_F_OBJ_DUP, ERR_R_MALLOC_FAILURE);
68     OPENSSL_free(ln);
69     OPENSSL_free(sn);
70     OPENSSL_free(data);
71     OPENSSL_free(r);
72     return (NULL);
73 }
74
75 int OBJ_cmp(const ASN1_OBJECT *a, const ASN1_OBJECT *b)
76 {
77     int ret;
78
79     ret = (a->length - b->length);
80     if (ret)
81         return (ret);
82     return (memcmp(a->data, b->data, a->length));
83 }