gwenhywfar 4.0.3
|
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() { 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