Skip to content

coming-chat/go-owcrypt

 
 

Repository files navigation

go-owcrypt

License: GPL v3

更新日志 2020.01.08

1. 移除C语言依赖
2. 移除部分接口的入参长度描述
        - 签名接口 Signature 的 IDlen 和 message_len
        - 验签接口 Verify 的 IDlen 和 message_len
        - 加解密接口对明文和密文长度的描述
        - 协商类接口的 IDinitiator_len 和 IDresponder_len
3. 签名接口添加一个输出用于存放v,签名结果目前输出为满足Canical编码规则且S序列化之后的结果。
4. 不再支持
        - PreprocessRandomNum
        - GetCurveOrder

go package详情


go-owcrypt 提供目前区块链技术中使用的椭圆曲线算法与哈希算法。 目前支持的算法包括:

        公钥计算算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
                EDDSA类 : curve25519、ed25519、x25519
        签名算法:    
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
                EDDSA类 : curve25519、ed25519、x25519
        验签算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
                EDDSA类 : curve25519、ed25519、x25519
        加密算法:
                ECDSA类 : sm2-std
        密钥协商算法:
                ECDSA类 : sm2-std-DH、 sm2-std-ElGamal
        G点相乘算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
                EDDSA类 : ed25519、x25519
        G点的乘加算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
                EDDSA类 : ed25519
        点的压缩与解压缩算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
        从签名恢复公钥算法:
                ECDSA类 : secp256k1、secp256r1、primv1、NIST-P256、sm2-std
        点的域转换算法:
                x25519-to-ed25519、ed25519-to-x25519
        哈希算法:
                sha1,sha256,double-sha256,sha512,sha3-256,sha3-512
                md4,md5,
                ripemd160
                blake256,blake512,blake2b,blake2s
                sm3,hash160
                keccak256,keccak512,keccak256-ripemd160

        HMAC算法:
                sha256,sha512,sm3

功能列表


接口与使用方法说明

产生公钥:

func GenPubkey(prikey []byte, pubkey []byte, typeChoose uint32) uint16

入参:
        prikey     : 私钥
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
                            ECC_CURVE_ED25519_NORMAL(0xECC00003)
                            ECC_CURVE_ED25519(0xECC00004)
	                    ECC_CURVE_X25519 (0xECC00005)
出参:    
        pubkey    : 公钥
返回值: uint16类型,如下:
                        SUCCESS(0x0001)                 : 生成成功
                        ECC_PRIKEY_ILLEGAL(0xE000)      : 传入了非法私钥
                        ECC_WRONG_TYPE(0xE002)          : 传入了错误的type
Tips:
        对于ECDSA类曲线算法,接口返回的公钥为未压缩的坐标点形式,X坐标在前,Y坐标在后,无前缀(0x04)
        对于EDDSA类曲线算法,接口接受的私钥为私钥本身,不是私钥+公钥拼接后的数组

数字签名:

func Signature(prikey []byte, ID []byte, message []byte, signature []byte,v byte, typeChoose uint32) uint16

入参:   
        prikey     : 私钥
        ID         : 签名方标识符,仅SM2签名时需要传入
        message    : 待签名的消息
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
                            ECC_CURVE_ED25519_NORMAL(0xECC00003)
                            ECC_CURVE_ED25519(0xECC00004)
	                    ECC_CURVE_X25519 (0xECC00005)
出参:
        signature  : 签名值
        v          :  rsv格式签名的v
返回值: 
        uint16类型,如下:
                        SUCCESS(0x0001)                 : 生成成功
                        ECC_PRIKEY_ILLEGAL(0xE000)      : 传入了非法私钥
                        ECC_WRONG_TYPE(0xE002)          : 传入了错误的type
                        ECC_MISS_ID(0xE003)             : SM2签名时未传入签名方标识符

预置随机数:

[1.1.0版本移除]func PreprocessRandomNum(rand []byte) (ret uint16)

入参:
        rand:随机数
返回值:
        uint16类型,如下:
                        SUCCESS(0x0001)                 : 成功
                        其他                             : 失败
Tips:
        该接口主要用于签名算法采用固定随机数的情况,使用时应配合Signature接口使用,顺序为:
        1,PreprocessRandomNum - 写入随机数
        2. Signature调用签名 - 签名 
        签名时,应该将传入的typeChose或上 NOUNCE_OUTSIDE_FLAG 以使随机数生效

签名验证:

