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