gwenhywfar  5.10.1
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 
25 GWEN_LIST_FUNCTIONS(GWEN_SIGHEAD, GWEN_SigHead)
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 
48  GWEN_FREE_OBJECT(sh);
49  }
50 }
51 
52 
53 
54 GWEN_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 
65  sh=GWEN_SigHead_new();
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);
112  GWEN_SigHead_free(sh);
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);
119  GWEN_SigHead_free(sh);
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 
150 int 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);
159  GWEN_Buffer_AppendByte(buf, 0);
160  GWEN_Buffer_AppendByte(buf, 0);
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,
176  GWEN_Buffer_GetStart(tbuf),
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 
199 const char *GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh)
200 {
201  assert(sh);
202  return sh->keyName;
203 }
204 
205 
206 
207 void 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 
int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType)
Definition: sighead.c:150
struct GWEN_TIME GWEN_TIME
Definition: gwentime.h:43
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:235
void GWEN_SigHead_SetDateTime(GWEN_SIGHEAD *sh, const GWEN_TIME *ti)
Definition: sighead.c:259
const char * GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh)
Definition: sighead.c:199
GWENHYWFAR_API GWEN_TIME * GWEN_Time_dup(const GWEN_TIME *t)
Definition: gwentime_all.c:449
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:125
#define GWEN_LOGDOMAIN
Definition: logger.h:35
unsigned int GWEN_Tag16_GetTagSize(const GWEN_TAG16 *tlv)
Definition: tag16.c:72
const GWEN_TIME * GWEN_SigHead_GetDateTime(const GWEN_SIGHEAD *sh)
Definition: sighead.c:251
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:253
struct GWEN_TAG16 GWEN_TAG16
Definition: tag16.h:18
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:42
void GWEN_Tag16_DirectlyToBuffer(unsigned int tagType, const char *p, int size, GWEN_BUFFER *buf)
Definition: tag16.c:213
int GWEN_SigHead_GetKeyVersion(const GWEN_SIGHEAD *sh)
Definition: sighead.c:235
const void * GWEN_Tag16_GetTagData(const GWEN_TAG16 *tlv)
Definition: tag16.c:80
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
GWENHYWFAR_API int GWEN_Time_toUtcString(const GWEN_TIME *t, const char *tmpl, GWEN_BUFFER *buf)
Definition: gwentime_all.c:838
void GWEN_SigHead_SetKeyVersion(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:243
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:394
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
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:89
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
GWENHYWFAR_API void GWEN_Time_free(GWEN_TIME *t)
Definition: gwentime_all.c:462
struct GWEN_SIGHEAD GWEN_SIGHEAD
Definition: sighead.h:23
unsigned int GWEN_Tag16_GetTagLength(const GWEN_TAG16 *tlv)
Definition: tag16.c:64
unsigned int GWEN_Tag16_GetTagType(const GWEN_TAG16 *tlv)
Definition: tag16.c:56
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
GWENHYWFAR_API GWEN_TIME * GWEN_Time_fromUtcString(const char *s, const char *tmpl)
Definition: gwentime_all.c:352
int GWEN_SigHead_GetSignatureNumber(const GWEN_SIGHEAD *sh)
Definition: sighead.c:287
GWEN_SIGHEAD * GWEN_SigHead_new(void)
Definition: sighead.c:29
void GWEN_SigHead_SetKeyNumber(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:227
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
int GWEN_SigHead_GetSignatureProfile(const GWEN_SIGHEAD *sh)
Definition: sighead.c:271
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
void GWEN_SigHead_SetSignatureNumber(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:295
void GWEN_SigHead_free(GWEN_SIGHEAD *sh)
Definition: sighead.c:41
void GWEN_Tag16_free(GWEN_TAG16 *tlv)
Definition: tag16.c:44
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
void GWEN_SigHead_SetSignatureProfile(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:279
int GWEN_SigHead_GetKeyNumber(const GWEN_SIGHEAD *sh)
Definition: sighead.c:219
GWEN_TAG16 * GWEN_Tag16_fromBuffer2(const uint8_t *p, uint32_t l, int doCopy)
Definition: tag16.c:151