func Verify(pubkey []byte, ID []byte, message []byte, signature []byte, typeChoose uint32) uint16


入参:
        pubkey     : 公钥
        ID         : 待验证方标识符,仅SM2签名时需要传入
        message    : 待验证的消息
        signature  : 签名值
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
                            ECC_CURVE_ED25519_NORMAL(0xECC00003)
                            ECC_CURVE_ED25519(0xECC00004)
	                        ECC_CURVE_X25519 (0xECC00005)
出参:   无
返回值:
        uint16类型, 如下:
                        SUCCESS(0x0001)                      : 签名验证通过
                        FAILURE(0x0000)                      : 签名验证不通过
                        ECC_PUBKEY_ILLEGAL(0xE001)           : 传入了非法公钥
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type
                        ECC_MISS_ID(0xE002)                  : SM2验签时未传入被验证方标识符

加密:

func Encryption(pubkey []byte, plain []byte, typeChoose uint32) (cipher []byte, ret uint16)

入参:
        pubkey     :公钥
        plain      :明文
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参:  
        cipher     : 密文
返回值:
        ret: 结果返回码,如下:
                        SUCCESS(0x0001)                      : 加密成功
                        ECC_PUBKEY_ILLEGAL(0xE001)           : 传入了非法公钥
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type   
Tips:
        目前仅支持国密居推荐sm2参数的加密

解密:

func Decryption(prikey []byte, cipher []byte, typeChoose uint32) (plain []byte, ret uint16)

入参:
        prikey     : 私钥
        cipher     : 密文
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
        plain      : 明文
返回值:
        ret: 结果如下:
                        SUCCESS(0x0001)                      : 解密成功
                        FAILURE(0x0000)                      : 解密失败,密文非法
                        ECC_PRIKEY_ILLEGAL(0xE000)           : 传入了非法私钥
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type
Tips:
        目前仅支持国密居推荐sm2参数的解密

协商:

Diffi-Hellman模式协商流程:
        1. KeyAgreement_initiator_step1
        2. KeyAgreement_responder_step1
        3. KeyAgreement_initiator_step2
        4. KeyAgreement_responder_step2
ElGamal模式协商流程:
        1. KeyAgreement_initiator_step1
        2. KeyAgreement_responder_ElGamal_step1
        3. KeyAgreement_initiator_step2
        4. KeyAgreement_responder_step2

func KeyAgreement_initiator_step1(tmpPrikeyInitiator []byte, tmpPubkeyInitiator []byte, typeChoose uint32)

入参:
        typeChoose              : 算法类型选择,目前仅支持sm2p256v1
                                       ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
        tmpPrikeyInitiator      : 发起方临时私钥
        tmpPubkeyInitiator      : 发起方临时公钥
返回值:
        无

func KeyAgreement_initiator_step2(IDinitiator []byte, IDinitiator_len uint16, IDresponder []byte, IDresponder_len uint16, prikeyInitiator []byte, pubkeyInitiator []byte, pubkeyResponder []byte, tmpPrikeyInitiator []byte, tmpPubkeyInitiator []byte, tmpPubkeyResponder []byte, Sin []byte, Sout []byte, keylen uint16, key []byte, typeChoose uint32) uint16

入参:
        IDinitiator             : 发起方标识符
        IDinitiator_len         : 发起方标识符长度
        IDresponder             : 响应方标识符
        IDresponder_len         : 响应方标识符长度
        prikeyInitiator         : 发起方私钥
        pubkeyInitiator         : 发起方公钥
        pubkeyResponder         : 响应方公钥
        tmpPrikeyInitiator      : 发起方临时私钥
        tmpPubkeyInitiator      : 发起方临时公钥
        tmpPubkeyResponder      : 响应方临时公钥
        Sin                     : 响应方发来的校验值
        keylen                  : 期待的协商结果长度
        typeChoose              : 算法类型选择,目前仅支持sm2p256v1
                                       ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
        Sout                    : 发送给响应方的校验值
        key                     : 协商结果
返回值:
        uint16类型, 结果如下:
                        SUCCESS(0x0001)                      : 发起方协商成功
                        FAILURE(0x0000)                      : 发起方协商失败
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type

func KeyAgreement_responder_step1(IDinitiator []byte, IDinitiator_len uint16, IDresponder []byte, IDresponder_len uint16, prikeyResponder []byte, pubkeyResponder []byte, pubkeyInitiator []byte, tmpPubkeyResponder []byte, tmpPubkeyInitiator []byte, Sinner []byte, Souter []byte, keylen uint16, key []byte, typeChoose uint32) uint16

