sm/3.js

import { SM3 } from "../../utils/sm3";

/**
 * SM3 哈希算法实现
 * @module SM3
 */

/**
 * SM3 密码杂凑算法实现
 * 
 * @description SM3 是中华人民共和国密码行业标准,由国家密码管理局于 2010 年 12 月发布。
 *              SM3 算法适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证,
 *              以及随机数的生成等。该算法对长度为 l (l < 2^64) 的消息,
 *              经过填充和迭代压缩,生成长度为 256 位的杂凑值。
 * 
 * @module SM3
 * @category sm
 * @alias sm3
 * @author xkloveme <xkloveme@gmail.com>
 * @since 0.1.0
 * @date 2024-08-10 21:53:59
 */

/**
 * SM3 消息摘要算法
 * 
 * @description 计算指定数据的 SM3 哈希值。SM3 是一种密码杂凑函数,
 *              具有以下特点:
 *              - 输出长度固定为 256 位(32 字节)
 *              - 单向性:从哈希值无法推导出原始数据
 *              - 雪崩效应:输入的微小变化会导致输出的巨大变化
 *              - 抗碰撞性:难以找到两个不同的输入产生相同的哈希值
 * 
 * @param {string|Buffer} data - 需要计算哈希的数据,可以是字符串或 Buffer 对象
 * @param {Object} [options] - 哈希计算选项
 * @param {string} [options.encoding='hex'] - 输出编码格式,可选值:'hex'、'base64'、'buffer'
 * @param {string} [options.inputEncoding='utf8'] - 输入数据编码格式(当 data 为字符串时)
 * 
 * @returns {string|Buffer} SM3 哈希值,格式由 options.encoding 决定
 * 
 * @throws {TypeError} 当输入参数类型不正确时抛出错误
 * @throws {Error} 当哈希计算失败时抛出错误
 * 
 * @example
 * // 基本用法 - 计算字符串的 SM3 哈希值
 * import { sm3 } from 'jxk'
 * 
 * const message = 'Hello, World!'
 * const hash = sm3(message)
 * console.log(hash)
 * // => '44f0061e69fa6fdfc290c494654a05dc0c053da7e5c52b84ef93a9d67d3fff88'
 * 
 * @example
 * // 使用不同的输出格式
 * const data = '中文测试'
 * 
 * // 十六进制输出(默认)
 * const hexHash = sm3(data, { encoding: 'hex' })
 * console.log(hexHash) // => '66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0'
 * 
 * // Base64 输出
 * const base64Hash = sm3(data, { encoding: 'base64' })
 * console.log(base64Hash) // => 'Zsfzxj7u7dnR8tRr3BDk4kFnxIdc8veiKX2gK49LqOA='
 * 
 * @example
 * // 处理 Buffer 数据
 * const buffer = Buffer.from('Binary data', 'utf8')
 * const bufferHash = sm3(buffer)
 * console.log(bufferHash)
 * // => 'f7c3bc1d808e04732adf679965ccc34ca7ae3441b49bdc6502dd27e4d8c4c43'
 * 
 * @example
 * // 用于数字签名前的消息摘要
 * const document = '重要合同内容...'
 * const digest = sm3(document)
 * console.log('文档摘要:', digest)
 * 
 * @example
 * // 用于密码存储(注意:实际应用中应加盐)
 * const password = 'userPassword123'
 * const salt = 'randomSalt456'
 * const hashedPassword = sm3(password + salt)
 * console.log('密码哈希:', hashedPassword)
 * 
 * @example
 * // 用于数据完整性校验
 * const fileData = 'file content...'
 * const checksum = sm3(fileData)
 * console.log('文件校验和:', checksum)
 * 
 * @see {@link https://www.oscca.gov.cn/sca/xxgk/2010-12/17/content_1002389.shtml} SM3 密码杂凑算法标准
 * @see {@link sm2} SM2 椭圆曲线公钥密码算法
 * @see {@link sm4} SM4 分组密码算法
 */
export default function sm3(data, options) {
    return SM3(data, options)
}