summaryrefslogtreecommitdiff
path: root/vendor/github.com/boombuler/barcode/utils/galoisfield.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2025-04-07 16:14:41 +0200
committerLibravatar GitHub <noreply@github.com>2025-04-07 16:14:41 +0200
commit365b5753419238bb96bc3f9b744d380ff20cbafc (patch)
tree6b8e8b605c4cddeb6e3bc0f574ffbc856657e56c /vendor/github.com/boombuler/barcode/utils/galoisfield.go
parent[bugfix] Don't assume `"manuallyApprovesFollowers": true` if not set (#3978) (diff)
downloadgotosocial-365b5753419238bb96bc3f9b744d380ff20cbafc.tar.xz
[feature] add TOTP two-factor authentication (2FA) (#3960)
* [feature] add TOTP two-factor authentication (2FA) * use byteutil.S2B to avoid allocations when comparing + generating password hashes * don't bother with string conversion for consts * use io.ReadFull * use MustGenerateSecret for backup codes * rename util functions
Diffstat (limited to 'vendor/github.com/boombuler/barcode/utils/galoisfield.go')
-rw-r--r--vendor/github.com/boombuler/barcode/utils/galoisfield.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/vendor/github.com/boombuler/barcode/utils/galoisfield.go b/vendor/github.com/boombuler/barcode/utils/galoisfield.go
new file mode 100644
index 000000000..68726fbfd
--- /dev/null
+++ b/vendor/github.com/boombuler/barcode/utils/galoisfield.go
@@ -0,0 +1,65 @@
+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]]
+}