# `ExSaml.Core.Saml`
[🔗](https://github.com/docJerem/ex_saml/blob/main/lib/ex_saml/core/saml.ex#L1)

Core SAML protocol module for encoding and decoding SAML messages.

Ported from the Erlang `esaml` module. Provides functions for:
- Decoding SAML responses, assertions, logout requests/responses, and IdP metadata
- Validating assertions
- Converting SAML structs to XML

# `decode_assertion`

```elixir
@spec decode_assertion(tuple()) :: {:ok, ExSaml.Core.Assertion.t()} | {:error, term()}
```

Decodes a SAML Assertion XML element into an `ExSaml.Core.Assertion` struct.

# `decode_idp_metadata`

```elixir
@spec decode_idp_metadata(tuple()) ::
  {:ok, ExSaml.Core.IdpMetadata.t()} | {:error, term()}
```

Decodes an IdP metadata XML element into an `ExSaml.Core.IdpMetadata` struct.

# `decode_logout_request`

```elixir
@spec decode_logout_request(tuple()) ::
  {:ok, ExSaml.Core.LogoutRequest.t()} | {:error, term()}
```

Decodes a SAML LogoutRequest XML element into an `ExSaml.Core.LogoutRequest` struct.

# `decode_logout_response`

```elixir
@spec decode_logout_response(tuple()) ::
  {:ok, ExSaml.Core.LogoutResponse.t()} | {:error, term()}
```

Decodes a SAML LogoutResponse XML element into an `ExSaml.Core.LogoutResponse` struct.

# `decode_response`

```elixir
@spec decode_response(tuple()) :: {:ok, ExSaml.Core.Response.t()} | {:error, term()}
```

Decodes a SAML Response XML element into an `ExSaml.Core.Response` struct.

# `lang_elems`

```elixir
@spec lang_elems(tuple(), String.t() | [{atom(), String.t()}]) :: [tuple()]
```

Produces cloned XML elements with `xml:lang` set for multi-locale strings.

If `vals` is a keyword list of `{locale, string}` pairs, generates one element
per locale. Otherwise generates a single element with `xml:lang="en"`.

# `stale_time`

```elixir
@spec stale_time(ExSaml.Core.Assertion.t()) :: integer()
```

Returns the gregorian seconds at which an assertion is considered stale.

Examines the Subject's NotOnOrAfter, the Conditions NotOnOrAfter,
and falls back to issue_instant + 5 minutes.

# `to_xml`

```elixir
@spec to_xml(struct()) :: tuple()
```

Converts a SAML struct to an xmerl XML element.

Supports `AuthnRequest`, `LogoutRequest`, `LogoutResponse`, and `SpMetadata`.

# `validate_assertion`

```elixir
@spec validate_assertion(tuple(), String.t(), String.t()) ::
  {:ok, ExSaml.Core.Assertion.t()} | {:error, term()}
```

Validates a SAML assertion XML element.

Decodes the assertion and validates:
- Version is "2.0"
- Recipient matches the expected value
- Audience matches (if present in conditions)
- Assertion is not stale

# `xmlAttribute`
*macro* 

# `xmlAttribute`
*macro* 

# `xmlElement`
*macro* 

# `xmlElement`
*macro* 

# `xmlNamespace`
*macro* 

# `xmlNamespace`
*macro* 

# `xmlText`
*macro* 

# `xmlText`
*macro* 

---

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