diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | jsdoc/conf.json | 4 | ||||
-rw-r--r-- | lib/crypto.uc | 146 |
3 files changed, 152 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 727a9b8..e5a5d27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -318,6 +318,10 @@ if(CRYPTO_OPENSSL_SUPPORT) target_link_libraries(crypto_openssl_lib crypto) endif() +if(CRYPTO_MBEDTLS_SUPPORT OR CRYPTO_OPENSSL_SUPPORT) + install(FILES lib/crypto.uc DESTINATION share/ucode) +endif() + if(UNIT_TESTING) enable_testing() add_definitions(-DUNIT_TESTING) diff --git a/jsdoc/conf.json b/jsdoc/conf.json index 9d3c995..523243b 100644 --- a/jsdoc/conf.json +++ b/jsdoc/conf.json @@ -5,8 +5,8 @@ }, "source": { "include": ["."], - "exclude": ["CMakeFiles"], - "includePattern": ".+\\.c$" + "exclude": ["CMakeFiles", "tests"], + "includePattern": ".+\\.(c|uc)$" }, "plugins": [ "plugins/markdown", diff --git a/lib/crypto.uc b/lib/crypto.uc new file mode 100644 index 0000000..43581c5 --- /dev/null +++ b/lib/crypto.uc @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2024 Mikael Magnusson <mikma@users.sourceforge.net> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/** + * # Crypto + * + * The `crypto` module provides message digest and message signing and + * verification. There are two alternative implementations, `crypto_openssl` + * and `crypto_mbedtls`. The `crypto_openssl` is preferred if available since + * it supports EdDSA in addition to all algorithms supported + * by `crypto_mbedtls`. + * + * @module crypto + */ + +/** + * Represents a public key context. + * + * @class module:crypto.pk + * @hideconstructor + */ + +/** + * @function module:crypto#md_digest + * + * @param {string} alg + * Message digest algorithm. + * + * @param {string} input + * Input to the message digest algorithm. + * + * @returns {string} + */ + +/** + * @function module:crypto#pk + * + * @returns {crypto.pk} + */ + +/** + * @function module:crypto.pk#get_public_key + * + * @returns {?string} - Public key in DER format. + */ + +/** + * @function module:crypto.pk#keygen + * + * @param {('EC'|'RSA'|'ED25519')} type + * Public key type. + * + * @param {('P-192'|'P-224'|'P-256'|'P-384'|'P-521'|'brainpoolP256r1'|'brainpoolP384r1'|'brainpoolP512r1'|number)} [param] + * EC curve name (`string`), or RSA key length (`number`). + * + * @returns {string} + */ + +/** + * @function module:crypto.pk#set_public_key + * + * @param {?string} key + * A public key in DER format. + */ + +/** + * Available only if the `crypto_openssl` module is installed. + * + * @function module:crypto.pk#set_raw_public_key + * + * @param {('ED25519'|'ED448')} type + * @param {string} key + * Public key in raw format. + */ + +/** + * @function module:crypto.pk#sign + * + * @param {?('SHA1'|'SHA224'|'SHA256'|'SHA384'|'SHA512'|string)} alg + * The message digest algorithm. + * + * @param {string} input + * The message to be signed. + * + * @returns {string} + */ + +/** + * @function module:crypto.pk#verify + * + * @param {?('SHA1'|'SHA224'|'SHA256'|'SHA384'|'SHA512'|string)} alg + * The message digest algorithm. + * + * @param {string} input + * The message to be verified. + * + * @param {string} sig + * The signature to be verified. + * + * @returns {boolean} + */ + +let crypto; + +try { + crypto = require('crypto_openssl'); +} catch { + try { + crypto = require('crypto_mbedtls'); + } catch { + die(`No module named 'crypto_openssl' or 'crypto_mbedtls' could be found`); + } +} + +export +function md_digest(...args) { + return crypto.md_digest(...args); +}; + +export +function md_list(...args) { + return crypto.md_list(...args); +}; + +export +function pk_list(...args) { + return crypto.pk_list(...args); +}; + +export +function pk(...args) { + return crypto.pk(...args); +}; |