gwenhywfar  4.99.8beta
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  GWEN_SIGHEAD *sh;
31 
34 
35  return sh;
36 }
37 
38 
39 
41  if (sh) {
43  free(sh->keyName);
44  GWEN_Time_free(sh->dateTime);
45 
46  GWEN_FREE_OBJECT(sh);
47  }
48 }
49 
50 
51 
52 GWEN_SIGHEAD *GWEN_SigHead_fromBuffer(const uint8_t *p, uint32_t l) {
53  if (p==NULL || l<1) {
54  DBG_INFO(GWEN_LOGDOMAIN, "Bad tag");
55  return NULL;
56  }
57  else {
58  GWEN_SIGHEAD *sh;
59  const uint8_t *sp;
60  uint32_t sl;
61 
62  sh=GWEN_SigHead_new();
63  sp=p;
64  sl=l;
65  while(sl) {
66  GWEN_TAG16 *subtag;
67  uint32_t subtagLen;
68  const char *subtagPtr;
69  int i;
70 
71  subtag=GWEN_Tag16_fromBuffer2(sp, sl, 0);
72  if (subtag==NULL) {
73  DBG_INFO(GWEN_LOGDOMAIN, "Bad sub-tag");
75  return NULL;
76  }
77  subtagLen=GWEN_Tag16_GetTagLength(subtag);
78  subtagPtr=(const char*)GWEN_Tag16_GetTagData(subtag);
79 
80  if (subtagLen && subtagPtr) {
81  switch(GWEN_Tag16_GetTagType(subtag)) {
82  case GWEN_SIGHEAD_TLV_KEYNAME:
83  sh->keyName=(char*)malloc(subtagLen+1);
84  memmove(sh->keyName, subtagPtr, subtagLen);
85  sh->keyName[subtagLen]=0;
86  break;
87 
88  case GWEN_SIGHEAD_TLV_KEYNUM:
89  if (sscanf(subtagPtr, "%d", &i)==1)
90  sh->keyNumber=i;
91  break;
92 
93  case GWEN_SIGHEAD_TLV_KEYVER:
94  if (sscanf(subtagPtr, "%d", &i)==1)
95  sh->keyVersion=i;
96  break;
97 
98  case GWEN_SIGHEAD_TLV_DATETIME:
99  if (subtagLen<128) {
100  char dt[128];
101 
102  dt[0]=0;
103  strncpy(dt, (const char*) subtagPtr, sizeof(dt)-1);
104  dt[sizeof(dt)-1]=0;
105  sh->dateTime=GWEN_Time_fromUtcString(dt, "YYYYMMDD-hh:mm:ss");
106  if (sh->dateTime==NULL) {
107  DBG_ERROR(GWEN_LOGDOMAIN, "Bad format of dateTime [%s]", dt);
108  GWEN_Tag16_free(subtag);
109  GWEN_SigHead_free(sh);
110  return NULL;
111  }
112  }
113  else {
114  DBG_ERROR(GWEN_LOGDOMAIN, "Data for dateTime too long (%d bytes)", subtagLen);
115  GWEN_Tag16_free(subtag);
116  GWEN_SigHead_free(sh);
117  return NULL;
118  }
119  break;
120 
121  case GWEN_SIGHEAD_TLV_SIGPROFILE:
122  if (sscanf(subtagPtr, "%d", &i)==1)
123  sh->signatureProfile=i;
124  break;
125 
126  case GWEN_SIGHEAD_TLV_SIGNUM:
127  if (sscanf(subtagPtr, "%d", &i)==1)
128  sh->signatureNumber=i;
129  break;
130 
131  default:
132  DBG_WARN(GWEN_LOGDOMAIN, "Unknown tag %02x", GWEN_Tag16_GetTagType(subtag));
133  }
134  }
135 
136  sp+=GWEN_Tag16_GetTagSize(subtag);
137  sl-=GWEN_Tag16_GetTagSize(subtag);
138  GWEN_Tag16_free(subtag);
139  } /* while */
140 
141  return sh;
142  }
143 }
144 
145 
146 
147 int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType) {
148  char numbuf[32];
149  uint32_t pos;
150  uint8_t *p;
151  uint32_t l;
152 
153  GWEN_Buffer_AppendByte(buf, tagType);
154  pos=GWEN_Buffer_GetPos(buf);
155  GWEN_Buffer_AppendByte(buf, 0);
156  GWEN_Buffer_AppendByte(buf, 0);
157 
158  if (sh->keyName)
159  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNAME, sh->keyName, -1, buf);
160 
161  snprintf(numbuf, sizeof(numbuf), "%d", sh->keyNumber);
162  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNUM, numbuf, -1, buf);
163 
164  snprintf(numbuf, sizeof(numbuf), "%d", sh->keyVersion);
165  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYVER, numbuf, -1, buf);
166  if (sh->dateTime) {
167  GWEN_BUFFER *tbuf;
168 
169  tbuf=GWEN_Buffer_new(0, 32, 0, 1);
170  GWEN_Time_toUtcString(sh->dateTime, "YYYYMMDD-hh:mm:ss", tbuf);
171  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_DATETIME,
172  GWEN_Buffer_GetStart(tbuf),
173  -1,
174  buf);
175  GWEN_Buffer_free(tbuf);
176  }
177 
178  snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureProfile);
179  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGPROFILE, numbuf, -1, buf);
180 
181  snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureNumber);
182  GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGNUM, numbuf, -1, buf);
183 
184  /* write size */
185  l=GWEN_Buffer_GetPos(buf)-pos-2;
186  p=(uint8_t*)GWEN_Buffer_GetStart(buf)+pos;
187  *(p++)=l & 0xff;
188  *p=(l>>8) & 0xff;
189 
190  return 0;
191 }
192 
193 
194 
195 const char *GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh) {
196  assert(sh);
197  return sh->keyName;
198 }
199 
200 
201 
202 void GWEN_SigHead_SetKeyName(GWEN_SIGHEAD *sh, const char *s) {
203  assert(sh);
204  free(sh->keyName);
205  if (s) sh->keyName=strdup(s);
206  else sh->keyName=NULL;
207 }
208 
209 
210 
212  assert(sh);
213  return sh->keyNumber;
214 }
215 
216 
217 
219  assert(sh);
220  sh->keyNumber=i;
221 }
222 
223 
224 
226  assert(sh);
227  return sh->keyVersion;
228 }
229 
230 
231 
233  assert(sh);
234  sh->keyVersion=i;
235 }
236 
237 
238 
240  assert(sh);
241  return sh->dateTime;
242 }
243 
244 
245 
247  assert(sh);
248  GWEN_Time_free(sh->dateTime);
249  if (ti) sh->dateTime=GWEN_Time_dup(ti);
250  else sh->dateTime=NULL;
251 }
252 
253 
254 
256  assert(sh);
257  return sh->signatureProfile;
258 }
259 
260 
261 
263  assert(sh);
264  sh->signatureProfile=i;
265 }
266 
267 
268 
270  assert(sh);
271  return sh->signatureNumber;
272 }
273 
274 
275 
277  assert(sh);
278  sh->signatureNumber=i;
279 }
280 
281 
282 
283 
284 
285 
286 
287 
288 
int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType)
Definition: sighead.c:147
struct GWEN_TIME GWEN_TIME
Definition: gwentime.h:43
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
void GWEN_SigHead_SetDateTime(GWEN_SIGHEAD *sh, const GWEN_TIME *ti)
Definition: sighead.c:246
const char * GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh)
Definition: sighead.c:195
GWENHYWFAR_API GWEN_TIME * GWEN_Time_dup(const GWEN_TIME *t)
Definition: gwentime_all.c:425
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:118
#define GWEN_LOGDOMAIN
Definition: logger.h:35
unsigned int GWEN_Tag16_GetTagSize(const GWEN_TAG16 *tlv)
Definition: tag16.c:68
const GWEN_TIME * GWEN_SigHead_GetDateTime(const GWEN_SIGHEAD *sh)
Definition: sighead.c:239
uint32_t GWEN_Buffer_GetPos(const GWEN_BUFFER *bf)
Definition: buffer.c:239
struct GWEN_TAG16 GWEN_TAG16
Definition: tag16.h:21
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
void GWEN_Tag16_DirectlyToBuffer(unsigned int tagType, const char *p, int size, GWEN_BUFFER *buf)
Definition: tag16.c:205
int GWEN_SigHead_GetKeyVersion(const GWEN_SIGHEAD *sh)
Definition: sighead.c:225
const void * GWEN_Tag16_GetTagData(const GWEN_TAG16 *tlv)
Definition: tag16.c:75
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
GWENHYWFAR_API int GWEN_Time_toUtcString(const GWEN_TIME *t, const char *tmpl, GWEN_BUFFER *buf)
Definition: gwentime_all.c:791
void GWEN_SigHead_SetKeyVersion(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:232
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
Definition: buffer.c:380
GWEN_SIGHEAD * GWEN_SigHead_fromBuffer(const uint8_t *p, uint32_t l)
Definition: sighead.c:52
void GWEN_SigHead_SetKeyName(GWEN_SIGHEAD *sh, const char *s)
Definition: sighead.c:202
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
GWENHYWFAR_API void GWEN_Time_free(GWEN_TIME *t)
Definition: gwentime_all.c:437
struct GWEN_SIGHEAD GWEN_SIGHEAD
Definition: sighead.h:23
unsigned int GWEN_Tag16_GetTagLength(const GWEN_TAG16 *tlv)
Definition: tag16.c:61
unsigned int GWEN_Tag16_GetTagType(const GWEN_TAG16 *tlv)
Definition: tag16.c:54
#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:331
int GWEN_SigHead_GetSignatureNumber(const GWEN_SIGHEAD *sh)
Definition: sighead.c:269
GWEN_SIGHEAD * GWEN_SigHead_new(void)
Definition: sighead.c:29
void GWEN_SigHead_SetKeyNumber(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:218
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
int GWEN_SigHead_GetSignatureProfile(const GWEN_SIGHEAD *sh)
Definition: sighead.c:255
#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:276
void GWEN_SigHead_free(GWEN_SIGHEAD *sh)
Definition: sighead.c:40
void GWEN_Tag16_free(GWEN_TAG16 *tlv)
Definition: tag16.c:43
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
void GWEN_SigHead_SetSignatureProfile(GWEN_SIGHEAD *sh, int i)
Definition: sighead.c:262
int GWEN_SigHead_GetKeyNumber(const GWEN_SIGHEAD *sh)
Definition: sighead.c:211
GWEN_TAG16 * GWEN_Tag16_fromBuffer2(const uint8_t *p, uint32_t l, int doCopy)
Definition: tag16.c:144