md5pickle.c 716 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include "os.h"
  2. #include <libsec.h>
  3. char*
  4. md5pickle(MD5state *s)
  5. {
  6. char *p;
  7. int m, n;
  8. m = 17+4*9+4*((s->blen+3)/3 + 1);
  9. p = malloc(m);
  10. if(p == nil)
  11. return p;
  12. n = sprint(p, "%16.16llux %8.8ux %8.8ux %8.8ux %8.8ux ",
  13. s->len,
  14. s->state[0], s->state[1], s->state[2],
  15. s->state[3]);
  16. enc64(p+n, m-n, s->buf, s->blen);
  17. return p;
  18. }
  19. MD5state*
  20. md5unpickle(char *p)
  21. {
  22. MD5state *s;
  23. s = malloc(sizeof(*s));
  24. if(s == nil)
  25. return nil;
  26. s->len = strtoull(p, &p, 16);
  27. s->state[0] = strtoul(p, &p, 16);
  28. s->state[1] = strtoul(p, &p, 16);
  29. s->state[2] = strtoul(p, &p, 16);
  30. s->state[3] = strtoul(p, &p, 16);
  31. s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p));
  32. s->malloced = 1;
  33. s->seeded = 1;
  34. return s;
  35. }