sighead.c

Go to the documentation of this file.
00001 /***************************************************************************
00002     begin       : Sun Nov 30 2008
00003     copyright   : (C) 2008 by Martin Preuss
00004     email       : martin@libchipcard.de
00005 
00006  ***************************************************************************
00007  *          Please see toplevel file COPYING for license details           *
00008  ***************************************************************************/
00009 
00010 
00011 #ifdef HAVE_CONFIG_H
00012 # include <config.h>
00013 #endif
00014 
00015 #define DISABLE_DEBUGLOG
00016 
00017 
00018 #include "sighead_p.h"
00019 #include "i18n_l.h"
00020 #include <gwenhywfar/misc.h>
00021 #include <gwenhywfar/debug.h>
00022 #include <gwenhywfar/tag16.h>
00023 
00024 
00025 GWEN_LIST_FUNCTIONS(GWEN_SIGHEAD, GWEN_SigHead)
00026 
00027 
00028 
00029 GWEN_SIGHEAD *GWEN_SigHead_new(void) {
00030   GWEN_SIGHEAD *sh;
00031 
00032   GWEN_NEW_OBJECT(GWEN_SIGHEAD, sh);
00033   GWEN_LIST_INIT(GWEN_SIGHEAD, sh);
00034 
00035   return sh;
00036 }
00037 
00038 
00039 
00040 void GWEN_SigHead_free(GWEN_SIGHEAD *sh) {
00041   if (sh) {
00042     GWEN_LIST_FINI(GWEN_SIGHEAD, sh);
00043     free(sh->keyName);
00044     GWEN_Time_free(sh->dateTime);
00045 
00046     GWEN_FREE_OBJECT(sh);
00047   }
00048 }
00049 
00050 
00051 
00052 GWEN_SIGHEAD *GWEN_SigHead_fromBuffer(const uint8_t *p, uint32_t l) {
00053   if (p==NULL || l<1) {
00054     DBG_INFO(GWEN_LOGDOMAIN, "Bad tag");
00055     return NULL;
00056   }
00057   else {
00058     GWEN_SIGHEAD *sh;
00059     const uint8_t *sp;
00060     uint32_t sl;
00061 
00062     sh=GWEN_SigHead_new();
00063     sp=p;
00064     sl=l;
00065     while(sl) {
00066       GWEN_TAG16 *subtag;
00067       uint32_t subtagLen;
00068       const char *subtagPtr;
00069       int i;
00070 
00071       subtag=GWEN_Tag16_fromBuffer2(sp, sl, 0);
00072       if (subtag==NULL) {
00073         DBG_INFO(GWEN_LOGDOMAIN, "Bad sub-tag");
00074         GWEN_SigHead_free(sh);
00075         return NULL;
00076       }
00077       subtagLen=GWEN_Tag16_GetTagLength(subtag);
00078       subtagPtr=(const char*)GWEN_Tag16_GetTagData(subtag);
00079 
00080       if (subtagLen && subtagPtr) {
00081         switch(GWEN_Tag16_GetTagType(subtag)) {
00082         case GWEN_SIGHEAD_TLV_KEYNAME:
00083           sh->keyName=(char*)malloc(subtagLen+1);
00084           memmove(sh->keyName, subtagPtr, subtagLen);
00085           sh->keyName[subtagLen]=0;
00086           break;
00087 
00088         case GWEN_SIGHEAD_TLV_KEYNUM:
00089           if (sscanf(subtagPtr, "%d", &i)==1)
00090             sh->keyNumber=i;
00091           break;
00092 
00093         case GWEN_SIGHEAD_TLV_KEYVER:
00094           if (sscanf(subtagPtr, "%d", &i)==1)
00095             sh->keyVersion=i;
00096           break;
00097 
00098         case GWEN_SIGHEAD_TLV_DATETIME:
00099           if (subtagLen<128) {
00100             char dt[128];
00101 
00102             dt[0]=0;
00103             strncpy(dt, (const char*) subtagPtr, sizeof(dt)-1);
00104             dt[sizeof(dt)-1]=0;
00105             sh->dateTime=GWEN_Time_fromUtcString(dt, "YYYYMMDD-hh:mm:ss");
00106             if (sh->dateTime==NULL) {
00107               DBG_ERROR(GWEN_LOGDOMAIN, "Bad format of dateTime [%s]", dt);
00108               GWEN_Tag16_free(subtag);
00109               GWEN_SigHead_free(sh);
00110               return NULL;
00111             }
00112           }
00113           else {
00114             DBG_ERROR(GWEN_LOGDOMAIN, "Data for dateTime too long (%d bytes)", subtagLen);
00115             GWEN_Tag16_free(subtag);
00116             GWEN_SigHead_free(sh);
00117             return NULL;
00118           }
00119           break;
00120 
00121         case GWEN_SIGHEAD_TLV_SIGPROFILE:
00122           if (sscanf(subtagPtr, "%d", &i)==1)
00123             sh->signatureProfile=i;
00124           break;
00125 
00126         case GWEN_SIGHEAD_TLV_SIGNUM:
00127           if (sscanf(subtagPtr, "%d", &i)==1)
00128             sh->signatureNumber=i;
00129           break;
00130 
00131         default:
00132           DBG_WARN(GWEN_LOGDOMAIN, "Unknown tag %02x", GWEN_Tag16_GetTagType(subtag));
00133         }
00134       }
00135 
00136       sp+=GWEN_Tag16_GetTagSize(subtag);
00137       sl-=GWEN_Tag16_GetTagSize(subtag);
00138       GWEN_Tag16_free(subtag);
00139     } /* while */
00140 
00141     return sh;
00142   }
00143 }
00144 
00145 
00146 
00147 int GWEN_SigHead_toBuffer(const GWEN_SIGHEAD *sh, GWEN_BUFFER *buf, uint8_t tagType) {
00148   char numbuf[32];
00149   uint32_t pos;
00150   uint8_t *p;
00151   uint32_t l;
00152 
00153   GWEN_Buffer_AppendByte(buf, tagType);
00154   pos=GWEN_Buffer_GetPos(buf);
00155   GWEN_Buffer_AppendByte(buf, 0);
00156   GWEN_Buffer_AppendByte(buf, 0);
00157 
00158   if (sh->keyName)
00159     GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNAME, sh->keyName, -1, buf);
00160 
00161   snprintf(numbuf, sizeof(numbuf), "%d", sh->keyNumber);
00162   GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYNUM, numbuf, -1, buf);
00163 
00164   snprintf(numbuf, sizeof(numbuf), "%d", sh->keyVersion);
00165   GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_KEYVER, numbuf, -1, buf);
00166   if (sh->dateTime) {
00167     GWEN_BUFFER *tbuf;
00168 
00169     tbuf=GWEN_Buffer_new(0, 32, 0, 1);
00170     GWEN_Time_toUtcString(sh->dateTime, "YYYYMMDD-hh:mm:ss", tbuf);
00171     GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_DATETIME,
00172                                 GWEN_Buffer_GetStart(tbuf),
00173                                 -1,
00174                                 buf);
00175     GWEN_Buffer_free(tbuf);
00176   }
00177 
00178   snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureProfile);
00179   GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGPROFILE, numbuf, -1, buf);
00180 
00181   snprintf(numbuf, sizeof(numbuf), "%d", sh->signatureNumber);
00182   GWEN_Tag16_DirectlyToBuffer(GWEN_SIGHEAD_TLV_SIGNUM, numbuf, -1, buf);
00183 
00184   /* write size */
00185   l=GWEN_Buffer_GetPos(buf)-pos-2;
00186   p=(uint8_t*)GWEN_Buffer_GetStart(buf)+pos;
00187   *(p++)=l & 0xff;
00188   *p=(l>>8) & 0xff;
00189 
00190   return 0;
00191 }
00192 
00193 
00194 
00195 const char *GWEN_SigHead_GetKeyName(const GWEN_SIGHEAD *sh) {
00196   assert(sh);
00197   return sh->keyName;
00198 }
00199 
00200 
00201 
00202 void GWEN_SigHead_SetKeyName(GWEN_SIGHEAD *sh, const char *s) {
00203   assert(sh);
00204   free(sh->keyName);
00205   if (s) sh->keyName=strdup(s);
00206   else sh->keyName=NULL;
00207 }
00208 
00209 
00210 
00211 int GWEN_SigHead_GetKeyNumber(const GWEN_SIGHEAD *sh) {
00212   assert(sh);
00213   return sh->keyNumber;
00214 }
00215 
00216 
00217 
00218 void GWEN_SigHead_SetKeyNumber(GWEN_SIGHEAD *sh, int i) {
00219   assert(sh);
00220   sh->keyNumber=i;
00221 }
00222 
00223 
00224 
00225 int GWEN_SigHead_GetKeyVersion(const GWEN_SIGHEAD *sh) {
00226   assert(sh);
00227   return sh->keyVersion;
00228 }
00229 
00230 
00231 
00232 void GWEN_SigHead_SetKeyVersion(GWEN_SIGHEAD *sh, int i) {
00233   assert(sh);
00234   sh->keyVersion=i;
00235 }
00236 
00237 
00238 
00239 const GWEN_TIME *GWEN_SigHead_GetDateTime(const GWEN_SIGHEAD *sh) {
00240   assert(sh);
00241   return sh->dateTime;
00242 }
00243 
00244 
00245 
00246 void GWEN_SigHead_SetDateTime(GWEN_SIGHEAD *sh, const GWEN_TIME *ti) {
00247   assert(sh);
00248   GWEN_Time_free(sh->dateTime);
00249   if (ti) sh->dateTime=GWEN_Time_dup(ti);
00250   else sh->dateTime=NULL;
00251 }
00252 
00253 
00254 
00255 int GWEN_SigHead_GetSignatureProfile(const GWEN_SIGHEAD *sh) {
00256   assert(sh);
00257   return sh->signatureProfile;
00258 }
00259 
00260 
00261 
00262 void GWEN_SigHead_SetSignatureProfile(GWEN_SIGHEAD *sh, int i) {
00263   assert(sh);
00264   sh->signatureProfile=i;
00265 }
00266 
00267 
00268 
00269 int GWEN_SigHead_GetSignatureNumber(const GWEN_SIGHEAD *sh) {
00270   assert(sh);
00271   return sh->signatureNumber;
00272 }
00273 
00274 
00275 
00276 void GWEN_SigHead_SetSignatureNumber(GWEN_SIGHEAD *sh, int i) {
00277   assert(sh);
00278   sh->signatureNumber=i;
00279 }
00280 
00281 
00282 
00283 
00284 
00285 
00286 
00287 
00288