update crypto docs

This commit is contained in:
dagger 2026-08-22 17:47:59 +07:00
parent c65b9ae385
commit 5391be4b8a
2 changed files with 33 additions and 42 deletions

View file

@ -1,14 +1,6 @@
# *crypto* library # *crypto* library
The library provides common cryptographic functions for mods The library provides common cryptographic functions
TLS and HTTP are not part of this library. They can use crypto for expensive
operations
Keys, signatures, hashes and encrypted data are passed as regular Lua strings.
Strings may contain zero bytes
The current API version is available in `crypto.API_VERSION`
## Hashing ## Hashing
@ -17,24 +9,27 @@ crypto.sha256(data: str) -> str
crypto.sha384(data: str) -> str crypto.sha384(data: str) -> str
crypto.sha512(data: str) -> str crypto.sha512(data: str) -> str
crypto.md5(data: str) -> str crypto.md5(data: str) -> str
crypto.hash(hash: str, data: str) -> str crypto.hash(hash: str, data: str) -> str
crypto.hmac(hash: str, key: str, data: str) -> str crypto.hmac(hash: str, key: str, data: str) -> str
``` ```
Supported names are `SHA256`, `SHA384`, `SHA512` and `MD5` Supported names are `SHA256`, `SHA384`, `SHA512` and `MD5`
MD5 is provided for old formats. SHA256 should be used for new data MD5 is needed for compatibility with old formats. SHA256 is better for new data
Large data can be hashed in parts Large files can be passed in parts
```lua ```lua
local hash = crypto.hash_new("SHA256") local hash = crypto.hash_new("SHA256")
hash:update(part1) hash:update(part1)
hash:update(part2) hash:update(part2)
local result = hash:final() local result = hash:final()
``` ```
Call `reset` before using the context again The context can be cleared with `reset` after `final`
## Signatures ## Signatures
@ -45,7 +40,11 @@ crypto.ed25519_sign(private_key: str, message: str) -> str
crypto.ed25519_verify(public_key: str, message: str, signature: str) crypto.ed25519_verify(public_key: str, message: str, signature: str)
-> true -> true
-> false, error -> false, error
```
Ed25519 keys are 32 bytes long. A signature is 64 bytes long
```lua
crypto.ecdsa_keypair(curve: str) -> private_key, public_key crypto.ecdsa_keypair(curve: str) -> private_key, public_key
crypto.ecdsa_public(curve: str, private_key: str) -> str crypto.ecdsa_public(curve: str, private_key: str) -> str
crypto.ecdsa_sign(curve: str, private_key: str, message: str, hash: str) -> str crypto.ecdsa_sign(curve: str, private_key: str, message: str, hash: str) -> str
@ -53,24 +52,27 @@ crypto.ecdsa_verify(curve: str, public_key: str, message: str,
signature: str, hash: str) signature: str, hash: str)
-> true -> true
-> false, error -> false, error
```
Available curves are `P-256`, `P-384` and `P-521`
An ECDSA public key is stored as an uncompressed SEC1 point. A signature is
stored in DER format
```lua
crypto.rsa_pkcs1_verify(hash: str, modulus: str, exponent: str, crypto.rsa_pkcs1_verify(hash: str, modulus: str, exponent: str,
message: str, signature: str) message: str, signature: str)
-> true -> true
-> false, error -> false, error
crypto.rsa_pss_verify(hash: str, modulus: str, exponent: str, crypto.rsa_pss_verify(hash: str, modulus: str, exponent: str,
message: str, signature: str, salt_length: int) message: str, signature: str, salt_length: int)
-> true -> true
-> false, error -> false, error
``` ```
Ed25519 keys are 32 bytes and signatures are 64 bytes RSA modulus and exponent are passed in big endian. A `salt_length` value of `-1`
uses the hash size
ECDSA supports `P-256`, `P-384` and `P-521`. Public keys use the uncompressed
SEC1 format and signatures use DER
RSA modulus and exponent use big endian. A `salt_length` of `-1` uses the hash
size. RSA key generation is not provided, Ed25519 is easier for new keys
## Key exchange ## Key exchange
@ -85,9 +87,9 @@ crypto.p256_public(private_key: str) -> str
crypto.p256_shared(private_key: str, peer_public_key: str) -> str crypto.p256_shared(private_key: str, peer_public_key: str) -> str
``` ```
`x25519` and `x25519_shared` do the same operation `x25519` and `x25519_shared` perform the same operation
Pass the shared secret through HKDF before using it as a key The shared secret should not be used as a ready key. Pass it through HKDF first
## Encryption ## Encryption
@ -109,29 +111,31 @@ AES GCM accepts 16 and 32 byte keys
ChaCha20 Poly1305 uses a 32 byte key and a 12 byte nonce ChaCha20 Poly1305 uses a 32 byte key and a 12 byte nonce
A 16 byte tag is appended to ciphertext. Decryption returns nothing when the A 16 byte tag is appended to encrypted data
tag is invalid
Never use the same nonce twice with the same key Never reuse a nonce with the same key
## Other functions ## Other functions
```lua ```lua
crypto.random_bytes(length: int) -> str crypto.random_bytes(length: int) -> str
crypto.constant_time_equal(left: str, right: str) -> bool crypto.constant_time_equal(left: str, right: str) -> bool
crypto.hkdf_extract(hash: str, salt: str, ikm: str) -> str crypto.hkdf_extract(hash: str, salt: str, ikm: str) -> str
crypto.hkdf_expand(hash: str, prk: str, info: str, length: int) -> str crypto.hkdf_expand(hash: str, prk: str, info: str, length: int) -> str
crypto.pbkdf2(hash: str, password: str, salt: str, crypto.pbkdf2(hash: str, password: str, salt: str,
iterations: int, length: int) -> str iterations: int, length: int) -> str
crypto.scrypt(password: str, salt: str, n: int, r: int, p: int, crypto.scrypt(password: str, salt: str, n: int, r: int, p: int,
length: int, [optional]max_memory: int=0) -> str length: int, [optional]max_memory: int=0) -> str
crypto.features() -> table crypto.features() -> table
``` ```
Use scrypt or PBKDF2 with a random salt for passwords. A regular SHA256 hash is Use scrypt or PBKDF2 with a random salt for passwords. A regular SHA256 hash is
not suitable for password storage not suitable for passwords
`features` returns the OpenSSL version and available functions `features` returns the OpenSSL version and a list of available features
An invalid signature returns `false, "invalid_signature"` An invalid signature returns `false, "invalid_signature"`

