https://github.com/altcha-org/altcha-lib-ex
A lightweight Elixir library for creating and verifying ALTCHA challenges.
https://github.com/altcha-org/altcha-lib-ex
altcha elixir
Last synced: 4 months ago
JSON representation
A lightweight Elixir library for creating and verifying ALTCHA challenges.
- Host: GitHub
- URL: https://github.com/altcha-org/altcha-lib-ex
- Owner: altcha-org
- License: mit
- Created: 2024-08-07T23:03:38.000Z (10 months ago)
- Default Branch: main
- Last Pushed: 2024-08-08T13:13:25.000Z (10 months ago)
- Last Synced: 2024-09-30T09:01:36.090Z (8 months ago)
- Topics: altcha, elixir
- Language: Elixir
- Homepage: https://altcha.org/
- Size: 12.7 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.txt
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# ALTCHA Elixir Library
The ALTCHA Elixir Library is a lightweight library designed for creating and verifying [ALTCHA](https://altcha.org) challenges.
## Compatibility
This library is compatible with:
- Elixir 1.10+
## Example
- [Demo server](https://github.com/altcha-org/altcha-starter-ex)
## Installation
To install the ALTCHA Elixir Library, add it to your `mix.exs` dependencies:
```elixir
defp deps do
[
{:altcha, "~> 0.2"}
]
end
```Then run:
```sh
mix deps.get
```## Usage
Here’s a basic example of how to use the ALTCHA Elixir Library:
```elixir
hmac_key = "secret hmac key"# Create a new challenge
options = %Altcha.ChallengeOptions{
hmac_key: hmac_key,
max_number: 100000 # the maximum random number
}challenge = Altcha.create_challenge(options)
# Example payload to verify
payload = %{
algorithm: challenge.algorithm,
challenge: challenge.challenge,
number: 123, # Example number
salt: challenge.salt,
signature: challenge.signature
}# Verify the solution
valid = Altcha.verify_solution(payload, hmac_key, true)
```## API Documentation
### `create_challenge/1`
**Description:**
Generates a new ALTCHA challenge with the specified options. The challenge includes a hashed string and an HMAC signature.
**Parameters:**
- `%ChallengeOptions{}` - A struct containing options for challenge creation:
- `:algorithm` - (optional) The algorithm to use for hashing (`:sha`, `:sha256`, `:sha512`). Defaults to `:sha256`.
- `:max_number` - (optional) The maximum number for challenge generation. Defaults to `1_000_000`.
- `:salt_length` - (optional) The length of the salt. Defaults to `12`.
- `:hmac_key` - (required) Key used for HMAC calculation.
- `:salt` - (optional) The salt value. If not provided, a random salt will be generated.
- `:number` - (optional) The number for the challenge. If not provided, a random number will be generated.
- `:expires` - (optional) Expiration time for the challenge in seconds from the current time.
- `:params` - (optional) Additional parameters to include in the salt.**Returns:**
A `%Challenge{}` struct containing:
- `:algorithm` - The hashing algorithm used.
- `:challenge` - The hashed challenge string.
- `:maxnumber` - The maximum number used.
- `:salt` - The salt used.
- `:signature` - The HMAC signature of the challenge.---
### `verify_solution/2`
**Description:**
Verifies a given solution by checking its validity and comparing it with the expected challenge.
**Parameters:**
- `payload` - The payload containing challenge details. Can be a `%Payload{}` struct, a JSON object, or a Base64-encoded string.
- `hmac_key` - The key used for HMAC calculation.**Options:**
- `check_expires` - (optional) A boolean to determine if the expiration of the challenge should be checked. Defaults to `true`.
**Returns:**
`true` if the solution is valid and matches the expected challenge; otherwise, `false`.
---
### `verify_fields_hash/4`
**Description:**
Verifies if the hash of form fields matches the provided hash.
**Parameters:**
- `form_data` - The form data as a map with field names and values.
- `fields` - A list of field names to be included in the hash calculation.
- `fields_hash` - The expected hash of the form fields.
- `algorithm` - The algorithm used for hashing (`:sha`, `:sha256`, `:sha512`).**Returns:**
`true` if the computed hash of the fields matches the provided hash; otherwise, `false`.
---
### `verify_server_signature/2`
**Description:**
Verifies the server signature using the provided payload and HMAC key.
**Parameters:**
- `payload` - The payload containing server signature details. Can be a `%ServerSignaturePayload{}` struct, a JSON object, or a Base64-encoded string.
- `hmac_key` - The key used for HMAC calculation.**Returns:**
`true` if the server signature is valid and matches the expected signature; otherwise, `false`.
---
### `solve_challenge/4`
**Description:**
Attempts to solve a given challenge by searching for a number that matches the challenge criteria.
**Parameters:**
- `challenge` - The challenge string to be matched.
- `salt` - The salt used in challenge generation.
- `algorithm` - (optional) The algorithm used for hashing (`:sha`, `:sha256`, `:sha512`). Defaults to `:sha256`.
- `max` - (optional) The maximum number to search. Defaults to `1_000_000`.
- `start` - (optional) The starting number for the search. Defaults to `0`.**Returns:**
A `%Solution{}` struct containing:
- `:number` - The number that solves the challenge.
- `:took` - The time taken to find the solution in milliseconds.If no solution is found, returns `nil`.
## License
MIT