static int descipher(Espcb *ecb, uint8_t *p, int n) { DESstate *ds = ecb->espstate; if(ecb->incoming) { memmove(ds->ivec, p, Desblk); desCBCdecrypt(p + Desblk, n - Desblk, ds); } else { memmove(p, ds->ivec, Desblk); desCBCencrypt(p + Desblk, n - Desblk, ds); } return 1; }
int convert(char **db, int len) { int i, nu, keydblen, keydboff, keydbaes; char *p = *db; keydblen = KEYDBLEN; keydboff = KEYDBOFF; keydbaes = len > 24 && memcmp(p, "AES KEYS", 8) == 0; if(keydbaes) { keydblen += AESKEYLEN; keydboff = 8+16; /* signature[8] + iv[16] */ } len -= keydboff; if(len % keydblen) { fprint(2, "%s: file odd length; not converting %d bytes\n", argv0, len % keydblen); len -= len % keydblen; } len += keydboff; if(keydbaes) { AESstate s; /* make sure we have aes key for decryption */ if(memcmp(okey.aes, zeros, AESKEYLEN) == 0) { fprint(2, "%s: no aes key in NVRAM\n", argv0); exits("no aes key"); } setupAESstate(&s, okey.aes, AESKEYLEN, zeros); aesCBCdecrypt((uchar*)p+8, len-8, &s); } else { DESstate s; uchar k[8]; des56to64((uchar*)okey.des, k); setupDESstate(&s, k, zeros); desCBCdecrypt((uchar*)p, len, &s); } nu = 0; for(i = keydboff; i < len; i += keydblen) { if (badname(&p[i])) { fprint(2, "%s: bad name %.30s... - aborting\n", argv0, &p[i]); exits("bad name"); } nu++; } if(verb) { for(i = keydboff; i < len; i += keydblen) print("%s\n", &p[i]); exits(nil); } if(convaes && !keydbaes) { char *s, *d; keydboff = 8+16; keydblen += AESKEYLEN; len = keydboff + keydblen*nu; p = realloc(p, len); if(p == nil) error("out of memory"); *db = p; s = p + KEYDBOFF + nu*KEYDBLEN; d = p + keydboff + nu*keydblen; for(i=0; i<nu; i++) { s -= KEYDBLEN; d -= keydblen; memmove(d, s, KEYDBLEN); memset(d + KEYDBLEN, 0, keydblen-KEYDBLEN); } keydbaes = 1; } genrandom((uchar*)p, keydboff); if(keydbaes) { AESstate s; memmove(p, "AES KEYS", 8); setupAESstate(&s, nkey.aes, AESKEYLEN, zeros); aesCBCencrypt((uchar*)p+8, len-8, &s); } else { DESstate s; uchar k[8]; des56to64((uchar*)nkey.des, k); setupDESstate(&s, k, zeros); desCBCencrypt((uchar*)p, len, &s); } return len; }