入参:
        IDinitiator             : 发起方标识符
        IDinitiator_len         : 发起方标识符长度
        IDresponder             : 响应方标识符
        IDresponder_len         : 响应方标识符长度
        prikeyResponder         : 响应方私钥
        pubkeyResponder         : 响应方公钥
        pubkeyInitiator         : 发起方公钥
        tmpPubkeyResponder      : 响应方临时公钥
        tmpPubkeyInitiator      : 发起方临时公钥
        keylen                  : 期待的协商结果长度
        typeChoose              : 算法类型选择,目前仅支持sm2p256v1
                                       ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
        Sinner                  : 本地暂存的校验值
        Souter                  : 发送给发起方的校验值
        key                     : 协商结果
返回值:
        uint16类型, 结果如下:
                        SUCCESS(0x0001)                      : 响应方产生成功
                        FAILURE(0x0000)                      : 响应方协商失败
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type

func KeyAgreement_responder_ElGamal_step1(IDinitiator []byte,IDinitiator_len uint16,IDresponder []byte,IDresponder_len uint16,prikeyResponder []byte,pubkeyResponder []byte,pubkeyInitiator []byte,tmpPubkeyInitiator []byte,keylen uint16,random []byte,typeChoose uint32) (key, tmpPubkeyResponder, Sinner, Souter []byte, ret uint16)

入参:
        IDinitiator             : 发起方标识符
        IDinitiator_len         : 发起方标识符长度
        IDresponder             : 响应方标识符
        IDresponder_len         : 响应方标识符长度
        prikeyResponder         : 响应方私钥
        pubkeyResponder         : 响应方公钥
        pubkeyInitiator         : 发起方公钥
        tmpPubkeyResponder      : 响应方临时公钥
        keylen                  : 期待的协商结果长度
        random                  : 固定临时私钥
        typeChoose              : 算法类型选择,目前仅支持sm2p256v1
                                       ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
        Sinner                  : 本地暂存的校验值
        Souter                  : 发送给发起方的校验值
        key                     : 协商结果
返回值:
        uint16类型, 结果如下:
                        SUCCESS(0x0001)                      : 响应方产生成功
                        FAILURE(0x0000)                      : 响应方协商失败
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type

func KeyAgreement_responder_step2(Sinitiator []byte, Sresponder []byte, typeChoose uint32) uint16

入参:
        Sinitiator              : 发起方发来的校验值
        Sresponder              : 响应方暂存的校验值
        typeChoose              : 算法类型选择,目前仅支持sm2p256v1
                                       ECC_CURVE_SM2_STANDARD(0xECC00002)
出参: 
       无
返回值:
        uint16类型, 结果如下:
                        SUCCESS(0x0001)                      : 响应方协商成功
                        FAILURE(0x0000)                      : 响应方协商失败
                        ECC_WRONG_TYPE(0xE002)               : 传入了错误的type

G点相乘:

func Point_mulBaseG(scalar []byte, typeChoose uint32) []byte

入参:
        scalar     : 乘子
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
                            ECC_CURVE_ED25519(0xECC00004)
	                    ECC_CURVE_X25519 (0xECC00005)
出参:    
        pubkey    : 公钥
返回值: uint16类型,如下:
                        SUCCESS(0x0001)                 : 生成成功
                        ECC_PRIKEY_ILLEGAL(0xE000)      : 传入了非法私钥
                        ECC_WRONG_TYPE(0xE002)          : 传入了错误的type
Tips:
        对于ECDSA类曲线算法,接口返回的公钥为压缩的坐标点形式
        对于EDDSA类曲线算法,由于curve25519的特殊性,此处可用ED25519进行计算,但与其私钥到公钥的计算流程并不一致

G点的乘加操作: [scalar] * G + pointin

func Point_mulBaseG_add(pointin, scalar []byte, typeChoose uint32) (point []byte, isinfinity bool)

入参:
        pointin    : 用于相加的点
        scalar     : 乘子
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
                            ECC_CURVE_ED25519(0xECC00004)
	                    ECC_CURVE_X25519 (0xECC00005)
出参:    
        pubkey    : 公钥
返回值: uint16类型,如下:
                        SUCCESS(0x0001)                 : 生成成功
                        ECC_PRIKEY_ILLEGAL(0xE000)      : 传入了非法私钥
                        ECC_WRONG_TYPE(0xE002)          : 传入了错误的type
