libpurple/tls-certificate-info.c

Mon, 26 Sep 2016 15:17:15 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Mon, 26 Sep 2016 15:17:15 -0500
changeset 38059
1baf1f1b10e2
parent 37973
c9a2d2176444
child 38324
b50d5294b14e
permissions
-rw-r--r--

Merged in rw_grim/pidgin (pull request #135)

Add our license spiel to a bunch of files

37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
1 /*
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
2 *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
3 * purple
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
4 *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
5 * Purple is the legal property of its developers, whose names are too numerous
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
6 * to list here. Please refer to the COPYRIGHT file distributed with this
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
7 * source distribution.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
8 *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
9 * This program is free software; you can redistribute it and/or modify
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
10 * it under the terms of the GNU General Public License as published by
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
11 * the Free Software Foundation; either version 2 of the License, or
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
12 * (at your option) any later version.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
13 *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
14 * This program is distributed in the hope that it will be useful,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
17 * GNU General Public License for more details.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
18 *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
19 * You should have received a copy of the GNU General Public License
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
20 * along with this program; if not, write to the Free Software
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
22 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
23
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
24 #include "internal.h"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
25 #include "tls-certificate-info.h"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
26 #include "ciphers/sha1hash.h"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
27 #include "debug.h"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
28 #include "util.h"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
29
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
30 #define DER_TYPE_CLASS(type) (type & 0xc0)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
31
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
32 #define DER_TYPE_CLASS_UNIVERSAL 0x00
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
33 #define DER_TYPE_CLASS_APPLICATION 0x40
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
34 #define DER_TYPE_CLASS_CONTEXT_SPECIFIC 0x80
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
35 #define DER_TYPE_CLASS_PRIVATE 0xc0
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
36
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
37 #define DER_TYPE_TAG(type) (type & 0x1f)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
38
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
39 #define DER_TYPE_IS_CONSTRUCTED(type) ((type & 0x20) ? TRUE : FALSE)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
40
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
41 #define DER_TYPE_TAG_IS_LONG_FORM(type) (DER_TYPE_TAG(type) == 0x1f)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
42
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
43 #define DER_LENGTH_IS_LONG_FORM(byte) ((byte & 0x80) ? TRUE : FALSE)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
44 #define DER_LENGTH_LONG_FORM_SIZE(byte) (byte & 0x7f)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
45
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
46 typedef struct {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
47 guint8 type_class;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
48 gboolean constructed;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
49 guint type;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
50 GBytes *content;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
51 GSList *children;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
52 } DerNodeData;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
53
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
54 static void der_node_data_children_list_free(GSList *children);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
55
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
56 static void
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
57 der_node_data_free(DerNodeData *node_data)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
58 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
59 g_return_if_fail(node_data != NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
60
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
61 g_clear_pointer(&node_data->content, g_bytes_unref);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
62 g_clear_pointer(&node_data->children,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
63 der_node_data_children_list_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
64
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
65 g_free(node_data);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
66 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
67
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
68 static void
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
69 der_node_data_children_list_free(GSList *children)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
70 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
71 g_return_if_fail(children != NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
72
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
73 g_slist_free_full(children, (GDestroyNotify)der_node_data_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
74 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
75
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
76 /* Parses DER encoded data into a GSList of DerNodeData instances */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
77 static GSList *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
78 der_parse(GBytes *data_bytes)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
79 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
80 const guint8 *data;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
81 gsize size = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
82 gsize offset = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
83 GSList *nodes = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
84 DerNodeData *node = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
85
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
86 data = g_bytes_get_data(data_bytes, &size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
87
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
88 /* Parse data */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
89 while (offset < size) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
90 guint8 byte;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
91 gsize length;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
92
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
93 /* Parse type */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
94
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
95 byte = *(data + offset++);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
96 node = g_new0(DerNodeData, 1);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
97 node->type_class = DER_TYPE_CLASS(byte);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
98 node->constructed = DER_TYPE_IS_CONSTRUCTED(byte);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
99
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
100 if (DER_TYPE_TAG_IS_LONG_FORM(byte)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
101 /* Long-form type encoding */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
102 /* TODO: Handle long-form encoding.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
103 * Maiku: The certificates I tested didn't do this.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
104 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
105 g_return_val_if_reached(NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
106 } else {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
107 /* Short-form type encoding */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
108 node->type = DER_TYPE_TAG(byte);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
109 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
110
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
111 /* Parse content length */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
112
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
113 if (offset >= size) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
114 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
115 "Not enough remaining data when "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
116 "parsing DER chunk length byte: "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
117 "read (%" G_GSIZE_FORMAT ") "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
118 "available: ""(%" G_GSIZE_FORMAT ")",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
119 offset, size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
120 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
121 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
122
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
123 byte = *(data + offset++);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
124
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
125 if (DER_LENGTH_IS_LONG_FORM(byte)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
126 /* Long-form length encoding */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
127 guint num_len_bytes = DER_LENGTH_LONG_FORM_SIZE(byte);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
128 guint i;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
129
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
130 /* Guard against overflowing the integer */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
131 if (num_len_bytes > sizeof(guint)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
132 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
133 "Number of long-form length "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
134 "bytes greater than guint "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
135 "size: %u > %" G_GSIZE_FORMAT,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
136 num_len_bytes, sizeof(guint));
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
137 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
138 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
139
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
140 /* Guard against reading past the end of the buffer */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
141 if (offset + num_len_bytes > size) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
142 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
143 "Not enough remaining data "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
144 "when parsing DER chunk "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
145 "long-form length bytes: "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
146 "read (%" G_GSIZE_FORMAT ") "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
147 "available: ""(%"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
148 G_GSIZE_FORMAT ")",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
149 offset, size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
150 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
151 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
152
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
153 length = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
154
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
155 for (i = 0; i < num_len_bytes; ++i) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
156 length = length << 8;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
157 length |= *(data + offset++);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
158 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
159 } else {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
160 /* Short-form length encoding */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
161 length = byte;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
162 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
163
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
164 /* Parse content */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
165
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
166 if (offset + length > size) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
167 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
168 "Not enough remaining data when "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
169 "parsing DER chunk content: "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
170 "content size (%" G_GSIZE_FORMAT ") "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
171 "available: ""(%" G_GSIZE_FORMAT ")",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
172 length, size - offset);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
173 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
174 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
175
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
176 node->content = g_bytes_new_from_bytes(data_bytes,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
177 offset, length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
178 offset += length;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
179
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
180 /* Maybe recurse */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
181 if (node->constructed) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
182 node->children = der_parse(node->content);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
183
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
184 if (node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
185 /* No children on a constructed type
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
186 * should an error. If this happens, it
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
187 * outputs debug info inside der_parse().
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
188 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
189 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
190 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
191 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
192
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
193 nodes = g_slist_append(nodes, node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
194 node = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
195 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
196
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
197 if (node != NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
198 /* There was an error. Free parsing data. */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
199 der_node_data_free(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
200 g_clear_pointer(&nodes, der_node_data_children_list_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
201 /* FIXME: Report error to calling function ala GError? */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
202 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
203
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
204 return nodes;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
205 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
206
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
207 static gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
208 der_parse_string(DerNodeData *node)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
209 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
210 const gchar *str;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
211 gsize length = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
212
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
213 g_return_val_if_fail(node != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
214 g_return_val_if_fail(node->content != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
215
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
216 str = g_bytes_get_data(node->content, &length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
217 return g_strndup(str, length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
218 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
219
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
220 typedef struct {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
221 gchar *oid;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
222 gchar *value;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
223 } DerOIDValue;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
224
37973
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
225 static DerOIDValue *
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
226 der_oid_value_copy(DerOIDValue *data)
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
227 {
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
228 DerOIDValue *ret;
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
229
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
230 g_return_val_if_fail(data != NULL, NULL);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
231
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
232 ret = g_new0(DerOIDValue, 1);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
233 ret->oid = g_strdup(data->oid);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
234 ret->value = g_strdup(data->value);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
235 return ret;
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
236 }
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
237
37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
238 static void
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
239 der_oid_value_free(DerOIDValue *data)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
240 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
241 g_return_if_fail(data != NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
242
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
243 g_clear_pointer(&data->oid, g_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
244 g_clear_pointer(&data->value, g_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
245
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
246 g_free(data);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
247 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
248
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
249 static void
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
250 der_oid_value_slist_free(GSList *list)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
251 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
252 g_return_if_fail(list != NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
253
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
254 g_slist_free_full(list, (GDestroyNotify)der_oid_value_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
255 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
256
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
257 static const gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
258 der_oid_value_slist_get_value_by_oid(GSList *list, const gchar *oid)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
259 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
260 for (; list != NULL; list = g_slist_next(list)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
261 DerOIDValue *value = list->data;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
262
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
263 if (!strcmp(oid, value->oid)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
264 return value->value;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
265 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
266 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
267
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
268 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
269 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
270
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
271 static gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
272 der_parse_oid(DerNodeData *node)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
273 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
274 const gchar *oid_data;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
275 gsize length = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
276 gsize offset = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
277 guint8 byte;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
278 GString *ret;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
279
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
280 g_return_val_if_fail(node != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
281 g_return_val_if_fail(node->content != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
282
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
283 oid_data = g_bytes_get_data(node->content, &length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
284 /* Most OIDs used for certificates aren't larger than 9 bytes */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
285 ret = g_string_sized_new(9);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
286
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
287 /* First byte is encoded as num1 * 40 + num2 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
288 if (length > 0) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
289 byte = *(oid_data + offset++);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
290 g_string_append_printf(ret, "%u.%u", byte / 40, byte % 40);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
291 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
292
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
293 /* Subsequent numbers are in base 128 format (the most
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
294 * significant bit being set adds another 7 bits to the number)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
295 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
296 while (offset < length) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
297 guint value = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
298
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
299 do {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
300 byte = *(oid_data + offset++);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
301 value = (value << 7) + (byte & 0x7f);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
302 } while (byte & 0x80 && offset < length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
303
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
304 g_string_append_printf(ret, ".%u", value);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
305 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
306
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
307 return g_string_free(ret, FALSE);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
308 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
309
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
310 /* Parses X.509 Issuer and Subject name structures
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
311 * into a GSList of DerOIDValue.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
312 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
313 static GSList *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
314 der_parse_name(DerNodeData *name_node)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
315 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
316 GSList *list;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
317 GSList *ret = NULL;
37656
0efbeb2be432 some more scan build fixes
Gary Kramlich <grim@reaperworld.com>
parents: 37632
diff changeset
318 DerOIDValue *value = NULL;
37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
319
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
320 g_return_val_if_fail(name_node != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
321
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
322 /* Iterate over items in the name sequence */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
323 list = name_node->children;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
324
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
325 while (list != NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
326 DerNodeData *child_node;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
327 GSList *child_list;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
328
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
329 value = g_new(DerOIDValue, 1);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
330
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
331 /* Each item in the name sequence is a set containing
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
332 * a sequence of an ObjectID and a String-like value
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
333 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
334
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
335 /* Get the DerNode containing set data */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
336 if ((child_node = g_slist_nth_data(list, 0)) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
337 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
338 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
339
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
340 /* Get the DerNode containing its sequence data */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
341 if (child_node == NULL ||
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
342 (child_node = g_slist_nth_data(
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
343 child_node->children, 0)) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
344 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
345 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
346
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
347 /* Get the GSList item containing the ObjectID DerNode */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
348 if ((child_list = child_node->children) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
349 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
350 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
351
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
352 /* Get the DerNode containing the ObjectID */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
353 if ((child_node = child_list->data) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
354 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
355 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
356
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
357 /* Parse ObjectID */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
358 value->oid = der_parse_oid(child_node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
359
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
360 /* Get the GSList item containing the String-like value */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
361 if ((child_list = g_slist_next(child_list)) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
362 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
363 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
364
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
365 /* Get the DerNode containing the String-like value */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
366 if ((child_node = child_list->data) == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
367 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
368 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
369
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
370 /* Parse String-like value */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
371 value->value = der_parse_string(child_node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
372
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
373 ret = g_slist_prepend(ret, value);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
374 list = g_slist_next(list);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
375 value = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
376 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
377
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
378 if (value != NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
379 der_oid_value_free(value);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
380 der_oid_value_slist_free(ret);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
381 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
382
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
383 return g_slist_reverse(ret);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
384 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
385
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
386 static GDateTime *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
387 der_parse_time(DerNodeData *node)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
388 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
389 gchar *time;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
390 gchar *c;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
391 gint time_parts[7];
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
392 gint time_part_idx = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
393 int length;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
394
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
395 g_return_val_if_fail(node != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
396 g_return_val_if_fail(node->content != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
397
37661
a2d2f84aef2c This should make coverity and scan-build happier
Gary Kramlich <grim@reaperworld.com>
parents: 37656
diff changeset
398 memset(time_parts, 0, sizeof(time_parts));
37656
0efbeb2be432 some more scan build fixes
Gary Kramlich <grim@reaperworld.com>
parents: 37632
diff changeset
399
37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
400 time = der_parse_string(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
401
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
402 /* For the purposes of X.509
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
403 * UTCTime format is "YYMMDDhhmmssZ" (YY >= 50 ? 19YY : 20YY) and
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
404 * GeneralizedTime format is "YYYYMMDDhhmmssZ"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
405 * According to RFC2459, they both are GMT, which is weird
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
406 * considering one is named UTC, but for the purposes of display,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
407 * for which this is used, it shouldn't matter.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
408 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
409
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
410 length = strlen(time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
411 if (length == 13) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
412 /* UTCTime: Skip the first part as it's calculated later */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
413 time_part_idx = 1;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
414 } else if (length == 15) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
415 /* Generalized Time */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
416 /* TODO: Handle generalized time
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
417 * Maiku: None of the certificates I tested used this
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
418 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
419 g_free(time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
420 g_return_val_if_reached(NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
421 } else {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
422 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
423 "Unrecognized time format (length: %i)",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
424 length);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
425 g_free(time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
426 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
427 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
428
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
429 c = time;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
430
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
431 while (c - time < length) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
432 if (*c == 'Z') {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
433 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
434 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
435
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
436 if (!g_ascii_isdigit(*c) || !g_ascii_isdigit(*(c + 1))) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
437 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
438 "Error parsing time. next characters "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
439 "aren't both digits: '%c%c'",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
440 *c, *(c + 1));
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
441 break;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
442 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
443
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
444 time_parts[time_part_idx++] =
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
445 g_ascii_digit_value(*c) * 10 +
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
446 g_ascii_digit_value(*(c + 1));
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
447 c += 2;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
448 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
449
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
450 if (length == 13) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
451 if (time_parts[1] >= 50) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
452 time_parts[0] = 19;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
453 } else {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
454 time_parts[0] = 20;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
455 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
456 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
457
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
458 return g_date_time_new_utc(
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
459 time_parts[0] * 100 + time_parts[1], /* year */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
460 time_parts[2], /* month */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
461 time_parts[3], /* day */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
462 time_parts[4], /* hour */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
463 time_parts[5], /* minute */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
464 time_parts[6]); /* seconds */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
465 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
466
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
467 /* This structure contains the data which is in an X.509 certificate.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
468 * Only the values actually parsed/used are here. The remaining commented
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
469 * out values are informative placeholders for the remaining data that
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
470 * could be in a standard certificate.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
471 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
472 struct _PurpleTlsCertificateInfo {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
473 GTlsCertificate *cert;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
474
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
475 /* version (Optional, defaults to version 1 (version = value + 1)) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
476 /* serialNumber */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
477 /* signature */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
478 GSList *issuer;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
479 GDateTime *notBefore;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
480 GDateTime *notAfter;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
481 GSList *subject;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
482 /* subjectPublicKeyInfo */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
483 /* issuerUniqueIdentifier (Optional, requires version 2 or 3) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
484 /* subjectUniqueIdentifier (Optional, requires version 2 or 3) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
485 /* extensions (Optional, requires version 3) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
486 };
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
487
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
488 /* TODO: Make better API for this? */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
489 PurpleTlsCertificateInfo *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
490 purple_tls_certificate_get_info(GTlsCertificate *certificate)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
491 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
492 GByteArray *der_array = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
493 GBytes *root;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
494 GSList *nodes;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
495 DerNodeData *node;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
496 DerNodeData *cert_node;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
497 DerNodeData *valid_node;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
498 PurpleTlsCertificateInfo *info;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
499
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
500 g_return_val_if_fail(G_IS_TLS_CERTIFICATE(certificate), NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
501
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
502 /* Get raw bytes from DER formatted certificate */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
503 g_object_get(certificate, "certificate", &der_array, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
504
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
505 /* Parse raw bytes into DerNode tree */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
506 root = g_byte_array_free_to_bytes(der_array);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
507 nodes = der_parse(root);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
508 g_bytes_unref(root);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
509
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
510 if (nodes == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
511 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
512 "Error parsing certificate");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
513 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
514 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
515
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
516 /* Set up PurpleTlsCertificateInfo struct with initial data */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
517 info = g_new0(PurpleTlsCertificateInfo, 1);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
518 info->cert = g_object_ref(certificate);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
519
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
520 /* Get certificate root sequence GSList item */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
521 node = g_slist_nth_data(nodes, 0);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
522 if (node == NULL || node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
523 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
524 "Error parsing certificate root node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
525 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
526 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
527 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
528
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
529 /* Get certificate sequence GSList DerNode */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
530 cert_node = g_slist_nth_data(node->children, 0);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
531 if (cert_node == NULL || cert_node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
532 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
533 "Error to parsing certificate node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
534 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
535 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
536 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
537
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
538 /* Check for optional certificate version */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
539
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
540 node = g_slist_nth_data(cert_node->children, 0);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
541 if (node == NULL || node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
542 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
543 "Error to parsing certificate version node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
544 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
545 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
546 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
547
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
548 if (node->type_class != DER_TYPE_CLASS_CONTEXT_SPECIFIC) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
549 /* Include optional version so indices work right */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
550 /* TODO: Actually set default version value? */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
551 cert_node->children =
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
552 g_slist_prepend(cert_node->children, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
553 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
554
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
555 /* Get certificate issuer */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
556
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
557 node = g_slist_nth_data(cert_node->children, 3);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
558 if (node == NULL || node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
559 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
560 "Error to parsing certificate issuer node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
561 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
562 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
563 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
564
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
565 info->issuer = der_parse_name(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
566
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
567 /* Get certificate validity */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
568
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
569 valid_node = g_slist_nth_data(cert_node->children, 4);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
570 if (valid_node == NULL || valid_node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
571 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
572 "Error to parsing certificate validity node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
573 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
574 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
575 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
576
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
577 /* Get certificate validity (notBefore) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
578 node = g_slist_nth_data(valid_node->children, 0);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
579 if (node == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
580 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
581 "Error to parsing certificate valid "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
582 "notBefore node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
583 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
584 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
585 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
586
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
587 info->notBefore = der_parse_time(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
588
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
589 /* Get certificate validity (notAfter) */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
590 node = g_slist_nth_data(valid_node->children, 1);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
591 if (node == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
592 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
593 "Error to parsing certificate valid "
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
594 "notAfter node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
595 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
596 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
597 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
598
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
599 info->notAfter = der_parse_time(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
600
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
601 /* Get certificate subject */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
602
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
603 node = g_slist_nth_data(cert_node->children, 5);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
604 if (node == NULL || node->children == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
605 purple_debug_warning("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
606 "Error to parsing certificate subject node");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
607 purple_tls_certificate_info_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
608 return NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
609 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
610
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
611 info->subject = der_parse_name(node);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
612
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
613 /* Clean up */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
614 der_node_data_children_list_free(nodes);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
615
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
616 return info;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
617 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
618
37973
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
619 static PurpleTlsCertificateInfo *
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
620 purple_tls_certificate_info_copy(PurpleTlsCertificateInfo *info)
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
621 {
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
622 PurpleTlsCertificateInfo *ret;
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
623
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
624 g_return_val_if_fail(info != NULL, NULL);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
625
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
626 ret = g_new0(PurpleTlsCertificateInfo, 1);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
627 ret->issuer = g_slist_copy_deep(info->issuer,
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
628 (GCopyFunc)der_oid_value_copy, NULL);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
629 ret->notBefore = g_date_time_ref(info->notBefore);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
630 ret->notAfter = g_date_time_ref(info->notAfter);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
631 ret->subject = g_slist_copy_deep(info->subject,
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
632 (GCopyFunc)der_oid_value_copy, NULL);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
633
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
634 return ret;
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
635 }
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
636
37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
637 void
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
638 purple_tls_certificate_info_free(PurpleTlsCertificateInfo *info)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
639 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
640 g_return_if_fail(info != NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
641
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
642 g_clear_object(&info->cert);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
643
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
644 g_clear_pointer(&info->issuer, der_oid_value_slist_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
645 g_clear_pointer(&info->notBefore, g_date_time_unref);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
646 g_clear_pointer(&info->notAfter, g_date_time_unref);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
647 g_clear_pointer(&info->subject, der_oid_value_slist_free);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
648
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
649 g_free(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
650 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
651
37973
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
652 G_DEFINE_BOXED_TYPE(PurpleTlsCertificateInfo, purple_tls_certificate_info,
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
653 purple_tls_certificate_info_copy,
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
654 purple_tls_certificate_info_free);
c9a2d2176444 tls-certificate-info: Box PurpleTlsCertificateInfo and fix GI annotations
Mike Ruprecht <cmaiku@gmail.com>
parents: 37661
diff changeset
655
37632
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
656 /* Looks up the relative distinguished name (RDN) from an ObjectID */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
657 static const gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
658 lookup_rdn_name_by_oid(const gchar *oid)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
659 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
660 static GHashTable *ht = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
661
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
662 if (G_UNLIKELY(ht == NULL)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
663 ht = g_hash_table_new_full(g_str_hash, g_str_equal,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
664 NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
665
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
666 /* commonName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
667 g_hash_table_insert(ht, "2.5.4.3", "CN");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
668 /* countryName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
669 g_hash_table_insert(ht, "2.5.4.6", "C");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
670 /* localityName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
671 g_hash_table_insert(ht, "2.5.4.7", "L");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
672 /* stateOrProvinceName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
673 g_hash_table_insert(ht, "2.5.4.8", "ST");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
674 /* organizationName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
675 g_hash_table_insert(ht, "2.5.4.10", "O");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
676 /* organizationalUnitName */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
677 g_hash_table_insert(ht, "2.5.4.11", "OU");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
678 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
679
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
680 return g_hash_table_lookup(ht, oid);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
681 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
682
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
683 /* Makes a distinguished name (DN) from
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
684 * a list of relative distinguished names (RDN).
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
685 * Order matters.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
686 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
687 static gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
688 make_dn_from_oid_value_slist(GSList *list)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
689 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
690 GString *str = g_string_new(NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
691
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
692 for (; list != NULL; list = g_slist_next(list)) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
693 DerOIDValue *value = list->data;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
694 const gchar *name;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
695 gchar *new_value;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
696
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
697 if (value == NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
698 purple_debug_error("tls-certificate",
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
699 "DerOIDValue data missing from GSList");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
700 continue;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
701 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
702
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
703 name = lookup_rdn_name_by_oid(value->oid);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
704 /* Escape commas in value as that's the DN separator */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
705 new_value = purple_strreplace(value->value, ",", "\\,");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
706 g_string_append_printf(str, "%s=%s,", name, new_value);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
707 g_free(new_value);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
708 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
709
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
710 /* Remove trailing comma */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
711 g_string_truncate(str, str->len - 1);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
712
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
713 return g_string_free(str, FALSE);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
714 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
715
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
716 static gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
717 purple_tls_certificate_info_get_issuer_dn(PurpleTlsCertificateInfo *info)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
718 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
719 g_return_val_if_fail(info != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
720 g_return_val_if_fail(info->issuer != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
721
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
722 return make_dn_from_oid_value_slist(info->issuer);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
723 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
724
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
725 gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
726 purple_tls_certificate_info_get_display_string(PurpleTlsCertificateInfo *info)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
727 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
728 gchar *subject_name;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
729 gchar *issuer_name = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
730 GByteArray *sha1_bytes;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
731 gchar *sha1_str = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
732 gchar *activation_time;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
733 gchar *expiration_time;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
734 gchar *ret;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
735
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
736 g_return_val_if_fail(info != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
737
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
738 /* Getting the commonName of a CA supposedly doesn't work, but we
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
739 * shouldn't be dealing with those here anyway.
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
740 */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
741 subject_name = purple_tls_certificate_info_get_subject_name(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
742
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
743 issuer_name = purple_tls_certificate_info_get_issuer_dn(info);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
744
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
745 sha1_bytes = purple_tls_certificate_get_fingerprint_sha1(info->cert);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
746 if (sha1_bytes != NULL) {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
747 sha1_str = purple_base16_encode_chunked(sha1_bytes->data,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
748 sha1_bytes->len);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
749 g_byte_array_unref(sha1_bytes);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
750 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
751
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
752 activation_time = g_date_time_format(info->notBefore, "%c");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
753 expiration_time = g_date_time_format(info->notAfter, "%c");
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
754
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
755 ret = g_strdup_printf(
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
756 _("Common name: %s\n\n"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
757 "Issued by: %s\n\n"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
758 "Fingerprint (SHA1): %s\n\n"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
759 "Activation date: %s\n"
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
760 "Expiriation date: %s\n"),
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
761 subject_name,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
762 issuer_name,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
763 sha1_str,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
764 activation_time,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
765 expiration_time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
766
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
767 g_free(subject_name);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
768 g_free(issuer_name);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
769 g_free(sha1_str);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
770 g_free(activation_time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
771 g_free(expiration_time);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
772
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
773 return ret;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
774 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
775
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
776 /* TODO: Make better API for this? */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
777 gchar *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
778 purple_tls_certificate_info_get_subject_name(PurpleTlsCertificateInfo *info)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
779 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
780 g_return_val_if_fail(info != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
781 g_return_val_if_fail(info->subject != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
782
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
783 /* commonName component of the subject */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
784 return g_strdup(der_oid_value_slist_get_value_by_oid(info->subject,
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
785 "2.5.4.3"));
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
786 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
787
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
788 /* TODO: Make better API for this? */
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
789 GByteArray *
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
790 purple_tls_certificate_get_fingerprint_sha1(GTlsCertificate *certificate)
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
791 {
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
792 PurpleHash *hash;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
793 GByteArray *der = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
794 guint8 *data = NULL;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
795 gsize buf_size = 0;
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
796
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
797 g_return_val_if_fail(G_IS_TLS_CERTIFICATE(certificate), NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
798
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
799 g_object_get(certificate, "certificate", &der, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
800
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
801 g_return_val_if_fail(der != NULL, NULL);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
802
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
803 hash = purple_sha1_hash_new();
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
804
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
805 buf_size = purple_hash_get_digest_size(hash);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
806 data = g_malloc(buf_size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
807
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
808 purple_hash_append(hash, der->data, der->len);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
809 g_byte_array_unref(der);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
810
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
811 purple_hash_digest(hash, data, buf_size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
812 g_object_unref(hash);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
813
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
814 return g_byte_array_new_take(data, buf_size);
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
815 }
4879ef4db7cf Move Tls Certificate parsing code into tls-certificate-info.[ch]
Mike Ruprecht <cmaiku@gmail.com>
parents:
diff changeset
816

mercurial