mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-04 18:41:51 +00:00
update crypto docs
This commit is contained in:
parent
c65b9ae385
commit
5391be4b8a
2 changed files with 33 additions and 42 deletions
|
|
@ -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"`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"`
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue