# @crpdo/key

> the key

[![npm](https://img.shields.io/npm/v/@crpdo/key?style=flat&logo=npm)](https://www.npmjs.com/package/@crpdo/key)
[![pipeline](https://gitlab.com/frenware/core/crpdo/key/badges/master/pipeline.svg)](https://gitlab.com/frenware/core/crpdo/key/-/pipelines)
[![license](https://img.shields.io/npm/l/@crpdo/key)](https://gitlab.com/frenware/core/crpdo/key/-/blob/master/LICENSE)
[![downloads](https://img.shields.io/npm/dw/@crpdo/key)](https://www.npmjs.com/package/@crpdo/key) 

[![Gitlab](https://img.shields.io/badge/Gitlab%20-%20?logo=gitlab&color=%23383a40)](https://gitlab.com/frenware/core/crpdo/key)
[![Twitter](https://img.shields.io/badge/@basdwon%20-%20?logo=twitter&color=%23383a40)](https://twitter.com/basdwon)
[![Discord](https://img.shields.io/badge/Basedwon%20-%20?logo=discord&color=%23383a40)](https://discordapp.com/users/basedwon)

The `@crpdo/key` submodule is an integral component of the crpdo project. This module offers an array of classes tailored for managing keys essential for various cryptographic activities. The crpdo project is a cryptography-focused JavaScript library that effectively employs TweetNaCl, HDKey, and numerous other proven libraries. The `@crpdo/key` submodule streamlines key generation, derivation, and management through its simple and intuitive API.

## Features

- Generate seeds and derive keys
- Support for Hierarchical Deterministic (HD) keys
- Sign and verify data
- Encrypt and decrypt data
- Robust, flexible key derivation
- Built-in random number generator

## Installation

```sh
npm install @crpdo/key
```

## Usage

```javascript
const Key = require('@crpdo/key')

// Create a new Key instance with default parameters
const key = new Key()

// Derive a new child key
const childKey = key.derive('child1')

// Sign some data
const signature = key.sign('hello world')

// Verify the signature
const isValid = key.verify('hello world', signature)

// And more...
```

## API

### Classes

1. BaseKey: A class for base keys. It provides methods for getting the public and private key.
2. BoxKey: A class that extends BaseKey, adding methods for encryption and decryption.
3. HdKey: A class that extends BaseKey, adding support for Hierarchical Deterministic (HD) keys. It provides methods for deriving keys and verifying signatures.
4. Key: A utility class for dealing with various types of keys. It provides methods for deriving and signing keys, among others.
5. SignKey: A class that extends BaseKey, adding methods for signing data and verifying signatures.

### `Key`

#### `constructor([options])`

Creates a new `Key` instance. You can optionally pass in an options object to customize the key generation.

#### `derive(slug, [options], [isChild])`

Derives a new key.

#### `ratchet([index], [options])`

Derives a new key at the specified index.

#### `sign(data)`

Signs the given data.

#### `verify(data, signature, [publicKey])`

Verifies the given data against a signature.

#### `encrypt(data, publicKey, nonce, encode)`

Encrypts the given data.

#### `decrypt(data, publicKey, nonce, encode)`

Decrypts the given data.

### `HdKey`

This class provides similar functionalities as `Key`, but is specifically tailored for managing Hierarchical Deterministic (HD) keys.

## Documentation

- [API Reference](/docs/api.md)

## Related Modules

- @crpdo/crypto: Cryptography utility functions
- @crpdo/nacl: Wrapper for TweetNaCl.js

Please see the main crpdo project for a full list of related modules.

## Tests

In order to run the test suite, simply clone the repository and install its dependencies:

```bash
git clone https://gitlab.com/frenware/core/crpdo/key.git
cd basd
npm install
```

To run the tests:

```bash
npm test
```

## Contributing

Thank you! Please see our [contributing guidelines](/docs/contributing.md) for details.

## Donations

If you find this project useful and want to help support further development, please send us some coin. We greatly appreciate any and all contributions. Thank you!

**Bitcoin (BTC):**
```
1JUb1yNFH6wjGekRUW6Dfgyg4J4h6wKKdF
```

**Monero (XMR):**
```
46uV2fMZT3EWkBrGUgszJCcbqFqEvqrB4bZBJwsbx7yA8e2WBakXzJSUK8aqT4GoqERzbg4oKT2SiPeCgjzVH6VpSQ5y7KQ
```

## License

@crpdo/key is [MIT licensed](https://gitlab.com/frenware/core/crpdo/key/-/blob/master/LICENSE).
