# Verifică descărcările (/ro/docs/apps/verify-downloads)

Ce este semnat și ce are checksum pe fiecare platformă — semnături minisign pe installerul Windows și AppImage-ul Linux, SHA256SUMS pe fiecare versiune — și ce nu este (Authenticode, notarizare, Android).

Fiecare versiune desktop de pe [github.com/codai-ro/codai-desktop/releases](https://github.com/codai-ro/codai-desktop/releases) poartă două tipuri de dovezi. Pagina asta spune exact ce fișiere primesc ce, ca să știi ce înseamnă de fapt o bifă verde.

Pentru CLI-ul `codaid` (`SHA256SUMS` semnat cu ECDSA P-256 și minisign începând cu 0.5.0), vezi [verificarea manuală a unei descărcări codaid](../environments/codaid.mdx#verificarea-manuală-a-unei-descărcări).

| Platformă | Fișier                       | Checksum în `SHA256SUMS`  | Semnătură detașată                                    | Semnare de cod / notarizare                          |
| --------- | ---------------------------- | ------------------------- | ----------------------------------------------------- | ---------------------------------------------------- |
| Windows   | `codai_<v>_x64-setup.exe`    | da                        | **da** — `codai_<v>_x64-setup.exe.sig` (minisign)     | **fără** Authenticode încă — SmartScreen va avertiza |
| Windows   | `codai_<v>_x64_en-US.msi`    | da                        | nu                                                    | nu                                                   |
| Windows   | `codai_<v>_x64-portable.zip` | da                        | nu                                                    | nu                                                   |
| Linux     | `codai_<v>_amd64.AppImage`   | da (când e construit)     | **da** — `.AppImage.sig` (minisign, când e construit) | n/a                                                  |
| Linux     | `.deb`, `.rpm`               | da (când sunt construite) | nu                                                    | nesemnate GPG                                        |
| macOS     | `.dmg`                       | —                         | —                                                     | nepublicat; fără notarizare                          |
| Android   | `.apk`                       | —                         | semnat cu keystore-ul de release (semnătură APK v2)   | fără fișier de checksum separat încă                 |

`latest.json` din aceeași versiune este ce citește actualizatorul automat; `platforms.windows-x86_64.signature` de acolo este **conținutul** fișierului `.exe.sig`, așa că actualizatorul și o verificare manuală verifică același lucru.

## Checksum-uri (fiecare fișier) [#checksum-uri-fiecare-fișier]

`SHA256SUMS` listează un SHA-256 în litere mici per artefact, în formatul `<hash>  <nume-fișier>`.

```powershell tab="Windows"
# în folderul unde ai descărcat artefactele
$sums = Get-Content .\SHA256SUMS
Get-ChildItem codai_* | ForEach-Object {
  $h = (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower()
  $ok = $sums -match "^$h  $([regex]::Escape($_.Name))$"
  "{0}  {1}" -f ($(if ($ok) { 'OK ' } else { 'BAD' })), $_.Name
}
```

```bash tab="Linux / macOS"
sha256sum --ignore-missing -c SHA256SUMS
```

Un checksum dovedește că fișierul nu a fost corupt sau înlocuit **după** publicare. Nu dovedește cine l-a publicat — pentru asta ai nevoie de semnătura de mai jos.

## Semnături (installer Windows, AppImage Linux) [#semnături-installer-windows-appimage-linux]

Fișierele `.sig` sunt semnături [minisign](https://jedisct1.github.io/minisign/) produse de `tauri signer`. **Cheia publică** corespunzătoare **este compilată în aplicație** și tipărită în `src-tauri/tauri.conf.json` → `plugins.updater.pubkey`. Doar un fișier semnat cu jumătatea privată a acelei chei va fi instalat de actualizator — și doar un astfel de fișier ar trebui instalat de tine.

<Steps>
<Step>

### Obții cheia publică [#obții-cheia-publică]

Este codificată base64 în `tauri.conf.json`. O decodezi într-o cheie publică minisign pe două linii:

```powershell tab="Windows"
$pub = 'dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDFCRERBM0QxMDY4NzYyNjcKUldSbllvY0cwYVBkRzcrYXdNcmFyMnZmTEhTRGJPOWlmZVkzdGZsVjRJWXN1Q0dHTXp6UWJSaGcK'
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($pub)) | Set-Content codai-desktop.pub
```

```bash tab="Linux / macOS"
echo 'dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDFCRERBM0QxMDY4NzYyNjcKUldSbllvY0cwYVBkRzcrYXdNcmFyMnZmTEhTRGJPOWlmZVkzdGZsVjRJWXN1Q0dHTXp6UWJSaGcK' | base64 -d > codai-desktop.pub
```

Fișierul decodat începe cu `untrusted comment: minisign public key: 1BDDA3D106876267`. Compari acel id de cheie cu cel din `tauri.conf.json` al repo-ului — dacă diferă, te oprești.

</Step>
<Step>

### Decodezi semnătura [#decodezi-semnătura]

`.sig`-ul este și el base64:

```powershell tab="Windows"
$v = '0.6.1'
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String((Get-Content "codai_${v}_x64-setup.exe.sig" -Raw))) | Set-Content "codai_${v}_x64-setup.exe.minisig"
```

```bash tab="Linux / macOS"
V=0.6.1
base64 -d codai_${V}_x64-setup.exe.sig > codai_${V}_x64-setup.exe.minisig
```

</Step>
<Step>

### Verifici [#verifici]

Instalezi minisign (`winget install minisign`, `brew install minisign`, sau pachetul distribuției), apoi:

```powershell tab="Windows"
minisign -Vm "codai_${v}_x64-setup.exe" -p codai-desktop.pub -x "codai_${v}_x64-setup.exe.minisig"
```

```bash tab="Linux / macOS"
minisign -Vm codai_${V}_x64-setup.exe -p codai-desktop.pub -x codai_${V}_x64-setup.exe.minisig
```

`Signature and comment signature verified` înseamnă că fișierul este cel semnat de noi. Orice altceva înseamnă că nu este — nu îl rulezi și ne scrii la **security@codai.ro**.

</Step>
</Steps>

Aceiași trei pași se aplică pentru `codai_<v>_amd64.AppImage` / `.AppImage.sig` pe versiunile care includ un build Linux.

## Ce _nu_ este semnat azi [#ce-nu-este-semnat-azi]

<Callout type="warn">Fii precis în privința a ce acoperă un rezultat verde.</Callout>

- **Authenticode Windows** — installerul nu este semnat cu un certificat de semnare de cod, așa că Windows SmartScreen afișează _„Windows protected your PC”_ prima dată. Este planificat (Azure Artifact Signing); până atunci verificarea minisign de mai sus este modul de a ști că fișierul este al nostru.
- **`.msi` și `.zip`-ul portabil** — au checksum, nu semnătură.
- **`.deb` / `.rpm` Linux** — au checksum, nu semnătură GPG; nu există repo apt/dnf.
- **macOS** — niciun build publicat, deci nicio notarizare.
- **APK Android** — semnat cu keystore-ul de release, cum trebuie orice aplicație Android (certificat SHA-256 `11:F1:6A:8B…`; amprenta completă este în repo-ul codai-phone). Android o verifică la instalare și refuză o actualizare semnată cu altă cheie. Nu există încă un `SHA256SUMS` separat pentru APK.

## Versiuni și rollback [#versiuni-și-rollback]

- Versiunile sunt etichetate `desktop-v<versiune>`; cele trei fișiere de versiune din sursă (`package.json`, `tauri.conf.json`, `Cargo.toml`) sunt mereu în acord cu eticheta.
- Endpoint-ul de actualizare `https://codai.ro/api/desktop/latest.json` servește cea mai nouă versiune **non-pre-release**. O versiune defectă este retrasă marcând-o pre-release (sau ștergând-o): cea anterioară redevine „latest” în cinci minute. Actualizatorul nu face niciodată downgrade unei versiuni mai noi deja instalate.
- Cheia privată de semnare nu părăsește niciodată mașina maintainerului și are backup offline; pierderea ei ar orfaniza fiecare client instalat.

<Cards>
  <Card title="Desktop" href="./desktop.mdx" description="Instalare și prima rulare." />
  <Card title="Android" href="./android.mdx" description="Build-uri APK vs Google Play." />
</Cards>
