mirror of
https://gogs.blitter.com/RLabs/xs
synced 2024-08-14 10:26:42 +00:00
Initial commit
This commit is contained in:
commit
ba2c03afe3
7 changed files with 248 additions and 0 deletions
BIN
demo/Herradura
Executable file
BIN
demo/Herradura
Executable file
Binary file not shown.
57
demo/Herradura.go
Normal file
57
demo/Herradura.go
Normal file
|
@ -0,0 +1,57 @@
|
|||
/* Herradura - a Key exchange scheme in the style of Diffie-Hellman Key Exchange.
|
||||
Copyright (C) 2017 Omar Alejandro Herrera Reyna
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
golang implementation by Russ Magee (rmagee_at_gmail.com) */
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
hkex "blitter.com/herradurakex"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var s int //MUST be 2^n where n is an integer
|
||||
var p int //Amount of bits to share (a,a,b,b2)
|
||||
|
||||
flag.IntVar(&s, "s", 256, "Size in bits of secret (fa,fa2)")
|
||||
flag.IntVar(&p, "p", 64, "Size in bits of shared public portion (b,b2)")
|
||||
flag.Parse()
|
||||
|
||||
fmt.Printf("s=%v p=%v\n", s, p)
|
||||
|
||||
hkexAlice := hkex.New(s, p)
|
||||
hkexBob := hkex.New(s, p)
|
||||
|
||||
fmt.Println("ALICE:")
|
||||
fmt.Println(hkexAlice)
|
||||
|
||||
fmt.Println("BOB:")
|
||||
fmt.Println(hkexBob)
|
||||
|
||||
// Alice and Bob exchange D
|
||||
// (This, of course, would occur over a public channel between peers)
|
||||
// hkexAlice and hkexBob would each be in separate contexts
|
||||
// (processes, client/server etc.)
|
||||
hkexBob.PeerD = hkexAlice.D()
|
||||
hkexAlice.PeerD = hkexBob.D()
|
||||
|
||||
hkexAlice.FA()
|
||||
fmt.Println(hkexAlice)
|
||||
|
||||
hkexBob.FA()
|
||||
fmt.Println(hkexBob)
|
||||
}
|
BIN
demo/client
Executable file
BIN
demo/client
Executable file
Binary file not shown.
18
demo/client.go
Normal file
18
demo/client.go
Normal file
|
@ -0,0 +1,18 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"net"
|
||||
)
|
||||
|
||||
func main() {
|
||||
conn, err := net.Dial("tcp", "localhost:2000")
|
||||
if err != nil {
|
||||
// handle error
|
||||
}
|
||||
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
|
||||
// status, err := bufio.NewReader(conn).ReadString('\n')
|
||||
_, err = bufio.NewReader(conn).ReadString('\n')
|
||||
// ...
|
||||
}
|
BIN
demo/server
Executable file
BIN
demo/server
Executable file
Binary file not shown.
41
demo/server.go
Normal file
41
demo/server.go
Normal file
|
@ -0,0 +1,41 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Listen on TCP port 2000 on all available unicast and
|
||||
// anycast IP addresses of the local system.
|
||||
l, err := net.Listen("tcp", ":2000")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer l.Close()
|
||||
|
||||
fmt.Println("Serving on port 2000")
|
||||
for {
|
||||
// Wait for a connection.
|
||||
conn, err := l.Accept()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
fmt.Println("Accepted client")
|
||||
|
||||
|
||||
// Handle the connection in a new goroutine.
|
||||
// The loop then returns to accepting, so that
|
||||
// multiple connections may be served concurrently.
|
||||
go func(c net.Conn) {
|
||||
// Echo all incoming data.
|
||||
io.Copy(c, c)
|
||||
fmt.Println("Client sent:%v\n",c)
|
||||
// Shut down the connection.
|
||||
c.Close()
|
||||
}(conn)
|
||||
}
|
||||
}
|
132
herradurakex.go
Normal file
132
herradurakex.go
Normal file
|
@ -0,0 +1,132 @@
|
|||
/* Herradura - a Key exchange scheme in the style of Diffie-Hellman Key Exchange.
|
||||
Copyright (C) 2017 Omar Alejandro Herrera Reyna
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
golang implementation by Russ Magee (rmagee_at_gmail.com) */
|
||||
package herradurakex
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/big"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
||||
// This type holds the session state for a key exchange
|
||||
type HerraduraKEx struct {
|
||||
intSz, pubSz int
|
||||
randctx *rand.Rand
|
||||
a *big.Int
|
||||
b *big.Int
|
||||
d, PeerD *big.Int
|
||||
fa *big.Int
|
||||
}
|
||||
|
||||
// Returns a new HerraduraKEx struct
|
||||
func New(i int, p int) (h *HerraduraKEx) {
|
||||
h = new(HerraduraKEx)
|
||||
|
||||
h.intSz = i
|
||||
h.pubSz = p
|
||||
|
||||
h.seed()
|
||||
h.a = h.rand()
|
||||
h.b = h.rand()
|
||||
|
||||
h.d = h.fscxRevolve(h.a, h.b, h.pubSz)
|
||||
return h
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) seed() {
|
||||
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||||
h.randctx = r
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) rand() (v *big.Int) {
|
||||
v = big.NewInt(0)
|
||||
v.Rand(h.randctx, h.getMax())
|
||||
return v
|
||||
}
|
||||
|
||||
// Return max value for an n-bit big.Int
|
||||
func (h *HerraduraKEx) getMax() (v *big.Int) {
|
||||
v = big.NewInt(0)
|
||||
var max big.Int
|
||||
|
||||
for i := 0; i < h.intSz; i++ {
|
||||
max.SetBit(v, i, 1)
|
||||
}
|
||||
v = &max
|
||||
return v
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) bitX(x *big.Int, pos int) (ret int64) {
|
||||
if pos < 0 {
|
||||
pos = h.intSz - pos
|
||||
}
|
||||
|
||||
if pos == 0 {
|
||||
ret = int64(x.Bit(1) ^ x.Bit(0) ^ x.Bit(h.intSz-1))
|
||||
} else if pos == h.intSz-1 {
|
||||
ret = int64(x.Bit(0) ^ x.Bit(pos) ^ x.Bit(pos-1))
|
||||
} else {
|
||||
ret = int64(x.Bit((pos+1)%h.intSz) ^ x.Bit(pos) ^ x.Bit(pos-1))
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) bit(up, down *big.Int, posU, posD int) (ret *big.Int) {
|
||||
return big.NewInt(h.bitX(up, posU) ^ h.bitX(down, posD))
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) fscx(up, down *big.Int) (result *big.Int) {
|
||||
result = big.NewInt(0)
|
||||
|
||||
for count := 0; count < h.intSz; count++ {
|
||||
result.Lsh(result, 1)
|
||||
result.Add(result, h.bit(up, down, count, count))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// This is the iteration function using the result of the previous iteration as the first
|
||||
// parameter and the second parameter of the first iteration
|
||||
func (h *HerraduraKEx) fscxRevolve(x, y *big.Int, passes int) (result *big.Int) {
|
||||
result = big.NewInt(0)
|
||||
|
||||
result = x
|
||||
for count := 0; count < passes; count++ {
|
||||
result = h.fscx(result, y)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) D() *big.Int {
|
||||
return h.d
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) FA() {
|
||||
h.fa = h.fscxRevolve(h.PeerD, h.b, h.intSz-h.pubSz)
|
||||
h.fa.Xor(h.fa, h.a)
|
||||
}
|
||||
|
||||
func (h *HerraduraKEx) String() string {
|
||||
return fmt.Sprintf("s:%d p:%d\na:%s\nb:%s\nd:->%s\n<-PeerD:%s\nfa:%s",
|
||||
h.intSz, h.pubSz,
|
||||
h.a.Text(16), h.b.Text(16),
|
||||
h.d.Text(16),
|
||||
h.PeerD.Text(16),
|
||||
h.fa.Text(16))
|
||||
}
|
Loading…
Reference in a new issue