gwenhywfar 5.12.0
sighead.c
Go to the documentation of this file.
1/***************************************************************************
2 begin : Sun Nov 30 2008
3 copyright : (C) 2008 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10
11#ifdef HAVE_CONFIG_H
12# include <config.h>
13#endif
14
15#define DISABLE_DEBUGLOG
16
17
18#include "sighead_p.h"
19#include "i18n_l.h"
20#include <gwenhywfar/misc.h>
21#include <gwenhywfar/debug.h>
22#include <gwenhywfar/tag16.h>
23
24
26
27
28
30{
31 GWEN_SIGHEAD *sh;
32
35
36 return sh;
37}
38
39
40
42{
43 if (sh) {
45 free(sh->keyName);
46 GWEN_Time_free(sh->dateTime);
47
49 }
50}
51
52
53
54GWEN_SIGHEAD *GWEN_SigHead_fromBuffer(const uint8_t *p, uint32_t l)
55{
56 if (p==NULL || l<1) {
57 DBG_INFO(GWEN_LOGDOMAIN, "Bad tag");
58 return NULL;
59 }
60 else {
61 GWEN_SIGHEAD *sh;
62 const uint8_t *sp;
63 uint32_t sl;
64
66 sp=p;
67 sl=l;
68 while (sl) {
69 GWEN_TAG16 *subtag;
70 uint32_t subtagLen;
71 const char *subtagPtr;
72 int i;
73
74 subtag=GWEN_Tag16_fromBuffer2(sp, sl, 0);
75 if (subtag==NULL) {
76 DBG_INFO(GWEN_LOGDOMAIN, "Bad sub-tag");
78 return NULL;
79 }
80 subtagLen=GWEN_Tag16_GetTagLength(subtag);
81 subtagPtr=(const char *)GWEN_Tag16_GetTagData(subtag);
82
83 if (subtagLen && subtagPtr) {
84 switch (GWEN_Tag16_GetTagType(subtag)) {
85 case GWEN_SIGHEAD_TLV_KEYNAME:
86 sh->keyName=(char *)malloc(subtagLen+1);
87 memmove(sh->keyName, subtagPtr, subtagLen);
88 sh->keyName[subtagLen]=0;
89 break;
90
91 case GWEN_SIGHEAD_TLV_KEYNUM:
92 if (sscanf(subtagPtr, "%d", &i)==1)
93 sh->keyNumber=i;
94 break;
95
96 case GWEN_SIGHEAD_TLV_KEYVER:
97 if (sscanf(subtagPtr, "%d", &i)==1)
98 sh->keyVersion=i;
99 break;
100
101 case GWEN_SIGHEAD_TLV_DATETIME:
102 if (subtagLen<128) {
103 char dt[128];
104
105 dt[0]=0;
106 strncpy(dt, (const char *) subtagPtr, sizeof(dt)-1);
107 dt[sizeof(dt)-1]=0;
108 sh->dateTime=GWEN_Time_fromUtcString(dt, "YYYYMMDD-hh:mm:ss");
109 if (sh->dateTime==NULL) {
110 DBG_ERROR(GWEN_LOGDOMAIN, "Bad format of dateTime [%s]", dt);
111 GWEN_Tag16_free(subtag);
113 return NULL;
114 }
115 }
116 else {
117 DBG_ERROR(GWEN_LOGDOMAIN, "Data for dateTime too long (%d bytes)", subtagLen);
118 GWEN_Tag16_free(subtag);
120 return NULL;
121 }
122 break;
123
124 case GWEN_SIGHEAD_TLV_SIGPROFILE:
125 if (sscanf(subtagPtr, "%d", &i)==1)
126 sh->signatureProfile=i;
127 break;
128
129 case GWEN_SIGHEAD_TLV_SIGNUM:
130 if (sscanf(subtagPtr, "%d", &i)==1)
131 sh->signatureNumber=i;
132 break;
133
134 default:
135 DBG_WARN(GWEN_LOGDOMAIN, "Unknown tag %02x", GWEN_Tag16_GetTagType(subtag));
136 }
137 }
138
139 sp+=GWEN_Tag16_GetTagSize(subtag);
140 sl-=GWEN_Tag16_GetTagSize(subtag);
141 GWEN_Tag16_free(subtag);
142 } /* while */
143
144 return sh;
145 }
146}
147
148
149
150int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType)
151{
152 char numbuf[32];
153 uint32_t pos;
154 uint8_t *p;
155 uint32_t l;
156
157 GWEN_Buffer_AppendByte(buf, tagType);
158 pos=GWEN_Buffer_GetPos(buf);
161
162 if (sh->keyName)
163 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNAME, sh->keyName, -1, buf);
164
165 snprintf(numbuf, sizeof(numbuf), "%d", sh->keyNumber);
166 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNUM, numbuf, -1, buf);
167
168 snprintf(numbuf, sizeof(numbuf), "%d", sh->keyVersion);
169 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYVER, numbuf, -1, buf);
170 if (sh->dateTime) {
171 GWEN_BUFFER *tbuf;
172
173 tbuf=GWEN_Buffer_new(0, 32, 0, 1);
174 GWEN_Time_toUtcString(sh->dateTime, "YYYYMMDD-hh:mm:ss", tbuf);
175 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_DATETIME,
177 -1,
178 buf);
179 GWEN_Buffer_free(tbuf);
180 }
181
182 snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureProfile);
183 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGPROFILE, numbuf, -1, buf);
184
185 snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureNumber);
186 GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGNUM, numbuf, -1, buf);
187
188 /* write size */
189 l=GWEN_Buffer_GetPos(buf)-pos-2;
190 p=(uint8_t *)GWEN_Buffer_GetStart(buf)+pos;
191 *(p++)=l & 0xff;
192 *p=(l>>8) & 0xff;
193
194 return 0;
195}
196
197
198
200{
201 assert(sh);
202 return sh->keyName;
203}
204
205
206
207void GWEN_SigHead_SetKeyName(GWEN_SIGHEAD *sh, const char *s)
208{
209 assert(sh);
210 free(sh->keyName);
211 if (s)
212 sh->keyName=strdup(s);
213 else
214 sh->keyName=NULL;
215}
216
217
218
220{
221 assert(sh);
222 return sh->keyNumber;
223}
224
225
226
228{
229 assert(sh);
230 sh->keyNumber=i;
231}
232
233
234
236{
237 assert(sh);
238 return sh->keyVersion;
239}
240
241
242
244{
245 assert(sh);
246 sh->keyVersion=i;
247}
248
249
250
252{
253 assert(sh);
254 return sh->dateTime;
255}
256
257
258
260{
261 assert(sh);
262 GWEN_Time_free(sh->dateTime);
263 if (ti)
264 sh->dateTime=GWEN_Time_dup(ti);
265 else
266 sh->dateTime=NULL;
267}
268
269
270
272{
273 assert(sh);
274 return sh->signatureProfile;
275}
276
277
278
280{
281 assert(sh);
282 sh->signatureProfile=i;
283}
284
285
286
288{
289 assert(sh);
290 return sh->signatureNumber;
291}
292
293
294
296{
297 assert(sh);
298 sh->signatureNumber=i;
299}
300
301
302
303
304
305
306
307
308
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition buffer.c:253
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition buffer.c:393
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_WARN(dbg_logger, format,...)
Definition debug.h:125
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
struct GWEN_TIME GWEN_TIME
Definition gwentime.h:43
GWENHYWFAR_API int GWEN_Time_toUtcString(const GWEN_TIME *t, const char *tmpl, GWEN_BUFFER *buf)
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromUtcString(const char *s, const char *tmpl)
GWENHYWFAR_API void GWEN_Time_free(GWEN_TIME *t)
GWENHYWFAR_API GWEN_TIME * GWEN_Time_dup(const GWEN_TIME *t)
#define GWEN_LIST_FINI(t, element)
Definition list1.h:475
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition list1.h:367
#define GWEN_LIST_INIT(t, element)
Definition list1.h:466
#define GWEN_LOGDOMAIN
Definition logger.h:35
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
void GWEN_SigHead_SetSignatureNumber(GWEN_SIGHEAD *sh, int i)
Definition sighead.c:295
void GWEN_SigHead_SetDateTime(GWEN_SIGHEAD *sh, const GWEN_TIME *ti)
Definition sighead.c:259
void GWEN_SigHead_SetSignatureProfile(GWEN_SIGHEAD *sh, int i)
Definition sighead.c:279
int GWEN_SigHead_GetKeyVersion(const GWEN_SIGHEAD *sh)
Definition sighead.c:235
const char * GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh)
Definition sighead.c:199
GWEN_SIGHEAD * GWEN_SigHead_fromBuffer(const uint8_t *p, uint32_t l)
Definition sighead.c:54
void GWEN_SigHead_SetKeyName(GWEN_SIGHEAD *sh, const char *s)
Definition sighead.c:207
int GWEN_SigHead_GetKeyNumber(const GWEN_SIGHEAD *sh)
Definition sighead.c:219
void GWEN_SigHead_SetKeyNumber(GWEN_SIGHEAD *sh, int i)
Definition sighead.c:227
void GWEN_SigHead_SetKeyVersion(GWEN_SIGHEAD *sh, int i)
Definition sighead.c:243
void GWEN_SigHead_free(GWEN_SIGHEAD *sh)
Definition sighead.c:41
int GWEN_SigHead_GetSignatureProfile(const GWEN_SIGHEAD *sh)
Definition sighead.c:271
GWEN_SIGHEAD * GWEN_SigHead_new(void)
Definition sighead.c:29
const GWEN_TIME * GWEN_SigHead_GetDateTime(const GWEN_SIGHEAD *sh)
Definition sighead.c:251
int GWEN_SigHead_GetSignatureNumber(const GWEN_SIGHEAD *sh)
Definition sighead.c:287
int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType)
Definition sighead.c:150
struct GWEN_SIGHEAD GWEN_SIGHEAD
Definition sighead.h:23
void GWEN_Tag16_DirectlyToBuffer(unsigned int tagType, const char *p, int size, GWEN_BUFFER *buf)
Definition tag16.c:208
unsigned int GWEN_Tag16_GetTagLength(const GWEN_TAG16 *tag)
Definition tag16.c:122
const void * GWEN_Tag16_GetTagData(const GWEN_TAG16 *tag)
Definition tag16.c:136
void GWEN_Tag16_free(GWEN_TAG16 *tag)
Definition tag16.c:103
unsigned int GWEN_Tag16_GetTagType(const GWEN_TAG16 *tag)
Definition tag16.c:115
GWEN_TAG16 * GWEN_Tag16_fromBuffer2(const uint8_t *bufferPtr, uint32_t bufferLen, int doCopy)
Definition tag16.c:156
unsigned int GWEN_Tag16_GetTagSize(const GWEN_TAG16 *tag)
Definition tag16.c:129
struct GWEN_TAG16 GWEN_TAG16
Definition tag16.h:35