xref: /plan9/sys/src/libsec/port/md5pickle.c (revision a0ef1dc2bd0dba373388273fbb5e5c41fb31c71b)
19a747e4fSDavid du Colombier #include "os.h"
29a747e4fSDavid du Colombier #include <libsec.h>
39a747e4fSDavid du Colombier 
49a747e4fSDavid du Colombier char*
md5pickle(MD5state * s)59a747e4fSDavid du Colombier md5pickle(MD5state *s)
69a747e4fSDavid du Colombier {
79a747e4fSDavid du Colombier 	char *p;
89a747e4fSDavid du Colombier 	int m, n;
99a747e4fSDavid du Colombier 
10e0d6d19cSDavid du Colombier 	m = 17+4*9+4*((s->blen+3)/3 + 1);
119a747e4fSDavid du Colombier 	p = malloc(m);
129a747e4fSDavid du Colombier 	if(p == nil)
139a747e4fSDavid du Colombier 		return p;
14*a0ef1dc2SDavid du Colombier 	n = sprint(p, "%16.16llux %8.8ux %8.8ux %8.8ux %8.8ux ",
15e0d6d19cSDavid du Colombier 		s->len,
169a747e4fSDavid du Colombier 		s->state[0], s->state[1], s->state[2],
179a747e4fSDavid du Colombier 		s->state[3]);
189a747e4fSDavid du Colombier 	enc64(p+n, m-n, s->buf, s->blen);
199a747e4fSDavid du Colombier 	return p;
209a747e4fSDavid du Colombier }
219a747e4fSDavid du Colombier 
229a747e4fSDavid du Colombier MD5state*
md5unpickle(char * p)239a747e4fSDavid du Colombier md5unpickle(char *p)
249a747e4fSDavid du Colombier {
259a747e4fSDavid du Colombier 	MD5state *s;
269a747e4fSDavid du Colombier 
279a747e4fSDavid du Colombier 	s = malloc(sizeof(*s));
289a747e4fSDavid du Colombier 	if(s == nil)
299a747e4fSDavid du Colombier 		return nil;
30e0d6d19cSDavid du Colombier 	s->len = strtoull(p, &p, 16);
319a747e4fSDavid du Colombier 	s->state[0] = strtoul(p, &p, 16);
329a747e4fSDavid du Colombier 	s->state[1] = strtoul(p, &p, 16);
339a747e4fSDavid du Colombier 	s->state[2] = strtoul(p, &p, 16);
349a747e4fSDavid du Colombier 	s->state[3] = strtoul(p, &p, 16);
359a747e4fSDavid du Colombier 	s->blen = dec64(s->buf, sizeof(s->buf), p, strlen(p));
369a747e4fSDavid du Colombier 	s->malloced = 1;
379a747e4fSDavid du Colombier 	s->seeded = 1;
389a747e4fSDavid du Colombier 	return s;
399a747e4fSDavid du Colombier }
40