CHDK_DE Vorschauversion  Trunk Rev. 6014
 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Aufzählungen Aufzählungswerte Makrodefinitionen
pakwif.c-Dateireferenz
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
+ Include-Abhängigkeitsdiagramm für pakwif.c:

gehe zum Quellcode dieser Datei

Datenstrukturen

struct  __attribute__
 
struct  pak_t
 

Makrodefinitionen

#define CRYPT1_SIZE   512
 
#define CRYPT2_SIZE   513
 
#define HEADER_SIZE   (sizeof(header_t)/sizeof(char))
 
#define BLKSIZE   0x1000
 

Typdefinitionen

typedef unsigned short uint16
 

Funktionen

int crypt_fwrite (void *buf, int len, FILE *f)
 
int crypt_fread (void *buf, int len, FILE *f)
 
pak_tpak_create (char *filename)
 
uint32_t checksumm_init ()
 
uint32_t checksumm_update (uint32_t cs, char *buf, int len)
 
int pak_add_file (pak_t *p, char *type, char *desc, char *infirname, char *filename, uint32_t baseaddr)
 
int pak_add_4byteid (pak_t *p, char *desc, char *name, uint32_t id)
 
void pak_close (pak_t *p)
 
int usage ()
 
int main (int argc, char **argv)
 

Variablen

unsigned char crypt1 [512]
 
unsigned char crypt2 [513]
 

Makro-Dokumentation

#define BLKSIZE   0x1000

Definiert in Zeile 296 der Datei pakwif.c.

#define CRYPT1_SIZE   512

Definiert in Zeile 151 der Datei pakwif.c.

#define CRYPT2_SIZE   513

Definiert in Zeile 152 der Datei pakwif.c.

#define HEADER_SIZE   (sizeof(header_t)/sizeof(char))

Definiert in Zeile 154 der Datei pakwif.c.

Dokumentation der benutzerdefinierten Typen

typedef unsigned short uint16

Definiert in Zeile 15 der Datei pakwif.c.

Dokumentation der Funktionen

uint32_t checksumm_init ( )

Definiert in Zeile 278 der Datei pakwif.c.

279 {
280  return 0;
281 }
uint32_t checksumm_update ( uint32_t  cs,
char *  buf,
int  len 
)

Definiert in Zeile 284 der Datei pakwif.c.

285 {
286  int i;
287 
288  for (i=0;i<len/2;i++)
289  cs+=((unsigned short*)buf)[i];
290  if (len&1)
291  cs+=buf[len-1];
292 
293  return cs;
294 }
int crypt_fread ( void *  buf,
int  len,
FILE f 
)

Definiert in Zeile 192 der Datei pakwif.c.

193 {
194  unsigned char cbuf[1024];
195  int r, rtot, start, towr, i, c1, c2;
196 
197  start = ftell(f);
198  rtot = 0;
199 
200  c1 = start % CRYPT1_SIZE;
201  c2 = start % CRYPT2_SIZE;
202 
203  if (len>1024)
204  towr = 1024;
205  else
206  towr = len;
207  r = fread(cbuf,1,towr,f);
208 
209  while (len>0 && r>0){
210  for (i=0;i<r;i++){
211  ((unsigned char*)buf)[i+rtot] = ((unsigned char*)cbuf)[i] ^ crypt1[c1++] ^ crypt2[c2++];
212 
213  if (c1 >= CRYPT1_SIZE)
214  c1 = 0;
215  if (c2 >= CRYPT2_SIZE)
216  c2 = 0;
217  }
218 
219  rtot += r;
220  len -= r;
221 
222  if (len>1024)
223  towr = 1024;
224  else
225  towr = len;
226  r = fread(cbuf,1,towr,f);
227  if (r<0)
228  return r;
229  }
230 
231  return rtot;
232 }
int crypt_fwrite ( void *  buf,
int  len,
FILE f 
)

Definiert in Zeile 156 der Datei pakwif.c.

