24904585a2
Fix user tests Add swagger docs Fix lint Add totp check when logging in Make totp enrollment work Add migration for totp table go mod vendor Add routes for totp routes Add route handler for totp routes Add basic implementation to enroll a user in totp Co-authored-by: kolaente <k@knt.li> Reviewed-on: https://kolaente.dev/vikunja/api/pulls/383
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]]
|
|
}
|