📄 bcreencrypt.c
字号:
close(fd); free(buff); return FALSE; } break; case 2: if ( state.dir == -1 )state.WritePos-=state.BuffSize; if ( WriteContFile(fd,buff)==-1 ) { msg(stderr,"Can not write data to container\n"); close(fd); free(buff); return FALSE; } if ( state.dir==0 ) state.step=3; else state.step=1; if ( state.dir == 1 )state.WritePos+=state.BuffSize; if ( WriteStatFiles()==FALSE ) { msg(stderr,"Can not write stat files\n"); close(fd); free(buff); return FALSE; } break; case 3: if ( ftruncate(fd,state.NewContSize)==-1 ) { msg(stderr,"Can not truncate container file\n"); } close(fd); if ( ReadStatFile(fnheader2,buff,state.NewDataOffset)==FALSE ) { msg(stderr,"Can not read header file\n"); free(buff); return FALSE; } if ( WriteStatFile(ContName,buff,state.NewDataOffset)==FALSE ) { msg(stderr,"Can not write header\n"); free(buff); return FALSE; } state.step=4; state.WritePos=state.NewContSize; break; default: msg(stderr,"Unexpected state\n"); free(buff); return FALSE; } if ( o_verbose ) { t=time(NULL); pr= (int)((long long)state.WritePos*100/state.NewContSize); if ( t != ot ) { msg(stdout,"%10ld/%ld Mb (%3d%%)\r",(unsigned long)state.WritePos>>20, (unsigned long)state.NewContSize>>20,pr); ot=t; opr=pr; } else if ( pr != opr ) { msg(stdout,"%10ld/%ld Mb (%3d%%)\r",(unsigned long)state.WritePos>>20, (unsigned long)state.NewContSize>>20,pr); opr=pr; } } } while ( state.step!=4 ); if ( o_verbose ) msg(stdout,"\n"); free(buff); return TRUE;}int bcreencrypt (int argc, char ** argv){ struct HiddenSector hs; int fd; DWORD DataSize, _offset; DATA_BLOCK *pdb,db; alg_info *AlgInf; char device[MAX_DEV_PATH]; if ( argc < 2 ) { msg(stderr,"Please specify container name\n"); return -1; } else if ( argc > 2 ) { msg(stderr,"Too many parameters\n"); return -1; } if ( PrepareFileNames(argv[1])==FALSE ) { msg(stderr,"Can not prepare file names\n"); return -1; } SetSignalHandlers(ReencryptSignalHandler); if ( WasInterrupted(argv[1])==TRUE ) { msg(stdout,"Reencryption process was interrupted\nRestoring reencryption...\n"); //Restoring reencryption if ( (AlgOld.bc_fd = open_bc_dev(device, 0)) < 0 ) { msg(stderr,"open(\"%s\"): %s\n",device,strerror(errno)); return -1; } //reading old header if ( (fd = open(fnheader1, O_RDONLY)) < 0 ) { msg(stderr,"open(\"%s\",O_RDONLY): %s\n",fnheader1,strerror(errno)); close(AlgOld.bc_fd); return -1; } if ( read(fd, &hs, sizeof(hs))!=sizeof(hs) ) { msg(stderr,"read(\"%s\", &hs, sizeof(hs))): %s\n",fnheader1,strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } if ( read(fd, &db, sizeof (db))!=sizeof(db) ) { msg(stderr,"read(\"%s\", &db, sizeof(db))): %s\n",fnheader1,strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } close(fd); if ( (AlgInf=GetInfoById(hs.algorithmId))==NULL ) { msg(stderr,"Unknown old algorithm Id: %d\n",hs.algorithmId); close(AlgOld.bc_fd); return -1; } AlgOld.alg_id=hs.algorithmId; AlgOld.alg_module =AlgInf->mod_name; pdb = &db; DataSize = sizeof(db); if (KGSHA256_ID == hs.keyGenId) { UseSha256(); } CreateKeyHandle(AlgOld,AlgInf->key_size,NULL,"Enter old password:",CFLAG_VERIFY_AND_LOAD_KEY,(BYTE **)&pdb,&DataSize,&KeyHandleOld,&Error); if ( Error!=0 ) { print_error(Error); close(AlgOld.bc_fd); return -1; } // reading new header if ( (fd = open(fnheader2, O_RDONLY)) < 0 ) { msg(stderr,"open(\"%s\", O_RDONLY): %s\n",fnheader2,strerror(errno)); close(AlgOld.bc_fd); return -1; } if ( read(fd, &hs, sizeof(hs))!=sizeof(hs) ) { msg(stderr,"read(\"%s\", &hs, sizeof(hs)): %s\n",fnheader2,strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } if ( read(fd, &db, sizeof (db))!=sizeof(db) ) { msg(stderr,"read(\"%s\", &db, sizeof(db)): %s\n",fnheader2,strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } close(fd); if ( (AlgInf=GetInfoById(hs.algorithmId))==NULL ) { msg(stderr,"Unknown algorithm Id %d in container file\n",hs.algorithmId); close(AlgOld.bc_fd); return -1; } AlgNew.alg_id=hs.algorithmId; AlgNew.alg_module =AlgInf->mod_name; AlgNew.bc_fd=AlgOld.bc_fd; pdb = &db; DataSize = sizeof(db); CreateKeyHandle(AlgNew,AlgInf->key_size,NULL,"Enter new password:",CFLAG_VERIFY_AND_LOAD_KEY,(BYTE **)&pdb,&DataSize,&KeyHandleNew,&Error); if ( Error!=0 ) { print_error(Error); close(AlgOld.bc_fd); return -1; } // end of restoring } else { if ( o_alg==NULL ) { msg(stderr,"Algorithm name is not specified\n"); close(AlgOld.bc_fd); return -1; } if ( is_valid_container(argv[1])==FALSE ) { msg(stderr,"%s - is not valid container\n",argv[1]); close(AlgOld.bc_fd); return -1; } if ( (AlgOld.bc_fd = open_bc_dev(device,0)) < 0 ) { msg(stderr,"Can not open %s: %s\n", device,strerror(errno)); close(AlgOld.bc_fd); return -1; } if ( (fd = open(argv[1], O_RDONLY|O_LARGEFILE)) < 0 ) { msg(stderr,"Can not open %s: %s\n", argv[1],strerror(errno)); close(AlgOld.bc_fd); return -1; } if ( read(fd, &hs, sizeof(hs))!=sizeof(hs) ) { msg(stderr,"read(\"%s\",&hs, sizeof(hs)): %s\n",argv[1],strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } if ('B' == hs.br.jmpCode[0]) { msg(stderr, "WARNING! Container \"%s\" is probably in use!\n\n" "Two reasons for the report are possible:\n" " 1. The container is already mounted. In this case do not use the container\n" " until someone dismounts it.\n" " 2. The container was not unmounted properly last time, so a lock mask \n" " for the container was not reset. If so, unlock the container by running the command:\n" " \"bctool unlock %s\" \n\n", argv[1],argv[1]); return -1; } if ( read(fd, &db, sizeof (db))!=sizeof(db) ) { msg(stderr,"read(\"%s\",&db, sizeof(db)): %s\n",argv[1],strerror(errno)); close(fd); close(AlgOld.bc_fd); return -1; } close(fd); if ( (AlgInf=GetInfoById(hs.algorithmId))==NULL ) { msg(stderr,"Unknown algorithm Id %d in container file\n",hs.algorithmId); return -1; } AlgOld.alg_id=hs.algorithmId; AlgOld.alg_module =AlgInf->mod_name; pdb = &db; DataSize = sizeof(db); if (KGSHA256_ID == hs.keyGenId) { UseSha256(); } CreateKeyHandleEx(AlgOld, AlgInf->key_size, NULL, "Enter old password:", CFLAG_VERIFY_AND_LOAD_KEY, (BYTE **)&pdb, &DataSize, &KeyHandleOld, &Error, &_offset); if ( Error!=0 ) { print_error(Error); FreeFileNames(); close(AlgOld.bc_fd); return -1; } if (_offset) { msg(stderr,"Sorry, hidden part reencryption is prohibited\n"); FreeFileNames(); close(AlgOld.bc_fd); return -1; } if ( (AlgInf=GetInfoByName(o_alg))==NULL ) { msg(stderr,"Unknown new algorithm - %s\n",o_alg); close(AlgOld.bc_fd); FreeFileNames(); return -1; } AlgNew.alg_id=AlgInf->id; AlgNew.alg_module =AlgInf->mod_name; AlgNew.bc_fd=AlgOld.bc_fd; CreateKeyHandle(AlgNew,AlgInf->key_size,NULL,"Enter new password:",CFLAG_CREATE_WITH_SINGLE_PASSWORD,(BYTE **)&pdb,&DataSize,&KeyHandleNew,&Error); if ( Error!=0 ) { print_error(Error); FreeFileNames(); close(AlgOld.bc_fd); return -1; } if ( init(argv[1],(char *)pdb,DataSize,hs.keyGenId,AlgInf->id)==FALSE ) { msg(stderr,"Can not init reencryption process\n"); FreeKeyHandle(AlgOld,KeyHandleOld); FreeKeyHandle(AlgNew,KeyHandleNew); FreeFileNames(); close(AlgOld.bc_fd); return -1; } } if ( MoveData(argv[1])==FALSE ) { msg(stderr,"Reencryption error\n"); FreeKeyHandle(AlgNew,KeyHandleNew); FreeKeyHandle(AlgOld,KeyHandleOld); FreeFileNames(); close(AlgOld.bc_fd); return -1; } FreeKeyHandle(AlgNew,KeyHandleNew); FreeKeyHandle(AlgOld,KeyHandleOld); if ( UnlinkStatFiles()==-1 ) { msg(stderr,"Can not remove temporary files: %s\nPlease remove them manualy\n",strerror(errno)); } FreeFileNames(); close(AlgOld.bc_fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -