mirror of https://github.com/vacp2p/nim-libp2p.git
wip: modeling secio
This commit is contained in:
parent
525646dcc1
commit
bb648c87e1
|
@ -7,26 +7,85 @@
|
||||||
## This file may not be copied, modified, or distributed except according to
|
## This file may not be copied, modified, or distributed except according to
|
||||||
## those terms.
|
## those terms.
|
||||||
|
|
||||||
import chronos
|
import chronos, chronicles, nimcrypto/sysrand
|
||||||
import secure,
|
import secure, ../../connection, ../../crypto/crypto
|
||||||
../../connection
|
|
||||||
|
|
||||||
const SecioCodec* = "/plaintext/1.0.0"
|
logScope:
|
||||||
|
topic = "secio"
|
||||||
|
|
||||||
|
const
|
||||||
|
SecioCodec* = "/secio/1.0.0"
|
||||||
|
SecioMaxMessageSize = 8 * 1024 * 1024 ## 8mb
|
||||||
|
SecioNonceSize = 16
|
||||||
|
SecioExchanges = "P-256,P-384,P-521"
|
||||||
|
SecioCiphers = "AES-256,AES-128"
|
||||||
|
SecioHashes = "SHA-256,SHA-512"
|
||||||
|
|
||||||
type
|
type
|
||||||
Secio = ref object of Secure
|
Secio = ref object of Secure
|
||||||
|
localPublicKey: PublicKey
|
||||||
|
|
||||||
proc encodeProposalMsg*() = discard
|
proc transactMessage(conn: Connection,
|
||||||
proc decodeProposalMsg*() = discard
|
msg: seq[byte]): Future[seq[byte]] {.async.} =
|
||||||
|
var buf = newSeq[byte](4)
|
||||||
|
try:
|
||||||
|
debug "Sending proposal", message = toHex(msg)
|
||||||
|
await conn.write(msg)
|
||||||
|
await conn.readExactly(addr buf[0], 4)
|
||||||
|
let length = (int(buf[0]) shl 24) or (int(buf[1]) shl 16) or
|
||||||
|
(int(buf[2]) shl 8) or (int(buf[3]))
|
||||||
|
debug "Recieved message header", header = toHex(buf), length = length
|
||||||
|
if length <= SecioMaxMessageSize:
|
||||||
|
buf.setLen(length)
|
||||||
|
await conn.readExactly(addr buf[0], length)
|
||||||
|
debug "Received message body", conn = conn, length = length
|
||||||
|
result = buf
|
||||||
|
else:
|
||||||
|
debug "Received size of message exceed limits", conn = conn,
|
||||||
|
length = length
|
||||||
|
except AsyncStreamIncompleteError:
|
||||||
|
debug "Connection dropped while reading", conn = conn
|
||||||
|
except AsyncStreamReadError:
|
||||||
|
debug "Error reading from connection", conn = conn
|
||||||
|
except AsyncStreamWriteError:
|
||||||
|
debug "Could not write to connection", conn = conn
|
||||||
|
|
||||||
|
proc handshake*(p: Secio, conn: Connection) {.async.} =
|
||||||
|
var nonce: array[SecioNonceSize, byte]
|
||||||
|
var pk = p.localPublicKey.getBytes()
|
||||||
|
echo toHex(pk)
|
||||||
|
if randomBytes(nonce) != SecioNonceSize:
|
||||||
|
raise newException(CatchableError, "Could not generate random data")
|
||||||
|
|
||||||
|
debug "Local proposal", schemes = SecioExchanges, ciphers = SecioCiphers,
|
||||||
|
hashes = SecioHashes, nonce = toHex(nonce),
|
||||||
|
pubkey = toHex(pk)
|
||||||
|
|
||||||
|
echo "local proposal"
|
||||||
|
|
||||||
|
var answer = await transactMessage(conn,
|
||||||
|
createProposal(nonce, pk, SecioExchanges, SecioCiphers, SecioHashes)
|
||||||
|
)
|
||||||
|
|
||||||
|
echo toHex(answer)
|
||||||
|
|
||||||
|
if len(answer) == 0:
|
||||||
|
debug "Proposal exchange failed", conn = conn
|
||||||
|
return
|
||||||
|
|
||||||
method init(p: Secio) {.gcsafe.} =
|
method init(p: Secio) {.gcsafe.} =
|
||||||
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
proc handle(conn: Connection, proto: string) {.async, gcsafe.} =
|
||||||
discard
|
echo "HERE"
|
||||||
|
|
||||||
p.codec = SecioCodec
|
p.codec = SecioCodec
|
||||||
p.handler = handle
|
p.handler = handle
|
||||||
|
|
||||||
proc newSecio*(): Secio =
|
method secure*(p: Secio, conn: Connection): Future[Connection] {.async, gcsafe.} =
|
||||||
|
echo "handshaking"
|
||||||
|
await p.handshake(conn)
|
||||||
|
|
||||||
|
proc newSecio*(localPublicKey: PublicKey): Secio =
|
||||||
new result
|
new result
|
||||||
|
result.localPublicKey = localPublicKey
|
||||||
result.init()
|
result.init()
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ const PlainTextCodec* = "/plaintext/1.0.0"
|
||||||
|
|
||||||
type
|
type
|
||||||
Secure* = ref object of LPProtocol # base type for secure managers
|
Secure* = ref object of LPProtocol # base type for secure managers
|
||||||
|
|
||||||
PlainText* = ref object of Secure
|
PlainText* = ref object of Secure
|
||||||
|
|
||||||
method init(p: PlainText) {.gcsafe.} =
|
method init(p: PlainText) {.gcsafe.} =
|
||||||
|
@ -26,7 +25,7 @@ method init(p: PlainText) {.gcsafe.} =
|
||||||
p.codec = PlainTextCodec
|
p.codec = PlainTextCodec
|
||||||
p.handler = handle
|
p.handler = handle
|
||||||
|
|
||||||
method secure(p: Secure, conn: Connection): Future[Connection]
|
method secure*(p: Secure, conn: Connection): Future[Connection]
|
||||||
{.base, async, gcsafe.} = discard
|
{.base, async, gcsafe.} = discard
|
||||||
|
|
||||||
proc newPlainText*(): PlainText =
|
proc newPlainText*(): PlainText =
|
||||||
|
|
Loading…
Reference in New Issue