CCCPaste

6b9b974c980fe

# Verify-Hashes.ps1
param(
    [Parameter(Mandatory=$true)]
    [string]$HashListFile,
    
    [Parameter(Mandatory=$false)]
    [string]$Algorithm = "SHA256"
)

function Verify-Hashes {
    param(
        [string]$HashListPath,
        [string]$HashAlgorithm
    )
    
    # Check if hash list file exists
    if (-not (Test-Path $HashListPath)) {
        Write-Error "Hash list file not found: $HashListPath"
        return
    }
    
    # Read hash list file
    $hashEntries = Get-Content $HashListPath
    
    Write-Host "Verifying files against hash list..." -ForegroundColor Cyan
    Write-Host "Algorithm: $HashAlgorithm" -ForegroundColor Cyan
    Write-Host ("-" * 60) -ForegroundColor Cyan
    
    $verifiedCount = 0
    $failedCount = 0
    $missingCount = 0
    
    foreach ($entry in $hashEntries) {
        # Skip empty lines and comments
        if ([string]::IsNullOrWhiteSpace($entry) -or $entry.Trim().StartsWith("#")) {
            continue
        }
        
        # Parse the line (format: "hash filename")
        $parts = $entry -split '\s+', 2
        
        if ($parts.Length -lt 2) {
            Write-Warning "Invalid format in hash list: $entry"
            continue
        }
        
        $expectedHash = $parts[0].ToUpper()
        $fileName = $parts[1].Trim()
        
        # Check if file exists
        if (-not (Test-Path $fileName)) {
            Write-Host "[MISSING] $fileName" -ForegroundColor Red
            $missingCount++
            continue
        }
        
        # Calculate actual hash
        try {
            $actualHash = (Get-FileHash $fileName -Algorithm $HashAlgorithm).Hash.ToUpper()
            
            # Compare hashes
            if ($actualHash -eq $expectedHash) {
                Write-Host "[PASS] $fileName" -ForegroundColor Green
                $verifiedCount++
            } else {
                Write-Host "[FAIL] $fileName" -ForegroundColor Red
                Write-Host "  Expected: $expectedHash" -ForegroundColor Yellow
                Write-Host "  Actual:   $actualHash" -ForegroundColor Yellow
                $failedCount++
            }
        }
        catch {
            Write-Host "[ERROR] $fileName - $($_.Exception.Message)" -ForegroundColor Red
            $failedCount++
        }
    }
    
    # Summary
    Write-Host ("-" * 60) -ForegroundColor Cyan
    Write-Host "Verification Summary:" -ForegroundColor Cyan
    Write-Host "  Verified: $verifiedCount" -ForegroundColor Green
    Write-Host "  Failed: $failedCount" -ForegroundColor Red
    Write-Host "  Missing: $missingCount" -ForegroundColor Yellow
    
    if ($failedCount -eq 0 -and $missingCount -eq 0) {
        Write-Host "All files verified successfully!" -ForegroundColor Green
        return $true
    } else {
        Write-Host "Verification completed with issues." -ForegroundColor Red
        return $false
    }
}

# Execute the verification
Verify-Hashes -HashListPath $HashListFile -HashAlgorithm $Algorithm