Tips:
        对于ECDSA类曲线算法,接口返回的公钥为未压缩的坐标点形式,X坐标在前,Y坐标在后,无前缀(0x04)
        对于EDDSA类曲线算法,由于curve25519的特殊性,此处可用ED25519进行计算,但与其私钥到公钥的计算流程并不一致

获取曲线的基域特征

[1.1.0版本移除]func GetCurveOrder(typeChoose uint32) []byte

入参:
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参:    
        []byte    : 基域特征

点的压缩

func PointCompress(point []byte, typeChoose uint32) []byte

入参:
        point      : 待压缩的点
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参:    
        []byte    : 压缩后的点
Tips:
        入参的待压缩点可以是X+Y的形式,也可以是0x04+X+Y的形式,均可以识别

点的解压缩

func PointDecompress(point []byte, typeChoose uint32) []byte

入参:
        point      : 待解压缩的点
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参:    
        []byte    : 解压缩后的点
Tips:
        解压缩后的点是0x04+X+Y的形式

从签名恢复公钥

func RecoverPubkey(sig []byte, msg []byte, typeChoose uint32) ([]byte, uint16)

入参:
        sig        : 签名
        msg        : 签名对应的消息
        typeChoose : 算法类型选择,可选参数如下
                            ECC_CURVE_SECP256K1(0xECC00000)
                            ECC_CURVE_SECP256R1(0xECC00001)
                            ECC_CURVE_PRIMEV1(0xECC00001)
                            ECC_CURVE_NIST_P256(0xECC00001)
                            ECC_CURVE_SM2_STANDARD(0xECC00002)
出参:    
        []byte    : 解压缩后的点
Tips:
        签名采用 R || S || V 的形式顺序排放

点的域坐标转换:

func CURVE25519_convert_X_to_Ed(x []byte) ([]byte, error)

入参:
        x          : x25519坐标点
出参:    
        []byte     : ed25519坐标点
返回值:
        error      : nil时为转换正确

func CURVE25519_convert_Ed_to_X(ed []byte) ([]byte, error)

入参:
        x          : ed25519坐标点
出参:    
        []byte     : x25519坐标点
返回值:
        error      : nil时为转换正确

哈希算法:

func Hash(data []byte, digestLen uint16, typeChoose uint32)

入参:
        data       : 原始数据
        digestLen  : blake2b类似的哈希算法需要指定的摘要长度,其他类型时无效
        typeChoose : 类型选择,可选参数如下:
                        HASH_ALG_SHA1(0xA0000000)
                        HASH_ALG_SHA3_256(0xA0000001)
                        HASH_ALG_SHA256(0xA0000002)
                        HASH_ALG_SHA512(0xA0000003)
                        HASH_ALG_MD4(0xA0000004)
                        HASH_ALG_MD5(0xA0000005)
                        HASH_ALG_RIPEMD160(0xA0000006)
                        HASH_ALG_BLAKE2B(0xA0000007)
                        HASH_ALG_BLAKE2S(0xA0000008)
                        HASH_ALG_SM3(0xA0000009)
                        HASh_ALG_DOUBLE_SHA256(0xA000000A)
                        HASH_ALG_HASH160(0xA000000B)
                        HASH_ALG_BLAKE256(0xA000000C)
                        HASH_ALG_BLAKE512(0xA000000D)
                        HASH_ALG_KECCAK256(0xA000000E)
                        HASH_ALG_KECCAK256_RIPEMD160(0xA000000F)
                        HASH_ALG_SHA3_256_RIPEMD160(0xA0000010)
                        HASH_ALG_KECCAK512(0xA0000011)
                        HASH_ALG_SHA3_512(0xA0000012)
出参:    
        []byte     : 哈希值
Tips:
        对于需要传入key的哈希算法,目前还不支持,按照默认方式进行计算。

HMAC算法

func Hmac(key []byte, data []byte, typeChoose uint32) []byte

入参:
        data       : 原始数据
        key        : 密钥
        typeChoose : 类型选择,可选参数如下:
                        HMAC_SHA256_ALG(0x50505050)
                        HMAC_SHA512_ALG(0x50505051)
                        HMAC_SM3_ALGuint32(0x50505052)
出参:
        []byte     : HMAC值

About

openwallet supported crypto library;Try to fix the issue https://github.com/blocktree/go-owcrypt/issues/7

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 91.8%
  • Assembly 8.2%