package common

/**
sdf数据结构和sm2的数据结构方法绑定在sm2.Publickey.MarshalSDF上
*/
const (
	RSAref_MAX_BITS  = 2048                         //nolint
	RSAref_MAX_LEN   = ((RSAref_MAX_BITS + 7) / 8)  //nolint
	RSAref_MAX_PBITS = ((RSAref_MAX_BITS + 1) / 2)  //nolint
	RSAref_MAX_PLEN  = ((RSAref_MAX_PBITS + 7) / 8) //nolint
	ECCref_MAX_BITS  = 512                          //nolint
	ECCref_MAX_LEN   = ((ECCref_MAX_BITS + 7) / 8)  //nolint
)

//RSArefPublicKey RSA公钥
type RSArefPublicKey struct {
	Bits uint32
	M    [RSAref_MAX_LEN]byte
	E    [RSAref_MAX_LEN]byte
}

//RSArefPrivateKey RSA私钥
type RSArefPrivateKey struct {
	Bits  uint32
	M     [RSAref_MAX_LEN]byte
	E     [RSAref_MAX_LEN]byte
	D     [RSAref_MAX_LEN]byte
	Prime [2][RSAref_MAX_PLEN]byte
	Pexp  [2][RSAref_MAX_PLEN]byte // Dp and Dq, Dp =
	Coef  [RSAref_MAX_PLEN]byte    // q^-1 mod p
}

type EnvelopedRSAKey struct {
	SymmAlgID       uint32                    // 对称算法标识，限定ECB模式
	Bits            uint32                    // RSA密钥对的模长
	EncryptedPriKey [11][RSAref_MAX_PLEN]byte // RSA密钥对私钥的密文
	PubKey          RSArefPublicKey           // RSA密钥对的公钥
	L               uint32                    // 用RSA保护公钥加密的对称密钥密文长度
	C               [RSAref_MAX_LEN]byte      // 用RSA保护公钥加密的对称密钥密文
}

//ECCrefPublicKey sm2公钥
type ECCrefPublicKey struct {
	Bits uint32
	X    [ECCref_MAX_LEN]byte
	Y    [ECCref_MAX_LEN]byte
}

//ECCrefPrivateKey sm2私钥
type ECCrefPrivateKey struct {
	Bits uint32
	K    [ECCref_MAX_LEN]byte
}

//ECCCipher sm2加密结构
type ECCCipher struct {
	X [ECCref_MAX_LEN]byte
	Y [ECCref_MAX_LEN]byte
	M [32]byte
	L uint32
	C []byte
}

//ECCSignature sm2签名结果
type ECCSignature struct {
	R [ECCref_MAX_LEN]byte
	S [ECCref_MAX_LEN]byte
}

//EnvelopedECCKey sm2密钥保护结构
type EnvelopedECCKey struct {
	AsymmAlgID      uint32
	SymmAlgID       uint32
	Bits            uint32
	EncryptedPriKey [ECCref_MAX_LEN]byte
	PubKey          ECCrefPublicKey
	ECCCipherBlob   ECCCipher
}

// //SM9MastPrivateKey SM9主私钥
// type SM9MastPrivateKey struct {
// 	Bits uint32
// 	S    [32]byte
// }

// //SM9SignMastPublicKey 签名主公钥
// type SM9SignMastPublicKey struct {
// 	CompressType uint32
// 	Bits         uint32
// 	Xa           [32]byte
// 	Xb           [32]byte
// 	Ya           [32]byte
// 	Yb           [32]byte
// }

// //SM9EncMastPublicKey 加密主公钥
// type SM9EncMastPublicKey struct {
// 	Bits uint32
// 	X    [32]byte
// 	Y    [32]byte
// }

// //SM9UserSignPrivateKey 用户签名私钥
// type SM9UserSignPrivateKey struct {
// 	Bits uint32
// 	X    [32]byte
// 	Y    [32]byte
// }

// //SM9UserEncPrivateKey 用户加密私钥
// type SM9UserEncPrivateKey struct {
// 	CompressType uint32
// 	Bits         uint32
// 	Xa           [32]byte
// 	Xb           [32]byte
// 	Ya           [32]byte
// 	Yb           [32]byte
// }

// //SM9Cipher SM9加密数据结构
// type SM9Cipher struct {
// 	EnType uint32
// 	X      [32]byte
// 	Y      [32]byte
// 	M      [32]byte
// 	L      uint32
// 	C      [1024]byte
// }

// //SM9Signature SM9签名数据结构
// type SM9Signature struct {
// 	H [32]byte
// 	X [32]byte
// 	Y [32]byte
// }

// //SM9KeyPackage SM9密钥封装数据结构
// type SM9KeyPackage struct {
// 	K [32]byte
// 	X [32]byte
// 	Y [32]byte
// }

// //SM9PairEncEnvelopedKey SM9用户加密密钥对保护结构
// type SM9PairEncEnvelopedKey struct {
// 	Version         uint32
// 	SymAlgID        uint32
// 	ASymmAlgID      uint32
// 	Bits            uint32
// 	EncryptedPriKey [128]byte
// 	EncMastPubKey   SM9EncMastPublicKey
// 	UserIDLen       uint32
// 	UserID          [1024]byte
// 	PairCipher      SM9Cipher
// }

// //SM9PairSignEnvelopedKey SM9用户签名密钥对保护结构
// type SM9PairSignEnvelopedKey struct {
// 	Version         uint32
// 	SymAlgID        uint32
// 	ASymmAlgID      uint32
// 	Bits            uint32
// 	EncryptedPriKey [64]byte
// 	SignMastPubKey  SM9SignMastPublicKey
// 	UserIDLen       uint32
// 	UserID          [1024]byte
// 	PairCipher      SM9Cipher
// }

// func (e *ECCrefPrivateKey) MarshalGcl() *sm2.PrivateKey {
// 	sk := &sm2.PrivateKey{
// 		D: new(big.Int).SetBytes(e.K[:]),
// 	}
// 	pk := sm2.GenPublicKey(sk)
// 	sk.PublicKey = *pk
// 	return sk
// }

// func (e *ECCrefPrivateKey) UnmarshalGcl(sk *sm2.PrivateKey) error {
// 	return gmath.FillBytes(sk.D, e.K[:])
// }
