00001
00002
00003
00004
00005
00006
00007
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 }
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
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