mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-29 17:52:13 +01:00
6dd096b7f0
* 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
65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package utils
|
|
|
|
// GaloisField encapsulates galois field arithmetics
|
|
type GaloisField struct {
|
|
Size int
|
|
Base int
|
|
ALogTbl []int
|
|
LogTbl []int
|
|
}
|
|
|
|
// NewGaloisField creates a new galois field
|
|
func NewGaloisField(pp, fieldSize, b int) *GaloisField {
|
|
result := new(GaloisField)
|
|
|
|
result.Size = fieldSize
|
|
result.Base = b
|
|
result.ALogTbl = make([]int, fieldSize)
|
|
result.LogTbl = make([]int, fieldSize)
|
|
|
|
x := 1
|
|
for i := 0; i < fieldSize; i++ {
|
|
result.ALogTbl[i] = x
|
|
x = x * 2
|
|
if x >= fieldSize {
|
|
x = (x ^ pp) & (fieldSize - 1)
|
|
}
|
|
}
|
|
|
|
for i := 0; i < fieldSize; i++ {
|
|
result.LogTbl[result.ALogTbl[i]] = int(i)
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
func (gf *GaloisField) Zero() *GFPoly {
|
|
return NewGFPoly(gf, []int{0})
|
|
}
|
|
|
|
// AddOrSub add or substract two numbers
|
|
func (gf *GaloisField) AddOrSub(a, b int) int {
|
|
return a ^ b
|
|
}
|
|
|
|
// Multiply multiplys two numbers
|
|
func (gf *GaloisField) Multiply(a, b int) int {
|
|
if a == 0 || b == 0 {
|
|
return 0
|
|
}
|
|
return gf.ALogTbl[(gf.LogTbl[a]+gf.LogTbl[b])%(gf.Size-1)]
|
|
}
|
|
|
|
// Divide divides two numbers
|
|
func (gf *GaloisField) Divide(a, b int) int {
|
|
if b == 0 {
|
|
panic("divide by zero")
|
|
} else if a == 0 {
|
|
return 0
|
|
}
|
|
return gf.ALogTbl[(gf.LogTbl[a]-gf.LogTbl[b])%(gf.Size-1)]
|
|
}
|
|
|
|
func (gf *GaloisField) Invers(num int) int {
|
|
return gf.ALogTbl[(gf.Size-1)-gf.LogTbl[num]]
|
|
}
|