View file

@ -1,14 +1,6 @@
# Библиотека *crypto* # Библиотека *crypto*
Библиотека предоставляет основные криптографические функции для модов Библиотека предоставляет основные криптографические функции
TLS и HTTP в нее не входят. Эти протоколы используют crypto для тяжелых
вычислений
Все бинарные значения передаются обычными Lua строками. Это касается ключей,
подписей, хешей и зашифрованных данных. Строки могут содержать нулевые байты
Текущая версия API находится в `crypto.API_VERSION`
## Хеширование ## Хеширование
@ -83,9 +75,6 @@ crypto.rsa_pss_verify(hash: str, modulus: str, exponent: str,
Модуль и экспонента RSA передаются в big endian. Значение `salt_length = -1` Модуль и экспонента RSA передаются в big endian. Значение `salt_length = -1`
использует размер хеша использует размер хеша
Генерации RSA ключей в библиотеке нет. Для новых ключей проще использовать
Ed25519
## Обмен ключами ## Обмен ключами
```lua ```lua
@ -124,8 +113,7 @@ AES GCM принимает ключи размером 16 или 32 байта
ChaCha20 Poly1305 использует ключ размером 32 байта и nonce размером 12 байт ChaCha20 Poly1305 использует ключ размером 32 байта и nonce размером 12 байт
В конец зашифрованных данных добавляется тег размером 16 байт. При неверном В конец зашифрованных данных добавляется тег размером 16 байт
теге функция расшифровки ничего не возвращает
Нельзя повторно использовать один nonce с тем же ключом Нельзя повторно использовать один nonce с тем же ключом
@ -149,8 +137,7 @@ crypto.features() -> table
Для хранения паролей следует использовать scrypt или PBKDF2 со случайной Для хранения паролей следует использовать scrypt или PBKDF2 со случайной
солью. Обычный SHA256 для паролей не подходит солью. Обычный SHA256 для паролей не подходит
`features` возвращает версию OpenSSL и список доступных возможностей. Это `features` возвращает версию OpenSSL и список доступных возможностей
можно использовать если мод запускается на разных сборках движка
Неверная подпись возвращает `false, "invalid_signature"` Неверная подпись возвращает `false, "invalid_signature"`