> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Firma y verificación

> Algoritmos de firma por especificación de clave, y por qué no debe pre-hash.

<a id="signing" />

## Firma

<Tabs>
  <Tab title="API">
    ```bash theme={null}
    POST /v1/keys/{key_id}/sign
    { "message": "<base64 of the raw payload>" }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic kms key sign <key-id> --message "$(base64 -w0 payload.bin)"
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    sig, err := kms.New(cfg).Sign(ctx, keyID, &kms.SignRequest{
        Message: payload,
    })
    ```

    `Message` toma los bytes sin procesar — el SDK los codifica base64 por ti, así que no los codifiques tú mismo.
  </Tab>
</Tabs>

<Warning>
  Pasa el **mensaje en bruto**, no un resumen. El servicio lo hash con SHA-256 del lado del servidor, por lo que una entrada pre-hash se hash dos veces y produce una firma que nada verificará.
</Warning>

`signing_algorithm` es opcional; si se omite, se usa el valor por defecto de la especificación, y el algoritmo realmente aplicado vuelve en la respuesta.

| `key_spec` | Algoritmos aceptados | Por defecto |
| - | - | - |
| `rsa-2048`, `rsa-4096` | `RSASSA_PSS_SHA_256`, `RSASSA_PKCS1_V1_5_SHA_256` | `RSASSA_PSS_SHA_256` |
| `ecdsa-p256` | `ECDSA_SHA_256` | `ECDSA_SHA_256` |

Un algoritmo que no coincide con la especificación se rechaza con `400 KMS_UNSUPPORTED_SIGNING_ALGORITHM` en lugar de ser intentado.

Las firmas vuelven en las codificaciones estándar, por lo que nada abajo necesita un manejo especial: RSA-PSS usa `saltLen = hashLen = 32`, y ECDSA devuelve la secuencia ASN.1 DER `(r, s)` de ANSI X9.62.

`POST /v1/keys/{key_id}/verify` responde `{"signature_valid": false}` para una firma que simplemente no coincide. Eso es un `200`, no un error — un error significa que la solicitud o el backend estaban mal, no que la firma estaba mal.

<Note>
  La API no expone la mitad pública de una clave asimétrica, por lo que la verificación se realiza a través de `verify` en lugar de fuera de línea contra una clave publicada. Planee una llamada por comprobación — y tenga en cuenta que `verify` es una acción IAM separada, por lo que una parte que solo debe verificar firmas nunca necesita `kms:Sign`.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.