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