void vtSha1(uchar sha1[VtScoreSize], uchar *p, int n) { VtSha1 s; vtSha1Init(&s); vtSha1Update(&s, p, n); vtSha1Final(&s, sha1); }
/* hold z->inLock */ static int vtVersionRead(VtSession *z, char *prefix, int *ret) { char c; char buf[VtMaxStringSize]; char *q, *p, *pp; int i; q = prefix; p = buf; for(;;) { if(p >= buf + sizeof(buf)) { vtSetError(EBadVersion); return 0; } if(!vtFdReadFully(z->fd, (uint8_t*)&c, 1)) return 0; if(z->inHash) vtSha1Update(z->inHash, (uint8_t*)&c, 1); if(c == '\n') { *p = 0; break; } if(c < ' ' || *q && c != *q) { vtSetError(EBadVersion); return 0; } *p++ = c; if(*q) q++; } vtDebug(z, "version string in: %s\n", buf); p = buf + strlen(prefix); for(;;) { for(pp=p; *pp && *pp != ':' && *pp != '-'; pp++) ; for(i=0; vtVersions[i].version; i++) { if(strlen(vtVersions[i].s) != pp-p) continue; if(memcmp(vtVersions[i].s, p, pp-p) == 0) { *ret = vtVersions[i].version; return 1; } } p = pp; if(*p != ':') return 0; p++; } }
int vtSha1Check(uchar score[VtScoreSize], uchar *p, int n) { VtSha1 s; uchar score2[VtScoreSize]; vtSha1Init(&s); vtSha1Update(&s, p, n); vtSha1Final(&s, score2); if(memcmp(score, score2, VtScoreSize) != 0) { vtSetError("vtSha1Check failed"); return 0; } return 1; }
void packetSha1(Packet *p, uint8_t sha1[VtScoreSize]) { Frag *f; VtSha1 *s; int size; NOTFREE(p); s = vtSha1Alloc(); size = p->size; for(f=p->first; f; f=f->next) { vtSha1Update(s, f->rp, FRAGSIZE(f)); size -= FRAGSIZE(f); } assert(size == 0); vtSha1Final(s, sha1); vtSha1Free(s); }
int vtConnect(VtSession *z, char *password) { char buf[VtMaxStringSize], *p, *ep, *prefix; int i; USED(password); vtLock(z->lk); if(z->cstate != VtStateAlloc) { vtSetError("bad session state"); vtUnlock(z->lk); return 0; } if(z->fd < 0){ vtSetError("%s", z->fderror); vtUnlock(z->lk); return 0; } /* be a little anal */ vtLock(z->inLock); vtLock(z->outLock); prefix = "venti-"; p = buf; ep = buf + sizeof(buf); p = seprint(p, ep, "%s", prefix); p += strlen(p); for(i=0; vtVersions[i].version; i++) { if(i != 0) *p++ = ':'; p = seprint(p, ep, "%s", vtVersions[i].s); } p = seprint(p, ep, "-libventi\n"); assert(p-buf < sizeof(buf)); if(z->outHash) vtSha1Update(z->outHash, (uint8_t*)buf, p-buf); if(!vtFdWrite(z->fd, (uint8_t*)buf, p-buf)) goto Err; vtDebug(z, "version string out: %s", buf); if(!vtVersionRead(z, prefix, &z->version)) goto Err; vtDebug(z, "version = %d: %s\n", z->version, vtGetVersion(z)); vtUnlock(z->inLock); vtUnlock(z->outLock); z->cstate = VtStateConnected; vtUnlock(z->lk); if(z->vtbl) return 1; if(!vtHello(z)) goto Err; return 1; Err: if(z->fd >= 0) vtFdClose(z->fd); z->fd = -1; vtUnlock(z->inLock); vtUnlock(z->outLock); z->cstate = VtStateClosed; vtUnlock(z->lk); return 0; }