# `ExSaml.Core.Xml.Dsig`
[🔗](https://github.com/docJerem/ex_saml/blob/main/lib/ex_saml/core/xml/dsig.ex#L1)

XML Digital Signatures (XMLDSig) generation and verification.

Implements enveloped XML digital signature generation and verification
as specified at http://www.w3.org/TR/xmldsig-core/

Currently supports RSA + SHA1|SHA256 signatures.

# `fingerprint`

```elixir
@type fingerprint() :: binary() | {:sha | :sha256, binary()}
```

# `sig_method`

```elixir
@type sig_method() :: :rsa_sha1 | :rsa_sha256
```

# `xml`

```elixir
@type xml() ::
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()}
  | {:xmlDocument, content :: term()}
```

# `certificate`
*macro* 

# `certificate`
*macro* 

# `digest`

```elixir
@spec digest(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()}
) :: binary()
```

Returns the canonical digest of an (optionally signed) element.

# `digest`

```elixir
@spec digest(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()},
  :sha | :sha256
) :: binary()
```

# `sign`

```elixir
@spec sign(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()},
  tuple(),
  binary()
) ::
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()}
```

Signs the given XML element by creating a ds:Signature element within it.

Returns the element with the signature added. Default algorithm is RSA-SHA256.

# `sign`

```elixir
@spec sign(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()},
  tuple(),
  binary(),
  sig_method() | String.t()
) ::
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()}
```

# `strip`

```elixir
@spec strip(xml()) :: xml()
```

Returns an element without any ds:Signature elements inside it.

# `subject_public_key_info`
*macro* 

# `subject_public_key_info`
*macro* 

# `tbs_certificate`
*macro* 

# `tbs_certificate`
*macro* 

# `verify`

```elixir
@spec verify(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()}
) :: :ok | {:error, :bad_digest | :bad_signature | :cert_not_accepted}
```

Verifies an XML digital signature, trusting any valid certificate.

# `verify`

```elixir
@spec verify(
  {:xmlElement, name :: term(), expanded_name :: term(), nsinfo :: term(),
   namespace :: term(), parents :: term(), pos :: term(), attributes :: term(),
   content :: term(), language :: term(), xmlbase :: term(),
   elementdef :: term()},
  [fingerprint()] | :any
) ::
  :ok
  | {:error,
     :bad_digest
     | :bad_signature
     | :cert_not_accepted
     | :no_signature
     | :multiple_signatures
     | :insecure_algorithm
     | :unsupported_algorithm}
```

Verifies an XML digital signature on the given element.

`fingerprints` is a list of valid cert fingerprints that can be accepted,
or `:any` to accept any valid certificate.

# `xmlAttribute`
*macro* 

# `xmlAttribute`
*macro* 

# `xmlDocument`
*macro* 

# `xmlDocument`
*macro* 

# `xmlElement`
*macro* 

# `xmlElement`
*macro* 

# `xmlNamespace`
*macro* 

# `xmlNamespace`
*macro* 

# `xmlText`
*macro* 

# `xmlText`
*macro* 

---

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