// Use packed bootstrapping, so we can bootstrap all in just one go. void packedRecrypt(const CtPtrs& cPtrs, const std::vector<zzX>& unpackConsts, const EncryptedArray& ea) { FHEPubKey& pKey = (FHEPubKey&)cPtrs[0]->getPubKey(); // Allocate temporary ciphertexts for the recryption int nPacked = divc(cPtrs.size(), ea.getDegree()); // ceil(totoalNum/d) std::vector<Ctxt> cts(nPacked, Ctxt(pKey)); repack(CtPtrs_vectorCt(cts), cPtrs, ea); // pack ciphertexts // cout << "@"<< lsize(cts)<<std::flush; for (Ctxt& c: cts) { // then recrypt them c.reducePtxtSpace(2); // we only have recryption data for binary ctxt #ifdef DEBUG_PRINTOUT ZZX ptxt; decryptAndPrint((cout<<" before recryption "), c, *dbgKey, *dbgEa); dbgKey->Decrypt(ptxt, c); c.DummyEncrypt(ptxt); decryptAndPrint((cout<<" after recryption "), c, *dbgKey, *dbgEa); #else pKey.reCrypt(c); #endif } unpack(cPtrs, CtPtrs_vectorCt(cts), ea, unpackConsts); }
int wmain(int argc, wchar_t** argv) { if (argc != 2) { wprintf_s(L"ykc <input>\n pack if input is directory;\n unpack if input is file.\n"); return 1; } if (fs::is_directory(argv[1])) { return repack(argv[1]); } else { return unpack(argv[1]); } }
static void encap_frame(struct sbsh_softc *sc, struct mbuf *m_head) { struct mbuf *m; u_int32_t cur_tbd; int done; look_for_nonzero: for (m = m_head; !m->m_len; m = m->m_next) ; cur_tbd = sc->regs->LTDR & 0x7f; done = 0; do { if (m->m_len < 5 || cur_tbd == ((sc->head_tdesc - 1) & 0x7f)) { if ((m_head = repack(sc, m_head)) != NULL) goto look_for_nonzero; else return; } sc->tbd[cur_tbd].address = vtophys(mtod(m, vm_offset_t)); sc->tbd[cur_tbd].length = m->m_len; do { m = m->m_next; } while (m && !m->m_len); if (!m) { /* last fragment has been reached */ sc->tbd[cur_tbd].length |= LAST_FRAG; done = 1; } ++cur_tbd; cur_tbd &= 0x7f; } while (!done); sc->xq[sc->tail_xq++] = m_head; sc->tail_xq &= (XQLEN - 1); sc->regs->LTDR = cur_tbd; ++sc->in_stats.sent_pkts; IFNET_STAT_INC(&sc->arpcom.ac_if, opackets, 1); }
int main(int argc, char *argv[]) { printf("MagiskBoot v" xstr(MAGISK_VERSION) "(" xstr(MAGISK_VER_CODE) ") (by topjohnwu) - Boot Image Modification Tool\n\n"); if (argc > 1 && strcmp(argv[1], "--cleanup") == 0) { cleanup(); } else if (argc > 2 && strcmp(argv[1], "--sha1") == 0) { char sha1[21], *buf; size_t size; mmap_ro(argv[2], (unsigned char **) &buf, &size); SHA1(sha1, buf, size); for (int i = 0; i < 20; ++i) printf("%02x", sha1[i]); printf("\n"); munmap(buf, size); } else if (argc > 2 && strcmp(argv[1], "--unpack") == 0) { unpack(argv[2]); } else if (argc > 2 && strcmp(argv[1], "--repack") == 0) { repack(argv[2], argc > 3 ? argv[3] : NEW_BOOT); } else if (argc > 2 && strcmp(argv[1], "--decompress") == 0) { decomp_file(argv[2], argc > 3 ? argv[3] : NULL); } else if (argc > 2 && strncmp(argv[1], "--compress", 10) == 0) { char *method; method = strchr(argv[1], '='); if (method == NULL) method = "gzip"; else method++; comp_file(method, argv[2], argc > 3 ? argv[3] : NULL); } else if (argc > 4 && strcmp(argv[1], "--hexpatch") == 0) { hexpatch(argv[2], argv[3], argv[4]); } else if (argc > 2 && strncmp(argv[1], "--cpio", 6) == 0) { char *command; command = strchr(argv[1] + 2, '-'); if (command == NULL) usage(argv[0]); else ++command; if (cpio_commands(command, argc - 2, argv + 2)) usage(argv[0]); } else { usage(argv[0]); } return 0; }
void connthread(void *arg) { int i, fd; Conn *c; Hash *h, *hnext; Msg *m, *om, *mm, sync; Fid *f; Ioproc *io; c = arg; threadsetname("conn %s", c->dir); io = ioproc(); fd = ioaccept(io, c->fd, c->dir); if(fd < 0){ if(verbose) fprint(2, "%T accept %s: %r\n", c->dir); goto out; } close(c->fd); c->fd = fd; threadcreate(connoutthread, c, STACK); while((m = mread9p(io, c->fd)) != nil){ if(verbose > 1) fprint(2, "%T fd#%d -> %F\n", c->fd, &m->tx); m->c = c; m->ctag = m->tx.tag; c->nmsg++; if(verbose > 1) fprint(2, "%T fd#%d: new msg %p\n", c->fd, m); if(puthash(c->tag, m->tx.tag, m) < 0){ err(m, "duplicate tag"); continue; } msgincref(m); switch(m->tx.type){ case Tversion: m->rx.tag = m->tx.tag; m->rx.msize = m->tx.msize; if(m->rx.msize > msize) m->rx.msize = msize; m->rx.version = "9P2000"; m->rx.type = Rversion; send9pmsg(m); continue; case Tflush: if((m->oldm = gethash(c->tag, m->tx.oldtag)) == nil){ m->rx.tag = m->tx.tag; m->rx.type = Rflush; send9pmsg(m); continue; } msgincref(m->oldm); break; case Tattach: m->afid = nil; if(m->tx.afid != NOFID && (m->afid = gethash(c->fid, m->tx.afid)) == nil){ err(m, "unknown fid"); continue; } if(m->afid) m->afid->ref++; m->fid = fidnew(m->tx.fid); if(puthash(c->fid, m->tx.fid, m->fid) < 0){ err(m, "duplicate fid"); continue; } m->fid->ref++; if(attached && m->afid==nil){ if(m->tx.aname[0] && strcmp(xaname, m->tx.aname) != 0){ err(m, "invalid attach name"); continue; } m->tx.afid = xafid; m->tx.aname = xaname; m->tx.uname = getuser(); /* what srv.c used */ repack(&m->tx, &m->tpkt); } break; case Twalk: if((m->fid = gethash(c->fid, m->tx.fid)) == nil){ err(m, "unknown fid"); continue; } m->fid->ref++; if(m->tx.newfid == m->tx.fid){ m->fid->ref++; m->newfid = m->fid; }else{ m->newfid = fidnew(m->tx.newfid); if(puthash(c->fid, m->tx.newfid, m->newfid) < 0){ err(m, "duplicate fid"); continue; } m->newfid->ref++; } break; case Tauth: if(attached){ err(m, "authentication not required"); continue; } if(noauth){ err(m, "authentication rejected"); continue; } m->afid = fidnew(m->tx.afid); if(puthash(c->fid, m->tx.afid, m->afid) < 0){ err(m, "duplicate fid"); continue; } m->afid->ref++; break; case Tcreate: if(m->tx.perm&(DMSYMLINK|DMDEVICE|DMNAMEDPIPE|DMSOCKET)){ err(m, "unsupported file type"); continue; } goto caseTopen; case Topenfd: if(m->tx.mode&~(OTRUNC|3)){ err(m, "bad openfd mode"); continue; } m->isopenfd = 1; m->tx.type = Topen; m->tpkt[4] = Topen; /* fall through */ caseTopen: case Topen: case Tclunk: case Tread: case Twrite: case Tremove: case Tstat: case Twstat: if((m->fid = gethash(c->fid, m->tx.fid)) == nil){ err(m, "unknown fid"); continue; } m->fid->ref++; break; } /* have everything - translate and send */ m->c = c; m->ctag = m->tx.tag; m->tx.tag = m->tag; if(m->fid) m->tx.fid = m->fid->fid; if(m->newfid) m->tx.newfid = m->newfid->fid; if(m->afid) m->tx.afid = m->afid->fid; if(m->oldm) m->tx.oldtag = m->oldm->tag; /* reference passes to outq */ sendq(outq, m); while(c->nmsg >= MAXMSG){ c->inputstalled = 1; recvp(c->inc); } } if(verbose) fprint(2, "%T fd#%d eof; flushing conn\n", c->fd); /* flush all outstanding messages */ for(i=0; i<NHASH; i++){ while((h = c->tag[i]) != nil){ om = h->v; msgincref(om); /* for us */ m = msgnew(0); m->internal = 1; m->c = c; c->nmsg++; m->tx.type = Tflush; m->tx.tag = m->tag; m->tx.oldtag = om->tag; m->oldm = om; msgincref(om); msgincref(m); /* for outq */ sendomsg(m); mm = recvp(c->internal); assert(mm == m); msgput(m); /* got from recvp */ msgput(m); /* got from msgnew */ if(delhash(c->tag, om->ctag, om) == 0) msgput(om); /* got from hash table */ msgput(om); /* got from msgincref */ } } /* * outputthread has written all its messages * to the remote connection (because we've gotten all the replies!), * but it might not have gotten a chance to msgput * the very last one. sync up to make sure. */ memset(&sync, 0, sizeof sync); sync.sync = 1; sync.c = c; sendq(outq, &sync); recvp(c->outqdead); /* everything is quiet; can close the local output queue. */ sendq(c->outq, nil); recvp(c->outqdead); /* should be no messages left anywhere. */ assert(c->nmsg == 0); /* clunk all outstanding fids */ for(i=0; i<NHASH; i++){ for(h=c->fid[i]; h; h=hnext){ f = h->v; m = msgnew(0); m->internal = 1; m->c = c; c->nmsg++; m->tx.type = Tclunk; m->tx.tag = m->tag; m->tx.fid = f->fid; m->fid = f; f->ref++; msgincref(m); sendomsg(m); mm = recvp(c->internal); assert(mm == m); msgclear(m); msgput(m); /* got from recvp */ msgput(m); /* got from msgnew */ fidput(f); /* got from hash table */ hnext = h->next; free(h); } } out: closeioproc(io); assert(c->nmsg == 0); assert(c->nfid == 0); close(c->fd); chanfree(c->internal); c->internal = 0; chanfree(c->inc); c->inc = 0; free(c->inq); c->inq = 0; free(c); }
int squeeze(const char *dstpath, const char *srcpath) { return repack(false, dstpath, srcpath); }
int flatten(const char *dstpath, const char *srcpath) { return repack(true, dstpath, srcpath); }
ROM_END static DRIVER_INIT( ddayjlc ) { #define repack(n)\ dst[newadr+0+n] = src[oldaddr+0+n];\ dst[newadr+1+n] = src[oldaddr+1+n];\ dst[newadr+2+n] = src[oldaddr+2+n];\ dst[newadr+3+n] = src[oldaddr+3+n];\ dst[newadr+4+n] = src[oldaddr+4+n];\ dst[newadr+5+n] = src[oldaddr+5+n];\ dst[newadr+6+n] = src[oldaddr+6+n];\ dst[newadr+7+n] = src[oldaddr+7+n];\ dst[newadr+8+n] = src[oldaddr+0+0x2000+n];\ dst[newadr+9+n] = src[oldaddr+1+0x2000+n];\ dst[newadr+10+n] = src[oldaddr+2+0x2000+n];\ dst[newadr+11+n] = src[oldaddr+3+0x2000+n];\ dst[newadr+12+n] = src[oldaddr+4+0x2000+n];\ dst[newadr+13+n] = src[oldaddr+5+0x2000+n];\ dst[newadr+14+n] = src[oldaddr+6+0x2000+n];\ dst[newadr+15+n] = src[oldaddr+7+0x2000+n];\ dst[newadr+16+n] = src[oldaddr+0+8+n];\ dst[newadr+17+n] = src[oldaddr+1+8+n];\ dst[newadr+18+n] = src[oldaddr+2+8+n];\ dst[newadr+19+n] = src[oldaddr+3+8+n];\ dst[newadr+20+n] = src[oldaddr+4+8+n];\ dst[newadr+21+n] = src[oldaddr+5+8+n];\ dst[newadr+22+n] = src[oldaddr+6+8+n];\ dst[newadr+23+n] = src[oldaddr+7+8+n];\ dst[newadr+24+n] = src[oldaddr+0+0x2008+n];\ dst[newadr+25+n] = src[oldaddr+1+0x2008+n];\ dst[newadr+26+n] = src[oldaddr+2+0x2008+n];\ dst[newadr+27+n] = src[oldaddr+3+0x2008+n];\ dst[newadr+28+n] = src[oldaddr+4+0x2008+n];\ dst[newadr+29+n] = src[oldaddr+5+0x2008+n];\ dst[newadr+30+n] = src[oldaddr+6+0x2008+n];\ dst[newadr+31+n] = src[oldaddr+7+0x2008+n]; { UINT32 oldaddr, newadr, length,j; UINT8 *src, *dst, *temp; temp = malloc(0x10000); src = temp; dst = memory_region(REGION_GFX1); length = memory_region_length(REGION_GFX1); memcpy(src, dst, length); newadr=0; oldaddr=0; for (j = 0; j < length/2; j+=32) { repack(0); repack(0x4000) newadr+=32; oldaddr+=16; } } memory_set_bankptr( 1, memory_region(REGION_USER1) ); }