disk_eraser/app/utils_drive.py

93 lines
2.7 KiB
Python

import threading
import os
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
erasing_methods = {
"2 прохода": {
"num_passes": 2,
"data": [b"\x00", "random"]
},
"Случайные данные": {
"num_passes": 1,
"data": ["random"]
},
"Гутмана": {
"num_passes": 0,
"data": []
},
"3 прохода": {
"num_passes": 3,
"data": [b"\x00", b"\xff", "random"]
},
"7 проходов": {
"num_passes": 7,
"data": [b"\x00", b"\xff", "random", "random", b"\x00", b"\x01", "random"]
}
}
def get_random_bytes(size):
seed=os.urandom(32)
backend = default_backend()
cipher = Cipher(algorithms.AES(seed), modes.CTR(b'\0'*16), backend=backend)
encryptor = cipher.encryptor()
nulls=b'\0'*(size)
return encryptor.update(nulls)
class Drive():
index: int = None
path: str
total_sectors: str
disk_type = None
name: str
block_size: int = 512
capacity: int
serial_num = None
def __init__(self, name, path, disk_type, block_size, capacity, dev_id, index):
self.name = name
self.disk_type = disk_type
self.path = path
if block_size is not None:
self.block_size = block_size
self.capacity = capacity
self.serial_num = dev_id
self.index = index
def erase(self, method, progressbar, progress_label) -> threading.Thread:
t = threading.Thread(target=self.__erasing, args=(method, progressbar,progress_label))
t.start()
return t
def __erasing(self, method, progressbar, progress_label):
write_size = self.block_size*32
with open(self.path, "wb") as drive:
for i in range(erasing_methods[method]["num_passes"]):
drive.seek(0)
prev_percent = 0
len_write = 0
progressbar.set(prev_percent)
print(i)
while len_write < self.capacity:
if erasing_methods[method]["data"][i] == "random":
data = get_random_bytes(write_size)
else:
data = erasing_methods[method]["data"][i] * write_size
drive.write(data)
len_write += write_size
cur_percent = len_write/self.capacity
if cur_percent - prev_percent > 0.01:
progressbar.set(cur_percent)
progress_label.configure(text=f"{int(cur_percent*100)} %")
prev_percent = cur_percent