157 {
158  unsigned char cbuf[1024];
159  int r, rtot, start, towr, i, c1, c2;
160 
161  start = ftell(f);
162  rtot = 0;
163 
164  c1 = start % CRYPT1_SIZE;
165  c2 = start % CRYPT2_SIZE;
166 
167  while (len>0){
168  if (len>1024)
169  towr = 1024;
170  else
171  towr = len;
172 
173  for (i=0;i<towr;i++){
174  cbuf[i] = ((unsigned char*)buf)[i+rtot] ^ crypt1[c1++] ^ crypt2[c2++];
175 
176  if (c1 >= CRYPT1_SIZE)
177  c1 = 0;
178  if (c2 >= CRYPT2_SIZE)
179  c2 = 0;
180  }
181 
182  r = fwrite(cbuf,1,towr,f);
183  if (r<0)
184  return r;
185  rtot += r;
186  len -= r;
187  }
188 
189  return rtot;
190 }
int main ( int  argc,
char **  argv 
)

Definiert in Zeile 403 der Datei pakwif.c.

404 {
405  char cbuf[100];
406  pak_t *p;
407  char *fir_fn;
408  char *wif_fn;
409  int camid, ver;
410 
411 
412  if (argc < 4){
413  usage();
414  }
415 
416  fir_fn = argv[1];
417  wif_fn = argv[2];
418  camid = strtoul(argv[3], NULL, 0);
419 
420  if (argc == 5){
421  ver = strtoul(argv[4], NULL, 0);
422  } else {
423  ver = 0x01000100;
424  }
425 
426  printf("Building FIR for camera %04X ver %08X\n", camid, ver);
427 
428  p = pak_create(fir_fn);
429 
430  sprintf(cbuf, "0x%08X", ver);
431  pak_add_4byteid(p,"VersionID", cbuf, ver);
432  pak_add_4byteid(p,"VersionCheck", "0(no)", 0);
433  pak_add_4byteid(p,"CipherToLog", "1(yes)", 1);
434 
435  pak_add_file(p,"PROGRAM", "Program", "WriterInFIR.bin", wif_fn, 0xffffffff);
436 // pak_add_file(p,"UPGRADEPROGRAM", "New", "PRIMARY.BIN", 0);
437 // pak_add_file(p,"UPGRADEPROPERTY", "Faexe.bin", "Faexe.bin", 0xffbc0000);
438 // pak_add_file(p,"UPGRADEPROPERTY", "ImgTbl.bin", "ImgTbl.bin", 0xffbe0000);
439 // pak_add_file(p,"UPGRADEPROPERTY", "UIRes.bin", "UIRes.bin", 0xffd80000);
440 // pak_add_file(p,"UPGRADEPROPERTY", "UsrSet.BIN", "UsrSet.BIN", 0xff800000);
441 
442  pak_add_4byteid(p,"ModelID", "0x01660000", 0x01660000);
443 
444  sprintf(cbuf, "0x%04X", camid);
445  pak_add_4byteid(p,"ProductID", cbuf, camid);
446 
447  pak_close(p);
448  return 0;
449 }
int pak_add_4byteid ( pak_t p,
char *  desc,
char *  name,
uint32_t  id 
)

Definiert in Zeile 354 der Datei pakwif.c.

356 {
357  header_t h;
358 
359  memset(&h, 0, HEADER_SIZE);
360  strcpy(h.type, "4BYTEID");
361  strcpy(h.description, desc);
362  strcpy(h.name, name);
363  h.length = 4;
364  h.checksumm = 0;
365 
366  crypt_fwrite(&h,HEADER_SIZE,p->f);
367  crypt_fwrite(&id,4,p->f);
368 
369  return 0;
370 }
int pak_add_file ( pak_t p,
char *  type,
char *  desc,
char *  infirname,
char *  filename,
uint32_t  baseaddr 
)

Definiert in Zeile 297 der Datei pakwif.c.

299 {
300  char fnbuff[100];
301  char buff[BLKSIZE];
302  header_t h;
303  FILE *inf;
304  char *fnp;
305  long filelen;
306  int bcnt;
307 
308  inf = fopen(filename, "r+b");
309  if (inf == NULL){
310  return -1;
311  }
312 
313  memset(&h, 0, HEADER_SIZE);
314 
315  fseek(inf, 0, SEEK_END);
316  filelen = ftell(inf);
317  fseek(inf, 0, SEEK_SET);
318 
319  fnp = strrchr(infirname, '/');
320  if (fnp != NULL){
321  strncpy(fnbuff, fnp+1, 31);
322  } else
323  strncpy(fnbuff, infirname, 31);
324  fnbuff[31] = 0;
325 
326  fseek(p->f, HEADER_SIZE, SEEK_CUR);
327  h.checksumm = checksumm_init();
328 
329  /* write data */
330  bcnt = fread(buff, 1, BLKSIZE, inf);
331  while (bcnt>0){
332  h.checksumm = checksumm_update(h.checksumm, buff, bcnt);
333  crypt_fwrite(buff, bcnt, p->f);
334  bcnt = fread(buff, 1, BLKSIZE, inf);
335  }
336 
337  /* write header */
338  fseek(p->f, -filelen-HEADER_SIZE, SEEK_CUR);
339 
340  strcpy(h.type, type);
341  strcpy(h.description, desc);
342  strcpy(h.name, fnbuff);
343 
344  h.length = filelen;
345  h.checksumm = (baseaddr==0xffffffff)?h.checksumm:baseaddr;
346  crypt_fwrite(&h,HEADER_SIZE,p->f);
347  fseek(p->f, filelen, SEEK_CUR);
348 
349 
350  fclose(inf);
351  return 0;
352 }
void pak_close ( pak_t p)

Definiert in Zeile 372 der Datei pakwif.c.

373 {
374  char buff[BLKSIZE];
375  uint32_t len;
376  uint32_t cs;
377  int bcnt;
378 
379  len = ftell(p->f);
380  cs = checksumm_init();
381  fseek(p->f, HEADER_SIZE, SEEK_SET);
382 
383  bcnt = crypt_fread(buff, BLKSIZE, p->f);
384  while (bcnt>0){
385  cs = checksumm_update(cs, buff, bcnt);
386  bcnt = crypt_fread(buff, BLKSIZE, p->f);
387  }
388 
389  fseek(p->f, 32*3, SEEK_SET);
390  crypt_fwrite(&len, 4, p->f);
391  crypt_fwrite(&cs, 4, p->f);
392 
393  fclose(p->f);
394  free(p);
395 }
pak_t* pak_create ( char *  filename)

Definiert in Zeile 240 der Datei pakwif.c.

241 {
242  char fnbuff[100];
243  char *fnp;
244  FILE *f;
245  pak_t *p;
246  header_t h;
247 
248  f = fopen(filename, "w+b");
249  if(f == NULL){
250  return NULL;
251  }
252 
253  p = malloc(sizeof(pak_t));
254  p->f = f;
255 
256  fnp = strrchr(filename, '/');
257  if (fnp != NULL){
258  strncpy(fnbuff, fnp+1, 31);
259  } else
260  strncpy(fnbuff, filename, 31);
261  fnbuff[31] = 0;
262 
263 
264  memset(&h, 0, HEADER_SIZE);
265 
266  strcpy(h.type, "HEADER");
267  strcpy(h.description, "UpgradeFirmSignature");
268  strcpy(h.name, fnbuff);
269 
270  h.length = -1;
271  h.checksumm = -1;
272 
274 
275  return p;
276 }
int usage ( void  )

Definiert in Zeile 397 der Datei pakwif.c.

398 {
399  printf("pakfir <out_fir_file> <in_wif_file> <camera_id> [version]\n");
400  exit(1);
401 }

Variablen-Dokumentation

unsigned char crypt1[512]

Definiert in Zeile 17 der Datei pakwif.c.

unsigned char crypt2[513]

Definiert in Zeile 84 der Datei pakwif.c.