# Issue 9 - Unsolved
Go标准库deprecated elliptic.Curve，因为标准库的elliptic.CurveParams使用的big.Int来实现曲线上的点乘操作，而big.Int一般不是密码学安全的。

GCL在amd和arm平台下，都是汇编覆盖了elliptic.CurveParams的点乘方法，因此不会用到elliptic.CurveParams的generic实现。

但是在龙芯平台上，会使用elliptic.CurveParams的Generic实现，因此不是密码学安全的。

Unsolved: 对曲线的generic实现，保证常数执行时间。

# Issue 8 - Unsolved
AMD CPU上sm2 签名验签失败


# Issue 7
sm/sm2/ec256/c256_asm_arm64.s
The `A Quick Guide to Go's Assembler` says that
`If NOSPLIT is not specified for the TEXT, the argument size must be provided.`
```go
// 未加-96,在func TestScalarBaseMult(t *testing.T)中会偶尔报错
// - TEXT ·c256PointAddAffineAsm(SB),0,$264
TEXT ·c256PointAddAffineAsm(SB),0,$264-96
```

# Issue 6
修复sm2/ec256/c256_asm_amd64.s下montReduceQW错误。在amd64平台下，会有很小的可能验签，解密等失败。
```go
#define montReduceQW(a0,a1,a2,a3,a4,a5, tmp0)\
    \
    ADDQ a0, a1 \
    ADCQ $0, a2 \
    ADCQ $0, a3 \
    ADCQ a0, a4 \
    ADCQ $0, a5 \ 
    \
    MOVQ a0, tmp0 \
    SHLQ $32, a0 /* a0 used as a temp val */ \
    SHRQ $32, tmp0 \
    \
    SUBQ a0, a1 \
    SBBQ tmp0, a2 \
    SBBQ a0, a3 \
    SBBQ tmp0, a4 \
    SBBQ $0, a5 /* may be not need? -- Issue 6: must keep it */\
    XORQ a0,a0
```
let a[0:4] = [1,0,0,2,0]*0xffffffffffffffff = [0xffffffffffffffff,0,0,0xfffffffffffffffe,1,0]
Then a4 + a0 = 0, a5 = 1


# Issue 5
SM9签名，会改变传入的用户签名私钥。
错误位置：sm9/sign.go的sign函数，调用返回时会改变私钥ds值。
```go
func sign(msg []byte, ds *UserSignKey, pubs *MastSignPublicKey, rnd []byte) (*Signature, error) {
	// ...
    // 这里会改变ds!
	//- s := ds.G1.ScalarMult(&ds.G1, r)
    s := (&G1{}).ScalarMult(&ds.G1, r)
	signature.H.Set(h)
	signature.S.Set(s)
	return signature, nil
}
```

# Issue 4
version <= v1.4.3的pbkdf的prf函数f实现错误。导致计算pbkd.PbkdfWithHmacSm3错误。

```go
func f(prfer prfer, salt_i []byte, count int) ([]byte, error) {
	u, err := prfer.prf(salt_i)
	if err != nil {
		return nil, err
	}
	for i := 2; i <= count; i++ {
		if out, err := prfer.prf(u); err != nil {
			return nil, err
		} else {
			xor.XorBytes(u, u, out)
		}
	}
	return u, nil
}

func f2(prfer prfer, salt_i []byte, count int) ([]byte, error) {
	u, err := prfer.prf(salt_i)
	if err != nil {
		return nil, err
	}
	T := append([]byte(nil), u...)
	for i := 2; i <= count; i++ {
		if u, err = prfer.prf(u); err != nil {
			return nil, err
		} else {
			xor.XorBytes(T, T, u)
		}
	}
	return T, nil
}
```

# Issue 3
Identifier GM/T 0090中Version定义为 EXPLICITE VERSION DEFAULT V1, 
这里EXPLICITE应该去掉。

```go
type Identifier struct {
	// 标准中多了一个explicit
	// Version int `asn1:"explicit,default:0"` 应为
	Version      int `asn1:"default:0"`
    // ...
}
```

# Issue 2
Fuzz测试中，fuzz参数可能共享内容：
```go
f.Add([]byte{}, []byte{})
f.Fuzz(func(t *testing.T, id, msg []byte) {
    //
}
```
id和msg可能共享同一内存，因此如果要对id和msg有改变的话，需要复制一份。



# Issue 1
sm9.Sign输入rnd非32字节时，内部重新生成。但内部rnd 赋值时多了`:`, 因此对rnd并没有重新生成。

```go
	if rnd == nil || len(rnd) < byteSize {
		rnd := make([]byte, byteSize)
		grand.GenerateRandom(rnd)
	}
```
改为

```go
	if rnd == nil || len(rnd) < byteSize {
        // -rnd := make([]byte, byteSize)
        rnd = make([]byte, byteSize)
		grand.GenerateRandom(rnd)
	}
```

