gwenhywfar  4.8.0beta
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