mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-11-04 11:37:27 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
		
			799 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			799 B
		
	
	
	
		
			Go
		
	
	
	
	
	
//
 | 
						|
// Copyright Coinbase, Inc. All Rights Reserved.
 | 
						|
//
 | 
						|
// SPDX-License-Identifier: Apache-2.0
 | 
						|
//
 | 
						|
 | 
						|
package core
 | 
						|
 | 
						|
import (
 | 
						|
	"crypto/rand"
 | 
						|
	"fmt"
 | 
						|
	"math"
 | 
						|
	"math/big"
 | 
						|
)
 | 
						|
 | 
						|
// GenerateSafePrime creates a prime number `p`
 | 
						|
// where (`p`-1)/2 is also prime with at least `bits`
 | 
						|
func GenerateSafePrime(bits uint) (*big.Int, error) {
 | 
						|
	if bits < 3 {
 | 
						|
		return nil, fmt.Errorf("safe prime size must be at least 3-bits")
 | 
						|
	}
 | 
						|
 | 
						|
	var p *big.Int
 | 
						|
	var err error
 | 
						|
	checks := int(math.Max(float64(bits)/16, 8))
 | 
						|
	for {
 | 
						|
		// rand.Prime throws an error if bits < 2
 | 
						|
		// -1 so the Sophie-Germain prime is 1023 bits
 | 
						|
		// and the Safe prime is 1024
 | 
						|
		p, err = rand.Prime(rand.Reader, int(bits)-1)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		p.Add(p.Lsh(p, 1), One)
 | 
						|
 | 
						|
		if p.ProbablyPrime(checks) {
 | 
						|
			break
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return p, nil
 | 
						|
}
 |