Upload files to "/"
This commit is contained in:
		
							
								
								
									
										84
									
								
								hash.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								hash.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
 | 
			
		||||
import argparse
 | 
			
		||||
import hashlib
 | 
			
		||||
import sys
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
 | 
			
		||||
DEFAULT_BLOCK_SIZE = 1024 * 1024  # 1 MB
 | 
			
		||||
SUPPORTED_ALGOS = ["md5", "sha1", "sha224", "sha256"]
 | 
			
		||||
 | 
			
		||||
def compute_hash(path: Path, algorithm: str, block_size: int = DEFAULT_BLOCK_SIZE) -> str:
 | 
			
		||||
    """Compute the hash of a file using the chosen algorithm."""
 | 
			
		||||
    try:
 | 
			
		||||
        h = hashlib.new(algorithm)
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        raise SystemExit(f"Error: Unsupported hash algorithm '{algorithm}'")
 | 
			
		||||
 | 
			
		||||
    with path.open("rb") as f:
 | 
			
		||||
        for chunk in iter(lambda: f.read(block_size), b""):
 | 
			
		||||
            h.update(chunk)
 | 
			
		||||
 | 
			
		||||
    return h.hexdigest()
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    parser = argparse.ArgumentParser(
 | 
			
		||||
        description="Compute hash(es) of a file or verify against a known hash."
 | 
			
		||||
    )
 | 
			
		||||
    parser.add_argument("file", type=Path, help="Path to the file to hash")
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
        "known_hash",
 | 
			
		||||
        nargs="?",
 | 
			
		||||
        help="Optional known hash to verify the file against",
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    parser.add_argument("-md5", action="store_true", help="Use MD5 algorithm")
 | 
			
		||||
    parser.add_argument("-sha1", action="store_true", help="Use SHA-1 algorithm")
 | 
			
		||||
    parser.add_argument("-sha224", action="store_true", help="Use SHA-224 algorithm")
 | 
			
		||||
    parser.add_argument("-sha256", action="store_true", help="Use SHA-256 algorithm")
 | 
			
		||||
 | 
			
		||||
    args = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
    if not args.file.exists() or not args.file.is_file():
 | 
			
		||||
        print(f"Error: File not found -> {args.file}", file=sys.stderr)
 | 
			
		||||
        sys.exit(1)
 | 
			
		||||
 | 
			
		||||
    selected_algos = [
 | 
			
		||||
        algo
 | 
			
		||||
        for algo, used in {
 | 
			
		||||
            "md5": args.md5,
 | 
			
		||||
            "sha1": args.sha1,
 | 
			
		||||
            "sha224": args.sha224,
 | 
			
		||||
            "sha256": args.sha256,
 | 
			
		||||
        }.items()
 | 
			
		||||
        if used
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    if not selected_algos:
 | 
			
		||||
        selected_algos = ["sha1"] if args.known_hash else SUPPORTED_ALGOS
 | 
			
		||||
 | 
			
		||||
    print()
 | 
			
		||||
    if args.known_hash:
 | 
			
		||||
        # Verification mode
 | 
			
		||||
        algo = selected_algos[0]
 | 
			
		||||
        digest = compute_hash(args.file, algo)
 | 
			
		||||
        print(f"{algo.upper()} hash: {digest}")
 | 
			
		||||
        if digest.lower() == args.known_hash.lower():
 | 
			
		||||
            print("\033[32mCorrect\033[0m")
 | 
			
		||||
            print("")
 | 
			
		||||
            sys.exit(0)
 | 
			
		||||
        else:
 | 
			
		||||
            print("\033[31mIncorrect\033[0m")
 | 
			
		||||
            print("")
 | 
			
		||||
            sys.exit(1)
 | 
			
		||||
    else:
 | 
			
		||||
        # Normal hashing mode
 | 
			
		||||
        print("Algorithm       Hash")
 | 
			
		||||
        print("---------       ----")
 | 
			
		||||
        for algo in selected_algos:
 | 
			
		||||
            digest = compute_hash(args.file, algo)
 | 
			
		||||
            print(f"{algo.upper():<8}        {digest}")
 | 
			
		||||
        print()
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    main()
 | 
			
		||||
		Reference in New Issue
	
	Block a user