# `Sat.Certificados.PrivateKey`

Llave privada RSA en PKCS#8 (típico archivo `.key` del SAT, DER cifrado o PEM claro).

# `load_opts`

```elixir
@type load_opts() :: [{:strict, boolean()}]
```

Opciones de carga.

  * `:strict` — si `true`, rechaza llaves no cifradas (PKCS#8 plano o PKCS#1).
    Por convención SAT las `.key` siempre vienen cifradas.

# `t`

```elixir
@type t() :: %Sat.Certificados.PrivateKey{decoded: term(), raw_der: binary()}
```

# `belongs_to_certificate?`

```elixir
@spec belongs_to_certificate?(t(), Sat.Certificados.Certificate.t()) :: boolean()
```

`true` si esta llave corresponde al certificado dado (mismo módulo y exponente).

# `from_der`

```elixir
@spec from_der(binary(), String.t() | nil, load_opts()) ::
  {:ok, t()} | {:error, term()}
```

Carga llave desde DER (p. ej. `.key` cifrado del SAT) usando la contraseña.

Soporta PKCS#8 EncryptedPrivateKeyInfo (formato SAT), PKCS#8 PrivateKeyInfo
plano y PKCS#1 RSAPrivateKey plano.

Cuando `opts[:strict]` es `true`, **solo** acepta PKCS#8 cifrado.

# `from_file`

```elixir
@spec from_file(String.t(), String.t() | nil, load_opts()) ::
  {:ok, t()} | {:error, term()}
```

Lee archivo `.key` (DER cifrado o PEM claro).

En modo `strict: true` rechaza PEM y DER sin cifrar.

# `from_pem`

```elixir
@spec from_pem(String.t()) :: {:ok, t()} | {:error, term()}
```

Carga llave desde PEM (sin cifrar).

# `rsa_decrypt`

```elixir
@spec rsa_decrypt(t(), String.t()) :: {:ok, binary()} | {:error, term()}
```

Desencripta un mensaje cifrado con la llave pública del certificado
correspondiente (RSA PKCS#1 v1.5). El input debe estar en Base64.
Retorna el plaintext como binary.

# `sign`

```elixir
@spec sign(t(), iodata(), atom()) :: String.t()
```

Firma datos con RSA y SHA-256 por defecto; devuelve la firma en Base64.

Algoritmos válidos: `:sha256`, `:sha384`, `:sha512`, `:sha`, `:md5`.

# `to_pem`

```elixir
@spec to_pem(t()) :: String.t()
```

PEM PKCS#8 (sin cifrar) de la llave decodificada.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
