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 }