gitee.com/curryzheng/dm@v0.0.1/security/zzb.go (about)

     1  /*
     2   * Copyright (c) 2000-2018, 达梦数据库有限公司.
     3   * All rights reserved.
     4   */
     5  
     6  package security
     7  
     8  import (
     9  	"crypto/rand"
    10  	"errors"
    11  	"io"
    12  	"math/big"
    13  )
    14  
    15  type dhGroup struct {
    16  	p *big.Int
    17  	g *big.Int
    18  }
    19  
    20  func newDhGroup(prime, generator *big.Int) *dhGroup {
    21  	return &dhGroup{
    22  		p: prime,
    23  		g: generator,
    24  	}
    25  }
    26  
    27  func (dg *dhGroup) P() *big.Int {
    28  	p := new(big.Int)
    29  	p.Set(dg.p)
    30  	return p
    31  }
    32  
    33  func (dg *dhGroup) G() *big.Int {
    34  	g := new(big.Int)
    35  	g.Set(dg.g)
    36  	return g
    37  }
    38  
    39  // 生成本地公私钥
    40  func (dg *dhGroup) GeneratePrivateKey(randReader io.Reader) (key *DhKey, err error) {
    41  	if randReader == nil {
    42  		randReader = rand.Reader
    43  	}
    44  	// 0 < x < p
    45  	x, err := rand.Int(randReader, dg.p)
    46  	if err != nil {
    47  		return
    48  	}
    49  	zero := big.NewInt(0)
    50  	for x.Cmp(zero) == 0 {
    51  		x, err = rand.Int(randReader, dg.p)
    52  		if err != nil {
    53  			return
    54  		}
    55  	}
    56  	key = new(DhKey)
    57  	key.x = x
    58  
    59  	// y = g ^ x mod p
    60  	key.y = new(big.Int).Exp(dg.g, x, dg.p)
    61  	key.group = dg
    62  	return
    63  }
    64  
    65  func (dg *dhGroup) ComputeKey(pubkey *DhKey, privkey *DhKey) (kye *DhKey, err error) {
    66  	if dg.p == nil {
    67  		err = errors.New("DH: invalid group")
    68  		return
    69  	}
    70  	if pubkey.y == nil {
    71  		err = errors.New("DH: invalid public key")
    72  		return
    73  	}
    74  	if pubkey.y.Sign() <= 0 || pubkey.y.Cmp(dg.p) >= 0 {
    75  		err = errors.New("DH parameter out of bounds")
    76  		return
    77  	}
    78  	if privkey.x == nil {
    79  		err = errors.New("DH: invalid private key")
    80  		return
    81  	}
    82  	k := new(big.Int).Exp(pubkey.y, privkey.x, dg.p)
    83  	key := new(DhKey)
    84  	key.y = k
    85  	key.group = dg
    86  	return
    87  }