mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	* Initial commit for 2FA support Signed-off-by: Andrew <write@imaginarycode.com> * Add vendored files * Add missing depends * A few clean ups * Added improvements, proper encryption * Better encryption key * Simplify "key" generation * Make 2FA enrollment page more robust * Fix typo * Rename twofa/2FA to TwoFactor * UNIQUE INDEX -> UNIQUE
		
			
				
	
	
		
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package utils
 | 
						|
 | 
						|
import (
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
type ReedSolomonEncoder struct {
 | 
						|
	gf        *GaloisField
 | 
						|
	polynomes []*GFPoly
 | 
						|
	m         *sync.Mutex
 | 
						|
}
 | 
						|
 | 
						|
func NewReedSolomonEncoder(gf *GaloisField) *ReedSolomonEncoder {
 | 
						|
	return &ReedSolomonEncoder{
 | 
						|
		gf, []*GFPoly{NewGFPoly(gf, []int{1})}, new(sync.Mutex),
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (rs *ReedSolomonEncoder) getPolynomial(degree int) *GFPoly {
 | 
						|
	rs.m.Lock()
 | 
						|
	defer rs.m.Unlock()
 | 
						|
 | 
						|
	if degree >= len(rs.polynomes) {
 | 
						|
		last := rs.polynomes[len(rs.polynomes)-1]
 | 
						|
		for d := len(rs.polynomes); d <= degree; d++ {
 | 
						|
			next := last.Multiply(NewGFPoly(rs.gf, []int{1, rs.gf.ALogTbl[d-1+rs.gf.Base]}))
 | 
						|
			rs.polynomes = append(rs.polynomes, next)
 | 
						|
			last = next
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return rs.polynomes[degree]
 | 
						|
}
 | 
						|
 | 
						|
func (rs *ReedSolomonEncoder) Encode(data []int, eccCount int) []int {
 | 
						|
	generator := rs.getPolynomial(eccCount)
 | 
						|
	info := NewGFPoly(rs.gf, data)
 | 
						|
	info = info.MultByMonominal(eccCount, 1)
 | 
						|
	_, remainder := info.Divide(generator)
 | 
						|
 | 
						|
	result := make([]int, eccCount)
 | 
						|
	numZero := int(eccCount) - len(remainder.Coefficients)
 | 
						|
	copy(result[numZero:], remainder.Coefficients)
 | 
						|
	return result
 | 
						|
}
 |