diff --git a/doc/sphinx/reference/digest.rst b/doc/sphinx/reference/digest.rst index 62b2810e6a704c45e3b053e137e474928040a041..40353598303910c09f3c3c8465390b33debc8ac6 100644 --- a/doc/sphinx/reference/digest.rst +++ b/doc/sphinx/reference/digest.rst @@ -1,3 +1,5 @@ +.. _digest: + ------------------------------------------------------------------------------- Package `digest` ------------------------------------------------------------------------------- @@ -5,123 +7,78 @@ .. module:: digest A "digest" is a value which is returned by a function (usually a -`Cryptographic hash function`_), applied against a string. Tarantool supports -five types of cryptographic hash functions (SHA-0_, SHA-1_, SHA-2_, MD4_, MD5) +`Cryptographic hash function`_), applied against a string. +Tarantool's digest package supports +five types of cryptographic hash functions (AES_, MD4_, MD5_, SHA-0_, SHA-1_, SHA-2_) as well as a checksum function (CRC32_), two functions for base64_, and two -non-cryptographic hash functions (guava_, murmur_). The functions in digest are: - - :func:`digest.sha() <digest.sha>`, |br| - :func:`digest.sha_hex() <digest.sha_hex>`, |br| - :func:`digest.sha1() <digest.sha1>`, |br| - :func:`digest.sha1_hex() <digest.sha1_hex>`, |br| - :func:`digest.sha224() <digest.sha224>`, |br| - :func:`digest.sha224_hex() <digest.sha224_hex>`, |br| - :func:`digest.sha256() <digest.sha256>`, |br| - :func:`digest.sha256_hex() <digest.sha256_hex>`, |br| - :func:`digest.sha384() <digest.sha384>`, |br| - :func:`digest.sha384_hex() <digest.sha384_hex>`, |br| - :func:`digest.sha512() <digest.sha512>`, |br| - :func:`digest.sha512_hex() <digest.sha512_hex>`, |br| - :func:`digest.md4() <digest.md4>`, |br| - :func:`digest.md4_hex() <digest.md4_hex>`, |br| - :func:`digest.md5() <digest.md5>`, |br| - :func:`digest.md5_hex() <digest.md5_hex>`, |br| - :func:`digest.crc32() <digest.crc32>`, |br| - :func:`digest.crc32.update() <digest.crc32.update>`, |br| - :func:`digest.crc32.new() <digest.crc32.new>`, |br| - :func:`digest.base64_encode() <digest.base64_encode>`, |br| - :func:`digest.base64_decode() <digest.base64_decode>`, |br| - :func:`digest.urandom() <digest.urandom>`, |br| - :func:`digest.guava() <digest.guava>`, |br| - :func:`digest.murmur() <digest.murmur>`, |br| - :func:`digest.murmur.new() <digest.murmur.new>` |br| - - -.. function:: digest.sha({string}) - - Returns 160-bit digest made with SHA-0. Not recommended. - - -.. function:: digest.sha_hex({string}) - - Returns hexadecimal of a digest calculated with sha. - - -.. function:: digest.sha1({string}) - - Returns 160-bit digest made with SHA-1. - - -.. function:: digest.sha1_hex({string}) - - Returns hexadecimal of a digest calculated with sha1. - - -.. function:: digest.sha224({string}) - - Returns 224-bit digest made with SHA-2. - - -.. function:: digest.sha224_hex({string}) - - Returns hexadecimal of a digest calculated with sha224. - - -.. function:: digest.sha256({string}) - - Returns 256-bit digest made with SHA-2. - - -.. function:: digest.sha256_hex({string}) - - Returns hexadecimal of a digest calculated with sha256. +non-cryptographic hash functions (guava_, murmur_). +Some of the digest functionality is also present in the :ref:`crypto <crypto>` package. +The functions in digest are: +:codebold:`digest.aes256cbc.encrypt(`:codeitalic:`string`, :codeitalic:`key`) |br| +Returns 256-bit binary string = digest made with AES. -.. function:: digest.sha384({string}) +:codebold:`digest.md4(`:codeitalic:`string`) |br| +Returns 128-bit binary string = digest made with MD4. |br| - Returns 384-bit digest made with SHA-2. +:codebold:`digest.md4_hex(`:codeitalic:`string`) |br| +Returns 32-byte string = hexadecimal of a digest calculated with md4. +:codebold:`digest.md5(`:codeitalic:`string`) |br| +Returns 128-bit binary string = digest made with MD5. -.. function:: digest.sha384_hex({string}) +:codebold:`digest.md5_hex(`:codeitalic:`string`) |br| +Returns 32-byte string = hexadecimal of a digest calculated with md5. - Returns hexadecimal of a digest calculated with sha384. +:codebold:`digest.sha(`:codeitalic:`string`) |br| +Returns 160-bit binary string = digest made with SHA-0. Not recommended. +:codebold:`digest.sha_hex(`:codeitalic:`string`) |br| +Returns 40-byte string = hexadecimal of a digest calculated with sha. -.. function:: digest.sha512({string}) +:codebold:`digest.sha1(`:codeitalic:`string`) |br| +Returns 160-bit binary string = digest made with SHA-1. - Returns 512-bit digest made with SHA-2. +:codebold:`digest.sha1_hex(`:codeitalic:`string`) |br| +Returns 40-byte string = hexadecimal of a digest calculated with sha1. +:codebold:`digest.sha224(`:codeitalic:`string`) |br| +Returns 224-bit binary string = digest made with SHA-2. -.. function:: digest.sha512_hex({string}) +:codebold:`digest.sha224_hex(`:codeitalic:`string`) |br| +Returns 56-byte string = hexadecimal of a digest calculated with sha224. - Returns hexadecimal of a digest calculated with sha512. +:codebold:`digest.sha256(`:codeitalic:`string`) |br| +Returns 256-bit binary string = digest made with SHA-2. +:codebold:`digest.sha256_hex(`:codeitalic:`string`) |br| +Returns 64-byte string = hexadecimal of a digest calculated with sha256. -.. function:: digest.md4({string}) +:codebold:`digest.sha384(`:codeitalic:`string`) |br| +Returns 384-bit binary string = digest made with SHA-2. - Returns 128-bit digest made with MD4. +:codebold:`digest.sha384_hex(`:codeitalic:`string`) |br| +Returns 96-byte string = hexadecimal of a digest calculated with sha384. +:codebold:`digest.sha512(`:codeitalic:`string`) |br| +Returns 512-bit binary tring = digest made with SHA-2. -.. function:: digest.md4_hex({string}) +:codebold:`digest.sha512_hex(`:codeitalic:`string`) |br| +Returns 128-byte string = hexadecimal of a digest calculated with sha512. - Returns hexadecimal of a digest calculated with md4. +:codebold:`digest.base64_encode(`:codeitalic:`string`) |br| +Returns base64 encoding from a regular string. +:codebold:`digest.base64_decode(`:codeitalic:`string`) |br| +Returns a regular string from a base64 encoding. -.. function:: digest.md5({string}) +:codebold:`digest.urandom(`:codeitalic:`integer`) |br| +Returns array of random bytes with length = integer. - Returns 256-bit digest made with MD5. +:codebold:`digest.crc32(`:codeitalic:`string`) |br| +Returns 32-bit checksum made with CRC32. - -.. function:: digest.md5_hex({string}) - - Returns hexadecimal of a digest calculated with md5. - - -.. function:: digest.crc32({string}) - - Returns 32-bit checksum made with CRC32. - - The crc32 and crc32_update function use the `CRC-32C (Castagnoli)`_ polynomial + The crc32 and crc32_update functions use the `CRC-32C (Castagnoli)`_ polynomial value: 0x11EDC6F41 / 4812730177. If it is necessary to be compatible with other checksum functions in other programming languages, ensure that the other functions use @@ -137,35 +94,14 @@ non-cryptographic hash functions (guava_, murmur_). The functions in digest are: .. _CRC-32C (Castagnoli): https://en.wikipedia.org/wiki/Cyclic_redundancy_check#Standards_and_common_use +:codebold:`digest.crc32.new()` |br| +Initiates incremental crc32. +See :ref:`incremental methods <incremental-digests>` notes. -.. function:: digest.crc32.update({number, string}) - - Returns update of a checksum calculated with CRC32. See :func:`digest.crc32() <digest.crc32>` notes. - - -.. function:: digest.crc32.new() - - Initiates incremental crc32. See :func:`incremental digests <digest.murmur.new>` notes. - - -.. function:: digest.base64_encode({string}) - - Returns base64 encoding from a regular string. +.. _digest-guava: - -.. function:: digest.base64_decode({string}) - - Returns a regular string from a base64 encoding. - - -.. function:: digest.urandom({integer}) - - Returns array of random bytes with length = integer. - - -.. function:: digest.guava({integer}, {integer}) - - Returns a number made with consistent hash. +:codebold:`digest.guava(`:codeitalic:`integer, integer`) |br| +Returns a number made with consistent hash. The guava function uses the `Consistent Hashing`_ algorithm of the Google guava library. The first parameter should be a @@ -173,22 +109,23 @@ non-cryptographic hash functions (guava_, murmur_). The functions in digest are: buckets; the returned value will be an integer between 0 and the number of buckets. For example, - .. code-block:: tarantoolsession - - tarantool> digest.guava(10863919174838991, 11) - --- - - 8 - ... + :codenormal:`tarantool>` :codebold:`digest.guava(10863919174838991, 11)` |br| + :codenormal:`---` |br| + :codenormal:`- 8` |br| + :codenormal:`...` |br| +:codebold:`digest.murmur(`:codeitalic:`string`) |br| +Returns 32-bit binary string = digest made with MurmurHash. -.. function:: digest.murmur({string}) +:codebold:`digest.murmur.new([`:codeitalic:`seed`]) |br| +Initiates incremental MurmurHash. +See :ref:`incremental methods <incremental-digests>` notes. - Returns 32-bit digest made with MurmurHash. +.. _incremental-digests: - -.. function:: digest.murmur.new([{seed}]) - - Initiates incremental MurmurHash. +========================================= +Incremental methods in the digest package +========================================= Suppose that a digest is done for a string 'A', then a new part 'B' is appended to the string, @@ -225,43 +162,40 @@ In the following example, the user creates two functions, ``password_insert()`` which inserts a SHA-1_ digest of the word "**^S^e^c^ret Wordpass**" into a tuple set, and ``password_check()`` which requires input of a password. -.. code-block:: tarantoolsession - - tarantool> digest = require('diges') - --- - ... - tarantool> function password_insert() - > box.space.tester:insert{12345, digest.sha1('^S^e^c^ret Wordpass')} - > return 'OK' - > end - --- - ... - tarantool> function password_check(password) - > local t - > local t = box.space.tester:select{12345} - > if digest.sha1(password) == t[2] then - > print('Password is valid') - > else - > print('Password is not valid') - > end - > end - --- - ... - tarantool> password_insert() - --- - - 'OK' - ... + :codenormal:`tarantool>` :codebold:`digest = require('digest')` |br| + :codenormal:`---` |br| + :codenormal:`...` |br| + :codenormal:`tarantool>` :codebold:`function password_insert()` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`box.space.tester:insert{12345, digest.sha1('^S^e^c^ret Wordpass')}` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`return 'OK'` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`end` |br| + :codenormal:`---` |br| + :codenormal:`...` |br| + :codenormal:`tarantool>` :codebold:`function password_check(password)` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| :codebold:`local t` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| :codebold:`local t = box.space.tester:select{12345}` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| :codebold:`if digest.sha1(password) == t[2] then` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| |nbsp| |nbsp| :codebold:`print('Password is valid')` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| :codebold:`else` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| |nbsp| |nbsp| :codebold:`print('Password is not valid')` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` |nbsp| :codebold:`end` |br| + |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| |nbsp| :codenormal:`>` :codebold:`end` |br| + :codenormal:`---` |br| + :codenormal:`...` |br| + :codenormal:`tarantool>` :codebold:`password_insert()` |br| + :codenormal:`---` |br| + :codenormal:`- 'OK'` |br| + :codenormal:`...` |br| If a later user calls the ``password_check()`` function and enters the wrong password, the result is an error. -.. code-block:: tarantoolsession - - tarantool> password_check('Secret Password') - Password is not valid - --- - ... + :codenormal:`tarantool>` :codebold:`password_check('Secret Password')` |br| + :codenormal:`Password is not valid` |br| + :codenormal:`---` |br| + :codenormal:`...` |br| +.. _AES: https://en.wikipedia.org/wiki/Advanced_Encryption_Standard .. _SHA-0: https://en.wikipedia.org/wiki/Sha-0 .. _SHA-1: https://en.wikipedia.org/wiki/Sha-1 .. _SHA-2: https://en.wikipedia.org/wiki/Sha-2 diff --git a/doc/sphinx/reference/index.rst b/doc/sphinx/reference/index.rst index 9c42d3a5a62c2a0443635c42381a5052d450f517..1592cedf9c99749030cb1810f44b533479376a04 100644 --- a/doc/sphinx/reference/index.rst +++ b/doc/sphinx/reference/index.rst @@ -11,6 +11,7 @@ box_error clock console + crypto csv digest expirationd diff --git a/doc/sphinx/reference/shard.rst b/doc/sphinx/reference/shard.rst index 3cb39cc9242875336bcf768136d6a0b1e9652d09..a33033bc0a83f12c4496e7b484346661ed1fb03d 100644 --- a/doc/sphinx/reference/shard.rst +++ b/doc/sphinx/reference/shard.rst @@ -23,7 +23,7 @@ First some terminology: decide which shard the tuple belongs to. The hash function is `consistent`_ so that changing the number of servers will not affect results for many keys. The specific hash function that the shard package uses is - :func:`digest.guava` in the :codeitalic:`digest` package. + :ref:`digest.guava <digest-guava>` in the :codeitalic:`digest` package. **Queue** A temporary list of recent update requests. Sometimes called "batching".