From 226f2a5d47ccb24640ab9b06573cbe1b9a2f10ea Mon Sep 17 00:00:00 2001 From: Afshin Arani Date: Fri, 29 Oct 2021 13:55:26 +0330 Subject: [PATCH] fantomless: change style preferences https://github.com/fsprojects/fantomas/issues/1907#issuecomment-942035040 --- .editorconfig | 10 +- NOnion/Cells/CellAuthChallenge.fs | 6 +- NOnion/Cells/CellCerts.fs | 10 +- NOnion/Cells/CellCreate2.fs | 2 +- NOnion/Cells/CellCreateFast.fs | 2 +- NOnion/Cells/CellCreated2.fs | 2 +- NOnion/Cells/CellCreatedFast.fs | 2 +- NOnion/Cells/CellDestory.fs | 6 +- NOnion/Cells/CellNetInfo.fs | 20 +- NOnion/Cells/CellPadding.fs | 2 +- NOnion/Cells/CellVersions.fs | 8 +- NOnion/Cells/Command.fs | 8 +- NOnion/Cells/Relay/CellPlainRelay.fs | 48 +-- NOnion/Cells/Relay/RelayBegin.fs | 10 +- NOnion/Cells/Relay/RelayEstablishIntro.fs | 24 +- NOnion/Cells/Relay/RelayExtend2.fs | 20 +- NOnion/Cells/Relay/RelayExtended2.fs | 2 +- NOnion/Cells/Relay/RelayIntroduce.fs | 32 +- NOnion/Cells/Relay/RelayIntroduceAck.fs | 10 +- NOnion/Cells/Relay/RelayRendezvous.fs | 4 +- NOnion/Constants.fs | 2 +- NOnion/Crypto/HiddenServicesCipher.fs | 119 +++--- NOnion/Crypto/Kdf/Kdf.fs | 33 +- NOnion/Crypto/TorCryptoState.fs | 8 +- NOnion/Crypto/TorMessageDigest.fs | 14 +- NOnion/Crypto/TorStreamCipher.fs | 40 +- NOnion/Directory/NetworkStatusDocument.fs | 241 ++++++----- NOnion/Directory/ServerDescriptorsDocument.fs | 165 ++++---- NOnion/Directory/TorDirectory.fs | 105 +++-- NOnion/Exceptions.fs | 12 +- NOnion/Http/TorHttpClient.fs | 33 +- NOnion/Network/StreamState.fs | 4 +- NOnion/Network/TorCircuit.fs | 394 +++++++++--------- NOnion/Network/TorGuard.fs | 116 +++--- NOnion/Network/TorStream.fs | 90 ++-- NOnion/Network/TorWindow.fs | 20 +- NOnion/Services/TorServiceClient.fs | 40 +- NOnion/Services/TorServiceHost.fs | 104 ++--- NOnion/TorHandshakes/FastHandshake.fs | 4 +- NOnion/TorHandshakes/NTorHandshake.fs | 38 +- NOnion/TorLogger.fs | 6 +- NOnion/Utility/Base64Util.fs | 6 +- NOnion/Utility/BigIntegerSerialization.fs | 6 +- NOnion/Utility/BinaryIO.fs | 4 +- NOnion/Utility/DateTimeUtils.fs | 6 +- NOnion/Utility/DigestUtils.fs | 8 +- NOnion/Utility/FSharpUtil.fs | 8 +- NOnion/Utility/Hex.fs | 10 +- NOnion/Utility/IntegerSerialization.fs | 14 +- NOnion/Utility/SemaphoreLocker.fs | 18 +- NOnion/Utility/SeqUtils.fs | 6 +- NOnion/Utility/StreamUtil.fs | 4 +- 52 files changed, 945 insertions(+), 961 deletions(-) diff --git a/.editorconfig b/.editorconfig index 65505d0e..cad12bb1 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,11 +3,11 @@ end_of_line=lf indent_size=4 max_line_length=80 fsharp_semicolon_at_end_of_line=false -fsharp_space_before_parameter=true -fsharp_space_before_lowercase_invocation=true -fsharp_space_before_uppercase_invocation=true -fsharp_space_before_class_constructor=true -fsharp_space_before_member=true +fsharp_space_before_parameter=false +fsharp_space_before_lowercase_invocation=false +fsharp_space_before_uppercase_invocation=false +fsharp_space_before_class_constructor=false +fsharp_space_before_member=false fsharp_space_before_colon=false fsharp_space_after_comma=true fsharp_space_before_semicolon=false diff --git a/NOnion/Cells/CellAuthChallenge.fs b/NOnion/Cells/CellAuthChallenge.fs index 4df5e685..207f664a 100644 --- a/NOnion/Cells/CellAuthChallenge.fs +++ b/NOnion/Cells/CellAuthChallenge.fs @@ -11,13 +11,13 @@ type CellAuthChallenge = Methods: seq } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let rec readMethod methods n = if n = 0 then methods else - readMethod (methods @ [ ReadBigEndianUInt16 reader ]) (n - 1) + readMethod(methods @ [ ReadBigEndianUInt16 reader ]) (n - 1) let challenge = reader.ReadBytes Constants.ChallangeLength let methodsCount = ReadBigEndianUInt16 reader |> int @@ -35,7 +35,7 @@ type CellAuthChallenge = member self.Serialize writer = - let rec writeMethods (methods: seq) = + let rec writeMethods(methods: seq) = match Seq.tryHead methods with | None -> () | Some method -> diff --git a/NOnion/Cells/CellCerts.fs b/NOnion/Cells/CellCerts.fs index 0001b2f2..2681857b 100644 --- a/NOnion/Cells/CellCerts.fs +++ b/NOnion/Cells/CellCerts.fs @@ -15,7 +15,7 @@ type CellCerts = Certs: seq } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let rec readCertificates certificates n = if n = 0 then @@ -23,16 +23,16 @@ type CellCerts = else let certificate = { - Cert.Type = reader.ReadByte () + Cert.Type = reader.ReadByte() Cert.Certificate = ReadBigEndianUInt16 reader |> int |> reader.ReadBytes } - readCertificates (certificates @ [ certificate ]) (n - 1) + readCertificates(certificates @ [ certificate ]) (n - 1) - let certificatesCount = reader.ReadByte () |> int + let certificatesCount = reader.ReadByte() |> int let certs = readCertificates List.empty certificatesCount { @@ -46,7 +46,7 @@ type CellCerts = member self.Serialize writer = - let rec writeCertificates (certificates: seq) = + let rec writeCertificates(certificates: seq) = match Seq.tryHead certificates with | None -> () | Some certificate -> diff --git a/NOnion/Cells/CellCreate2.fs b/NOnion/Cells/CellCreate2.fs index 59c5b1e8..8e4a0a57 100644 --- a/NOnion/Cells/CellCreate2.fs +++ b/NOnion/Cells/CellCreate2.fs @@ -13,7 +13,7 @@ type CellCreate2 = HandshakeData: array } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = { HandshakeType = BinaryIO.ReadBigEndianUInt16 reader diff --git a/NOnion/Cells/CellCreateFast.fs b/NOnion/Cells/CellCreateFast.fs index 80f95b20..adc000a7 100644 --- a/NOnion/Cells/CellCreateFast.fs +++ b/NOnion/Cells/CellCreateFast.fs @@ -9,7 +9,7 @@ type CellCreateFast = X: array } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let x = reader.ReadBytes Constants.HashLength { diff --git a/NOnion/Cells/CellCreated2.fs b/NOnion/Cells/CellCreated2.fs index de8c55c5..d58b6911 100644 --- a/NOnion/Cells/CellCreated2.fs +++ b/NOnion/Cells/CellCreated2.fs @@ -11,7 +11,7 @@ type CellCreated2 = HandshakeData: array } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = { HandshakeData = BinaryIO.ReadBigEndianUInt16 reader |> int |> reader.ReadBytes diff --git a/NOnion/Cells/CellCreatedFast.fs b/NOnion/Cells/CellCreatedFast.fs index 600ffd10..f24fd9f0 100644 --- a/NOnion/Cells/CellCreatedFast.fs +++ b/NOnion/Cells/CellCreatedFast.fs @@ -11,7 +11,7 @@ type CellCreatedFast = DerivativeKeyData: array } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let y = reader.ReadBytes Constants.HashLength let derivativeKeyData = reader.ReadBytes Constants.HashLength diff --git a/NOnion/Cells/CellDestory.fs b/NOnion/Cells/CellDestory.fs index e1418d7c..303e3571 100644 --- a/NOnion/Cells/CellDestory.fs +++ b/NOnion/Cells/CellDestory.fs @@ -9,10 +9,10 @@ type CellDestroy = Reason: DestroyReason } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = { Reason = - reader.ReadByte () + reader.ReadByte() |> LanguagePrimitives.EnumOfValue } :> ICell @@ -22,4 +22,4 @@ type CellDestroy = member __.Command = 4uy member self.Serialize writer = - writer.Write (self.Reason |> byte) + writer.Write(self.Reason |> byte) diff --git a/NOnion/Cells/CellNetInfo.fs b/NOnion/Cells/CellNetInfo.fs index eb61826a..74c10efc 100644 --- a/NOnion/Cells/CellNetInfo.fs +++ b/NOnion/Cells/CellNetInfo.fs @@ -17,23 +17,23 @@ type CellNetInfo = OtherAddress: RouterAddress } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = - let readAddress () : RouterAddress = + let readAddress() : RouterAddress = { - RouterAddress.Type = reader.ReadByte () - Value = reader.ReadByte () |> int |> reader.ReadBytes + RouterAddress.Type = reader.ReadByte() + Value = reader.ReadByte() |> int |> reader.ReadBytes } let rec readAddresses addresses n = if n = 0uy then addresses else - readAddresses (addresses @ [ readAddress () ]) (n - 1uy) + readAddresses(addresses @ [ readAddress() ]) (n - 1uy) let time = ReadBigEndianUInt32 reader - let otherAddress = readAddress () - let myAddressesCount = reader.ReadByte () + let otherAddress = readAddress() + let myAddressesCount = reader.ReadByte() let myAddresses = readAddresses List.Empty myAddressesCount { @@ -49,17 +49,17 @@ type CellNetInfo = member self.Serialize writer = - let writeAddress (addr: RouterAddress) = + let writeAddress(addr: RouterAddress) = writer.Write addr.Type addr.Value.Length |> byte |> writer.Write writer.Write addr.Value - let rec writeAddresses (addresses: seq) = + let rec writeAddresses(addresses: seq) = match Seq.tryHead addresses with | None -> () | Some addr -> writeAddress addr - writeAddresses (Seq.tail addresses) + writeAddresses(Seq.tail addresses) WriteUInt32BigEndian writer self.Time writeAddress self.OtherAddress diff --git a/NOnion/Cells/CellPadding.fs b/NOnion/Cells/CellPadding.fs index 2b72b469..a7207c30 100644 --- a/NOnion/Cells/CellPadding.fs +++ b/NOnion/Cells/CellPadding.fs @@ -9,7 +9,7 @@ type CellPadding = Bytes: array } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = { Bytes = reader.ReadBytes Constants.FixedPayloadLength } diff --git a/NOnion/Cells/CellVersions.fs b/NOnion/Cells/CellVersions.fs index 68817556..5d079ef3 100644 --- a/NOnion/Cells/CellVersions.fs +++ b/NOnion/Cells/CellVersions.fs @@ -9,7 +9,7 @@ type CellVersions = Versions: seq } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let rec readVersions versions = if (reader.BaseStream.Length - reader.BaseStream.Position) % 2L @@ -20,7 +20,7 @@ type CellVersions = if reader.BaseStream.Length = reader.BaseStream.Position then versions else - readVersions (versions @ [ ReadBigEndianUInt16 reader ]) + readVersions(versions @ [ ReadBigEndianUInt16 reader ]) let versions = readVersions List.empty @@ -35,11 +35,11 @@ type CellVersions = member self.Serialize writer = - let rec writeVersions (versions: seq) = + let rec writeVersions(versions: seq) = match Seq.tryHead versions with | None -> () | Some version -> WriteUInt16BigEndian writer version - writeVersions (Seq.tail versions) + writeVersions(Seq.tail versions) writeVersions self.Versions diff --git a/NOnion/Cells/Command.fs b/NOnion/Cells/Command.fs index e0353f3c..6aeab561 100644 --- a/NOnion/Cells/Command.fs +++ b/NOnion/Cells/Command.fs @@ -44,7 +44,7 @@ module Command = [] let Created2 = 11uy - let IsVariableLength (command: byte) : bool = + let IsVariableLength(command: byte) : bool = command = 7uy || command >= 128uy /// Serialize a cell, assuming its command has already been written. @@ -68,10 +68,10 @@ module Command = | Destroy -> CellDestroy.Deserialize reader | Create2 -> CellCreate2.Deserialize reader | Created2 -> CellCreated2.Deserialize reader - | _ -> raise <| NotImplementedException () + | _ -> raise <| NotImplementedException() // Is there any non generic way for this? - let GetCommandByCellType<'T when 'T :> ICell> () = + let GetCommandByCellType<'T when 'T :> ICell>() = match typeof<'T> with | t when t = typeof -> Certs | t when t = typeof -> AuthChallenge @@ -84,4 +84,4 @@ module Command = | t when t = typeof -> Destroy | t when t = typeof -> Create2 | t when t = typeof -> Created2 - | _ -> raise <| NotImplementedException () + | _ -> raise <| NotImplementedException() diff --git a/NOnion/Cells/Relay/CellPlainRelay.fs b/NOnion/Cells/Relay/CellPlainRelay.fs index 013760c7..0b61e781 100644 --- a/NOnion/Cells/Relay/CellPlainRelay.fs +++ b/NOnion/Cells/Relay/CellPlainRelay.fs @@ -50,19 +50,19 @@ type RelayData = | RelayRendezvous2 of RelayRendezvous static member FromBytes (command: byte) (data: array) = - use memStream = new MemoryStream (data) - use reader = new BinaryReader (memStream) + use memStream = new MemoryStream(data) + use reader = new BinaryReader(memStream) match command with | RelayCommands.RelayBegin -> RelayBegin.FromBytes reader |> RelayBegin | RelayCommands.RelayData -> RelayData data | RelayCommands.RelayEnd -> - reader.ReadByte () + reader.ReadByte() |> LanguagePrimitives.EnumOfValue |> RelayEnd | RelayCommands.RelayConnected -> RelayConnected data | RelayCommands.RelayTruncated -> - reader.ReadByte () + reader.ReadByte() |> LanguagePrimitives.EnumOfValue |> RelayTruncated | RelayCommands.RelayExtended2 -> @@ -83,7 +83,7 @@ type RelayData = RelayIntroduceAck.FromBytes reader |> RelayIntroduceAck | _ -> failwith "Unsupported command" - member self.GetCommand () : byte = + member self.GetCommand() : byte = match self with | RelayBegin _ -> RelayCommands.RelayBegin | RelayBeginDirectory -> RelayCommands.RelayBeginDirectory @@ -101,21 +101,21 @@ type RelayData = | RelayIntroduceAck _ -> RelayCommands.RelayIntroduceAck | _ -> failwith "Not implemeted yet" - member self.ToBytes () = + member self.ToBytes() = match self with - | RelayBegin relayBegin -> relayBegin.ToBytes () + | RelayBegin relayBegin -> relayBegin.ToBytes() | RelayConnected data -> data | RelayData data -> data | RelaySendMe _ -> Array.zeroCreate 3 | RelayEnd reason -> reason |> byte |> Array.singleton - | RelayExtend2 extend2 -> extend2.ToBytes () + | RelayExtend2 extend2 -> extend2.ToBytes() | RelayEstablishIntro establishIntro -> establishIntro.ToBytes true true | RelayEstablishRendezvous cookie -> cookie - | RelayIntroduceAck introduceAck -> introduceAck.ToBytes () + | RelayIntroduceAck introduceAck -> introduceAck.ToBytes() | RelayIntroduce1 introducePayload - | RelayIntroduce2 introducePayload -> introducePayload.ToBytes () + | RelayIntroduce2 introducePayload -> introducePayload.ToBytes() | RelayRendezvous1 rendezvousPayload - | RelayRendezvous2 rendezvousPayload -> rendezvousPayload.ToBytes () + | RelayRendezvous2 rendezvousPayload -> rendezvousPayload.ToBytes() | _ -> Array.zeroCreate 0 type CellPlainRelay = @@ -132,7 +132,7 @@ type CellPlainRelay = (data: RelayData) (digest: array) = - let payload = data.ToBytes () + let payload = data.ToBytes() let paddingLen = Constants.MaximumRelayPayloadLength - payload.Length @@ -156,10 +156,10 @@ type CellPlainRelay = Padding = padding } - static member FromBytes (bytes: array) = - use memStream = new MemoryStream (bytes) - use reader = new BinaryReader (memStream) - let relayCommand = reader.ReadByte () + static member FromBytes(bytes: array) = + use memStream = new MemoryStream(bytes) + use reader = new BinaryReader(memStream) + let relayCommand = reader.ReadByte() let recognized = BinaryIO.ReadBigEndianUInt16 reader let streamId = BinaryIO.ReadBigEndianUInt16 reader let digest = reader.ReadBytes Constants.RelayDigestLength @@ -168,7 +168,7 @@ type CellPlainRelay = BinaryIO.ReadBigEndianUInt16 reader |> int |> reader.ReadBytes let padding = - reader.ReadBytes (Constants.MaximumRelayPayloadLength - data.Length) + reader.ReadBytes(Constants.MaximumRelayPayloadLength - data.Length) { Recognized = recognized @@ -178,10 +178,10 @@ type CellPlainRelay = Padding = padding } - member self.ToBytes (emptyDigest: bool) : array = - use memStream = new MemoryStream (Constants.FixedPayloadLength) - use writer = new BinaryWriter (memStream) - self.Data.GetCommand () |> writer.Write + member self.ToBytes(emptyDigest: bool) : array = + use memStream = new MemoryStream(Constants.FixedPayloadLength) + use writer = new BinaryWriter(memStream) + self.Data.GetCommand() |> writer.Write self.Recognized |> BinaryIO.WriteUInt16BigEndian writer @@ -195,12 +195,12 @@ type CellPlainRelay = digest |> writer.Write - self.Data.ToBytes () + self.Data.ToBytes() |> Array.length |> uint16 |> BinaryIO.WriteUInt16BigEndian writer - self.Data.ToBytes () |> writer.Write + self.Data.ToBytes() |> writer.Write self.Padding |> writer.Write - memStream.ToArray () + memStream.ToArray() diff --git a/NOnion/Cells/Relay/RelayBegin.fs b/NOnion/Cells/Relay/RelayBegin.fs index cc682ddc..1ee1ee7b 100644 --- a/NOnion/Cells/Relay/RelayBegin.fs +++ b/NOnion/Cells/Relay/RelayBegin.fs @@ -14,12 +14,12 @@ type RelayBegin = Flags: uint } - static member FromBytes (reader: BinaryReader) = - let rec readAddress (state: string) = - let nextChar = reader.ReadChar () + static member FromBytes(reader: BinaryReader) = + let rec readAddress(state: string) = + let nextChar = reader.ReadChar() if nextChar <> Char.MinValue then - readAddress (state + string (nextChar)) + readAddress(state + string(nextChar)) else state @@ -28,7 +28,7 @@ type RelayBegin = Flags = BinaryIO.ReadBigEndianUInt32 reader } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.Address + string Char.MinValue |> Encoding.ASCII.GetBytes diff --git a/NOnion/Cells/Relay/RelayEstablishIntro.fs b/NOnion/Cells/Relay/RelayEstablishIntro.fs index 8f455ca3..e848c0f3 100644 --- a/NOnion/Cells/Relay/RelayEstablishIntro.fs +++ b/NOnion/Cells/Relay/RelayEstablishIntro.fs @@ -13,9 +13,9 @@ type RelayIntroAuthKey = | ED25519SHA3256 of array | Legacy - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = let authKeyType, data = - reader.ReadByte (), + reader.ReadByte(), BinaryIO.ReadBigEndianUInt16 reader |> int |> reader.ReadBytes match authKeyType with @@ -24,7 +24,7 @@ type RelayIntroAuthKey = | 2uy -> ED25519SHA3256 data | _ -> failwith "Unknown authentication key" - member self.ToBytes () = + member self.ToBytes() = match self with | Legacy -> failwith "NIE" | ED25519SHA3256 data -> @@ -53,14 +53,14 @@ type RelayIntroExtension = ExtensionField: array } - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = { - ExtensionType = reader.ReadByte () + ExtensionType = reader.ReadByte() ExtensionField = BinaryIO.ReadBigEndianUInt16 reader |> int |> reader.ReadBytes } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.ExtensionType |> Array.singleton @@ -84,7 +84,7 @@ type RelayEstablishIntro = let relayData = { RelayEstablishIntro.AuthKey = - publicKey.GetEncoded () |> RelayIntroAuthKey.ED25519SHA3256 + publicKey.GetEncoded() |> RelayIntroAuthKey.ED25519SHA3256 Extensions = List.empty HandshakeAuth = Array.empty Signature = Array.empty @@ -114,11 +114,11 @@ type RelayEstablishIntro = - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = let authKey = RelayIntroAuthKey.FromBytes reader let extensions = - let extensionCount = reader.ReadByte () + let extensionCount = reader.ReadByte() let rec readExtensionsList state n = if n = 0uy then @@ -126,7 +126,7 @@ type RelayEstablishIntro = else readExtensionsList (state - @ List.singleton (RelayIntroExtension.FromBytes reader)) + @ List.singleton(RelayIntroExtension.FromBytes reader)) (n - 1uy) readExtensionsList List.empty extensionCount @@ -173,10 +173,10 @@ type RelayEstablishIntro = Array.concat [ - self.AuthKey.ToBytes () + self.AuthKey.ToBytes() self.Extensions.Length |> byte |> Array.singleton self.Extensions - |> List.map (fun ext -> ext.ToBytes ()) + |> List.map(fun ext -> ext.ToBytes()) |> Array.concat digestAndSignature ] diff --git a/NOnion/Cells/Relay/RelayExtend2.fs b/NOnion/Cells/Relay/RelayExtend2.fs index a5e5b042..49802ca1 100644 --- a/NOnion/Cells/Relay/RelayExtend2.fs +++ b/NOnion/Cells/Relay/RelayExtend2.fs @@ -19,7 +19,7 @@ type LinkSpecifier = Data: array } - member self.ToEndPoint () = + member self.ToEndPoint() = match self.Type with | LinkSpecifierType.TLSOverTCPV4 -> self.Data |> Array.take 4 |> IPAddress, @@ -38,11 +38,11 @@ type LinkSpecifier = | _ -> failwith "Non endpooint-type link specifier" |> IPEndPoint - static member CreateFromEndPoint (endPoint: IPEndPoint) = - let translateIPEndpoint (endpoint: IPEndPoint) = + static member CreateFromEndPoint(endPoint: IPEndPoint) = + let translateIPEndpoint(endpoint: IPEndPoint) = Array.concat [ - endpoint.Address.GetAddressBytes () + endpoint.Address.GetAddressBytes() endpoint.Port |> uint16 |> IntegerSerialization.FromUInt16ToBigEndianByteArray @@ -59,7 +59,7 @@ type LinkSpecifier = Data = translateIPEndpoint endPoint } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ [| @@ -69,12 +69,12 @@ type LinkSpecifier = self.Data ] - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let linkType = - reader.ReadByte () + reader.ReadByte() |> LanguagePrimitives.EnumOfValue - let data = reader.ReadByte () |> int |> reader.ReadBytes + let data = reader.ReadByte() |> int |> reader.ReadBytes { Type = linkType @@ -89,13 +89,13 @@ type RelayExtend2 = HandshakeData: array } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.LinkSpecifiers.Length |> byte |> Array.singleton self.LinkSpecifiers - |> List.map (fun link -> link.ToBytes ()) + |> List.map(fun link -> link.ToBytes()) |> Array.concat self.HandshakeType diff --git a/NOnion/Cells/Relay/RelayExtended2.fs b/NOnion/Cells/Relay/RelayExtended2.fs index eef1c848..b9f19cec 100644 --- a/NOnion/Cells/Relay/RelayExtended2.fs +++ b/NOnion/Cells/Relay/RelayExtended2.fs @@ -12,7 +12,7 @@ type RelayExtended2 = HandshakeData: array } - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = { HandshakeData = BinaryIO.ReadBigEndianUInt16 reader |> int |> reader.ReadBytes diff --git a/NOnion/Cells/Relay/RelayIntroduce.fs b/NOnion/Cells/Relay/RelayIntroduce.fs index 7828ea6b..11ebc620 100644 --- a/NOnion/Cells/Relay/RelayIntroduce.fs +++ b/NOnion/Cells/Relay/RelayIntroduce.fs @@ -14,11 +14,11 @@ type RelayIntroduceInnerData = RendezvousLinkSpecifiers: List } - static member Deserialize (reader: BinaryReader) = + static member Deserialize(reader: BinaryReader) = let cookie = reader.ReadBytes Constants.RendezvousCookieLength let extensions = - let extensionCount = reader.ReadByte () + let extensionCount = reader.ReadByte() let rec readExtensionsList state n = if n = 0uy then @@ -26,12 +26,12 @@ type RelayIntroduceInnerData = else readExtensionsList (state - @ List.singleton (RelayIntroExtension.FromBytes reader)) + @ List.singleton(RelayIntroExtension.FromBytes reader)) (n - 1uy) readExtensionsList List.empty extensionCount - let onionKeyType = reader.ReadByte () |> int + let onionKeyType = reader.ReadByte() |> int if onionKeyType <> Constants.RelayIntroduceKeyType then failwith "Unsupported onion key" @@ -50,9 +50,9 @@ type RelayIntroduceInnerData = LinkSpecifier.Deserialize reader |> List.singleton |> List.append state - |> readLinkSpecifier (n - 1uy) + |> readLinkSpecifier(n - 1uy) - let linkSpecifiers = readLinkSpecifier (reader.ReadByte ()) List.empty + let linkSpecifiers = readLinkSpecifier(reader.ReadByte()) List.empty { RendezvousCookie = cookie @@ -61,13 +61,13 @@ type RelayIntroduceInnerData = Extensions = extensions } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.RendezvousCookie self.Extensions.Length |> byte |> Array.singleton self.Extensions - |> List.map (fun ext -> ext.ToBytes ()) + |> List.map(fun ext -> ext.ToBytes()) |> Array.concat Array.singleton 1uy self.OnionKey.Length @@ -76,7 +76,7 @@ type RelayIntroduceInnerData = self.OnionKey self.RendezvousLinkSpecifiers.Length |> byte |> Array.singleton self.RendezvousLinkSpecifiers - |> List.map (fun link -> link.ToBytes ()) + |> List.map(fun link -> link.ToBytes()) |> Array.concat ] @@ -89,16 +89,16 @@ type RelayIntroduce = Mac: array } - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = let legacyKeyId = reader.ReadBytes 20 - if not (legacyKeyId |> Array.forall (fun byte -> byte = 0uy)) then + if not(legacyKeyId |> Array.forall(fun byte -> byte = 0uy)) then failwith "Legacy key id should be all zeroes" let authKey = RelayIntroAuthKey.FromBytes reader let extensions = - let extensionCount = reader.ReadByte () + let extensionCount = reader.ReadByte() let rec readExtensionsList state n = if n = 0uy then @@ -106,7 +106,7 @@ type RelayIntroduce = else readExtensionsList (state - @ List.singleton (RelayIntroExtension.FromBytes reader)) + @ List.singleton(RelayIntroExtension.FromBytes reader)) (n - 1uy) readExtensionsList List.empty extensionCount @@ -133,14 +133,14 @@ type RelayIntroduce = Mac = mac } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ Array.zeroCreate 20 - self.AuthKey.ToBytes () + self.AuthKey.ToBytes() self.Extensions.Length |> byte |> Array.singleton self.Extensions - |> List.map (fun ext -> ext.ToBytes ()) + |> List.map(fun ext -> ext.ToBytes()) |> Array.concat self.ClientPublicKey self.EncryptedData diff --git a/NOnion/Cells/Relay/RelayIntroduceAck.fs b/NOnion/Cells/Relay/RelayIntroduceAck.fs index c4eefb72..86f0bc16 100644 --- a/NOnion/Cells/Relay/RelayIntroduceAck.fs +++ b/NOnion/Cells/Relay/RelayIntroduceAck.fs @@ -19,14 +19,14 @@ type RelayIntroduceAck = Extensions: List } - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = let status = reader.ReadBytes 2 |> IntegerSerialization.FromBigEndianByteArrayToUInt16 |> LanguagePrimitives.EnumOfValue let extensions = - let extensionCount = reader.ReadByte () + let extensionCount = reader.ReadByte() let rec readExtensionsList state n = if n = 0uy then @@ -34,7 +34,7 @@ type RelayIntroduceAck = else readExtensionsList (state - @ List.singleton (RelayIntroExtension.FromBytes reader)) + @ List.singleton(RelayIntroExtension.FromBytes reader)) (n - 1uy) readExtensionsList List.empty extensionCount @@ -44,7 +44,7 @@ type RelayIntroduceAck = Extensions = extensions } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.Status @@ -52,6 +52,6 @@ type RelayIntroduceAck = |> IntegerSerialization.FromUInt16ToBigEndianByteArray self.Extensions.Length |> byte |> Array.singleton self.Extensions - |> List.map (fun ext -> ext.ToBytes ()) + |> List.map(fun ext -> ext.ToBytes()) |> Array.concat ] diff --git a/NOnion/Cells/Relay/RelayRendezvous.fs b/NOnion/Cells/Relay/RelayRendezvous.fs index 337381ee..2890673c 100644 --- a/NOnion/Cells/Relay/RelayRendezvous.fs +++ b/NOnion/Cells/Relay/RelayRendezvous.fs @@ -8,10 +8,10 @@ type RelayRendezvous = HandshakeData: array } - member self.ToBytes () = + member self.ToBytes() = Array.concat [ self.Cookie; self.HandshakeData ] - static member FromBytes (reader: BinaryReader) = + static member FromBytes(reader: BinaryReader) = { Cookie = Array.empty HandshakeData = diff --git a/NOnion/Constants.fs b/NOnion/Constants.fs index 2c2ebf1b..33f18b44 100644 --- a/NOnion/Constants.fs +++ b/NOnion/Constants.fs @@ -118,7 +118,7 @@ module Constants = let internal HiddenServiceBlindString = "Derive temporary signing key" |> Encoding.ASCII.GetBytes - |> Array.append (Array.singleton 0uy) + |> Array.append(Array.singleton 0uy) let RendezvousCookieLength = 20 diff --git a/NOnion/Crypto/HiddenServicesCipher.fs b/NOnion/Crypto/HiddenServicesCipher.fs index 7b944a17..8b4bc226 100644 --- a/NOnion/Crypto/HiddenServicesCipher.fs +++ b/NOnion/Crypto/HiddenServicesCipher.fs @@ -21,10 +21,10 @@ module HiddenServicesCipher = Array.concat [ keyLenBytes; key; msg ] - let digestEngine = Sha3Digest () - let output = Array.zeroCreate (digestEngine.GetDigestSize ()) - digestEngine.BlockUpdate (data, 0, data.Length) - digestEngine.DoFinal (output, 0) |> ignore + let digestEngine = Sha3Digest() + let output = Array.zeroCreate(digestEngine.GetDigestSize()) + digestEngine.BlockUpdate(data, 0, data.Length) + digestEngine.DoFinal(output, 0) |> ignore output @@ -32,17 +32,17 @@ module HiddenServicesCipher = (privateKey: Ed25519PrivateKeyParameters) (data: array) = - let signer = Ed25519Signer () - signer.Init (true, privateKey) - signer.BlockUpdate (data, 0, data.Length) - signer.GenerateSignature () + let signer = Ed25519Signer() + signer.Init(true, privateKey) + signer.BlockUpdate(data, 0, data.Length) + signer.GenerateSignature() let CalculateShake256 (length: int) (data: array) = let digestEngine = ShakeDigest 256 let output = Array.zeroCreate length - digestEngine.BlockUpdate (data, 0, data.Length) - digestEngine.DoFinal (output, 0) |> ignore + digestEngine.BlockUpdate(data, 0, data.Length) + digestEngine.DoFinal(output, 0) |> ignore output let CalculateBlindingFactor @@ -60,25 +60,25 @@ module HiddenServicesCipher = |> IntegerSerialization.FromUInt64ToBigEndianByteArray ] - let digestEngine = Sha3Digest () - let output = Array.zeroCreate (digestEngine.GetDigestSize ()) + let digestEngine = Sha3Digest() + let output = Array.zeroCreate(digestEngine.GetDigestSize()) - digestEngine.BlockUpdate ( + digestEngine.BlockUpdate( Constants.HiddenServiceBlindString, 0, Constants.HiddenServiceBlindString.Length ) - digestEngine.BlockUpdate (publicKey, 0, publicKey.Length) + digestEngine.BlockUpdate(publicKey, 0, publicKey.Length) - digestEngine.BlockUpdate ( + digestEngine.BlockUpdate( Constants.Ed25519BasePointString, 0, Constants.Ed25519BasePointString.Length ) - digestEngine.BlockUpdate (nonce, 0, nonce.Length) - digestEngine.DoFinal (output, 0) |> ignore + digestEngine.BlockUpdate(nonce, 0, nonce.Length) + digestEngine.DoFinal(output, 0) |> ignore //CLAMPING output.[0] <- output.[0] &&& 248uy @@ -96,7 +96,7 @@ module HiddenServicesCipher = blindingFactor.[31] <- blindingFactor.[31] &&& 63uy blindingFactor.[31] <- blindingFactor.[31] ||| 64uy - match Ed25519.CalculateBlindedPublicKey (publicKey, blindingFactor) with + match Ed25519.CalculateBlindedPublicKey(publicKey, blindingFactor) with | true, output -> output | false, _ -> failwith "can't calculate blinded public key" @@ -113,9 +113,9 @@ module HiddenServicesCipher = (periodInfo: uint64 * uint64) (publicKey: array) = - let digestEngine = Sha3Digest () + let digestEngine = Sha3Digest() - let credential = digestEngine.GetByteLength () |> Array.zeroCreate + let credential = digestEngine.GetByteLength() |> Array.zeroCreate let credentialDigestInput = Array.concat @@ -124,13 +124,13 @@ module HiddenServicesCipher = publicKey ] - digestEngine.BlockUpdate ( + digestEngine.BlockUpdate( credentialDigestInput, 0, credentialDigestInput.Length ) - digestEngine.DoFinal (credential, 0) |> ignore + digestEngine.DoFinal(credential, 0) |> ignore let blindedKey = BuildBlindedPublicKey periodInfo publicKey @@ -142,15 +142,15 @@ module HiddenServicesCipher = blindedKey ] - let subcredential = digestEngine.GetByteLength () |> Array.zeroCreate + let subcredential = digestEngine.GetByteLength() |> Array.zeroCreate - digestEngine.BlockUpdate ( + digestEngine.BlockUpdate( subcredentialDigestInput, 0, subcredentialDigestInput.Length ) - digestEngine.DoFinal (subcredential, 0) |> ignore + digestEngine.DoFinal(subcredential, 0) |> ignore subcredential @@ -163,12 +163,12 @@ module HiddenServicesCipher = (periodInfo: uint64 * uint64) (masterPubKey: array) = - let keyAgreement = X25519Agreement () + let keyAgreement = X25519Agreement() keyAgreement.Init randomClientPrivateKey let sharedSecret = Array.zeroCreate keyAgreement.AgreementSize - keyAgreement.CalculateAgreement (introEncPublicKey, sharedSecret, 0) + keyAgreement.CalculateAgreement(introEncPublicKey, sharedSecret, 0) let subcredential = GetSubCredential periodInfo masterPubKey @@ -176,9 +176,9 @@ module HiddenServicesCipher = Array.concat [ sharedSecret - introAuthPublicKey.GetEncoded () - randomClientPublicKey.GetEncoded () - introEncPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + randomClientPublicKey.GetEncoded() + introEncPublicKey.GetEncoded() Constants.HiddenServiceNTor.ProtoId ] @@ -202,7 +202,7 @@ module HiddenServicesCipher = let encKey = hsKeys |> Array.take 32 let macKey = hsKeys |> Array.skip 32 |> Array.take 32 - let cipher = TorStreamCipher (encKey, None) + let cipher = TorStreamCipher(encKey, None) let digest = data |> CalculateMacWithSHA3256 macKey let encryptedInnerData = data |> cipher.Encrypt @@ -218,11 +218,11 @@ module HiddenServicesCipher = (periodInfo: uint64 * uint64) (masterPubKey: array) = - let keyAgreement = X25519Agreement () + let keyAgreement = X25519Agreement() keyAgreement.Init introEncPrivateKey let sharedSecret = Array.zeroCreate keyAgreement.AgreementSize - keyAgreement.CalculateAgreement (clientRandomKey, sharedSecret, 0) + keyAgreement.CalculateAgreement(clientRandomKey, sharedSecret, 0) let subcredential = GetSubCredential periodInfo masterPubKey @@ -230,9 +230,9 @@ module HiddenServicesCipher = Array.concat [ sharedSecret - introAuthPublicKey.GetEncoded () - clientRandomKey.GetEncoded () - introEncPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + clientRandomKey.GetEncoded() + introEncPublicKey.GetEncoded() Constants.HiddenServiceNTor.ProtoId ] @@ -260,7 +260,7 @@ module HiddenServicesCipher = |> Array.skip Constants.KeyS256Length |> Array.take Constants.Digest256Length - let cipher = TorStreamCipher (encKey, None) + let cipher = TorStreamCipher(encKey, None) let decryptedData = encryptedData |> cipher.Encrypt let digest = decryptedData |> CalculateMacWithSHA3256 macKey @@ -275,8 +275,7 @@ module HiddenServicesCipher = (introEncPrivateKey: X25519PrivateKeyParameters) (introEncPublicKey: X25519PublicKeyParameters) = - let keyAgreementY, keyAgreementB = - X25519Agreement (), X25519Agreement () + let keyAgreementY, keyAgreementB = X25519Agreement(), X25519Agreement() keyAgreementY.Init serverRandomPrivateKey keyAgreementB.Init introEncPrivateKey @@ -285,18 +284,18 @@ module HiddenServicesCipher = Array.zeroCreate keyAgreementY.AgreementSize, Array.zeroCreate keyAgreementB.AgreementSize - keyAgreementY.CalculateAgreement (clientPublicKey, sharedSecretXy, 0) - keyAgreementB.CalculateAgreement (clientPublicKey, sharedSecretXb, 0) + keyAgreementY.CalculateAgreement(clientPublicKey, sharedSecretXy, 0) + keyAgreementB.CalculateAgreement(clientPublicKey, sharedSecretXb, 0) let rendSecretHsInput = Array.concat [ sharedSecretXy sharedSecretXb - introAuthPublicKey.GetEncoded () - introEncPublicKey.GetEncoded () - clientPublicKey.GetEncoded () - serverRandomPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + introEncPublicKey.GetEncoded() + clientPublicKey.GetEncoded() + serverRandomPublicKey.GetEncoded() Constants.HiddenServiceNTor.ProtoId ] @@ -314,10 +313,10 @@ module HiddenServicesCipher = Array.concat [ verify - introAuthPublicKey.GetEncoded () - introEncPublicKey.GetEncoded () - serverRandomPublicKey.GetEncoded () - clientPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + introEncPublicKey.GetEncoded() + serverRandomPublicKey.GetEncoded() + clientPublicKey.GetEncoded() Constants.HiddenServiceNTor.AuthInputSuffix ] @@ -333,7 +332,7 @@ module HiddenServicesCipher = (introAuthPublicKey: Ed25519PublicKeyParameters) (introEncPublicKey: X25519PublicKeyParameters) = - let keyAgreement = X25519Agreement () + let keyAgreement = X25519Agreement() keyAgreement.Init clientPrivateKey @@ -341,18 +340,18 @@ module HiddenServicesCipher = Array.zeroCreate keyAgreement.AgreementSize, Array.zeroCreate keyAgreement.AgreementSize - keyAgreement.CalculateAgreement (serverPublicKey, sharedSecretXy, 0) - keyAgreement.CalculateAgreement (introEncPublicKey, sharedSecretXb, 0) + keyAgreement.CalculateAgreement(serverPublicKey, sharedSecretXy, 0) + keyAgreement.CalculateAgreement(introEncPublicKey, sharedSecretXb, 0) let rendSecretHsInput = Array.concat [ sharedSecretXy sharedSecretXb - introAuthPublicKey.GetEncoded () - introEncPublicKey.GetEncoded () - clientPublicKey.GetEncoded () - serverPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + introEncPublicKey.GetEncoded() + clientPublicKey.GetEncoded() + serverPublicKey.GetEncoded() Constants.HiddenServiceNTor.ProtoId ] @@ -370,10 +369,10 @@ module HiddenServicesCipher = Array.concat [ verify - introAuthPublicKey.GetEncoded () - introEncPublicKey.GetEncoded () - serverPublicKey.GetEncoded () - clientPublicKey.GetEncoded () + introAuthPublicKey.GetEncoded() + introEncPublicKey.GetEncoded() + serverPublicKey.GetEncoded() + clientPublicKey.GetEncoded() Constants.HiddenServiceNTor.AuthInputSuffix ] diff --git a/NOnion/Crypto/Kdf/Kdf.fs b/NOnion/Crypto/Kdf/Kdf.fs index f141752d..d6f89e78 100644 --- a/NOnion/Crypto/Kdf/Kdf.fs +++ b/NOnion/Crypto/Kdf/Kdf.fs @@ -12,17 +12,16 @@ open NOnion open NOnion.Crypto module Kdf = - let ComputeLegacyKdf (k0: array) : KdfResult = - use sha1Engine = new SHA1Managed () + let ComputeLegacyKdf(k0: array) : KdfResult = + use sha1Engine = new SHA1Managed() let rec innerCompute (i: byte) (state: array) = if state.Length > Constants.KdfLength then state else - let hashResult = - sha1Engine.ComputeHash (Array.append k0 [| i |]) + let hashResult = sha1Engine.ComputeHash(Array.append k0 [| i |]) - innerCompute (i + 1uy) (Array.append state hashResult) + innerCompute(i + 1uy) (Array.append state hashResult) let kdfBytes = innerCompute 0uy Array.empty @@ -36,17 +35,17 @@ module Kdf = // Offset = 2 * HashLength, Length = HashLength let backwardDigest = - Array.skip (2 * Constants.HashLength) kdfBytes + Array.skip(2 * Constants.HashLength) kdfBytes |> Array.take Constants.HashLength // Offset = 3 * HashLength, Length = KeyLength let forwardKey = - Array.skip (3 * Constants.HashLength) kdfBytes + Array.skip(3 * Constants.HashLength) kdfBytes |> Array.take Constants.KeyLength // Offset = 3 * HashLength + KeyLength, Length = KeyLength let backwardKey = - Array.skip (3 * Constants.HashLength + Constants.KeyLength) kdfBytes + Array.skip(3 * Constants.HashLength + Constants.KeyLength) kdfBytes |> Array.take Constants.KeyLength { @@ -57,17 +56,17 @@ module Kdf = KeyHandshake = keyHandshake } - let ComputeRfc5869Kdf (ikm: array) : KdfResult = + let ComputeRfc5869Kdf(ikm: array) : KdfResult = let kdfBytes = Array.zeroCreate Constants.KdfLength - let hash = Sha256Digest () + let hash = Sha256Digest() let parameters = - HkdfParameters (ikm, Constants.NTorTKey, Constants.NTorMExpand) + HkdfParameters(ikm, Constants.NTorTKey, Constants.NTorMExpand) let hkdf = HkdfBytesGenerator hash hkdf.Init parameters - hkdf.GenerateBytes (kdfBytes, 0, Constants.KdfLength) |> ignore + hkdf.GenerateBytes(kdfBytes, 0, Constants.KdfLength) |> ignore // Offset = 0, Length = HashLength let forwardDigest = @@ -80,12 +79,12 @@ module Kdf = // Offset = 2 * HashLength, Length = KeyLength let forwardKey = - Array.skip (2 * Constants.HashLength) kdfBytes + Array.skip(2 * Constants.HashLength) kdfBytes |> Array.take Constants.KeyLength // Offset = 2 * HashLength + KeyLength, Length = KeyLength let backwardKey = - Array.skip (2 * Constants.HashLength + Constants.KeyLength) kdfBytes + Array.skip(2 * Constants.HashLength + Constants.KeyLength) kdfBytes |> Array.take Constants.KeyLength // Offset = 2 * HashLength + 2 * KeyLength, Length = HashLength @@ -103,14 +102,14 @@ module Kdf = KeyHandshake = keyHandshake } - let ComputeHSKdf (ntorKeySeed: array) : KdfResult = + let ComputeHSKdf(ntorKeySeed: array) : KdfResult = let kdfBytes = Array.concat [ ntorKeySeed Constants.HiddenServiceNTor.MExpand ] - |> HiddenServicesCipher.CalculateShake256 ( + |> HiddenServicesCipher.CalculateShake256( 2 * Constants.HashLength + 2 * Constants.KeyS256Length ) @@ -125,7 +124,7 @@ module Kdf = // Offset = 2 * HashLength, Length = KeyS256Length let forwardKey = - Array.skip (2 * Constants.HashLength) kdfBytes + Array.skip(2 * Constants.HashLength) kdfBytes |> Array.take Constants.KeyS256Length // Offset = 2 * HashLength + KeyS256Length, Length = KeyS256Length diff --git a/NOnion/Crypto/TorCryptoState.fs b/NOnion/Crypto/TorCryptoState.fs index 2276811c..30674565 100644 --- a/NOnion/Crypto/TorCryptoState.fs +++ b/NOnion/Crypto/TorCryptoState.fs @@ -17,10 +17,10 @@ type TorCryptoState = (kdfResult: KdfResult) (reverse: bool) : TorCryptoState = - let fCipher = TorStreamCipher (kdfResult.ForwardKey, None) - let bCipher = TorStreamCipher (kdfResult.BackwardKey, None) - let fDigest = TorMessageDigest () - let bDigest = TorMessageDigest () + let fCipher = TorStreamCipher(kdfResult.ForwardKey, None) + let bCipher = TorStreamCipher(kdfResult.BackwardKey, None) + let fDigest = TorMessageDigest() + let bDigest = TorMessageDigest() fDigest.Update kdfResult.ForwardDigest 0 kdfResult.ForwardDigest.Length diff --git a/NOnion/Crypto/TorMessageDigest.fs b/NOnion/Crypto/TorMessageDigest.fs index a34482c8..42ff2238 100644 --- a/NOnion/Crypto/TorMessageDigest.fs +++ b/NOnion/Crypto/TorMessageDigest.fs @@ -9,7 +9,7 @@ open Org.BouncyCastle.Crypto.Digests * We have to use bouncycastle's SHA instead of .NET's because .NET version have no option * to keep the state (for a running digest) but you can clone the BCL version before resetting the state. *) -type TorMessageDigest (isSha256: bool) = +type TorMessageDigest(isSha256: bool) = [] let TOR_DIGEST256_SIZE = 32 @@ -25,15 +25,15 @@ type TorMessageDigest (isSha256: bool) = else TOR_DIGEST_SIZE - new () = TorMessageDigest false + new() = TorMessageDigest false - member self.GetDigestBytes () : array = + member self.GetDigestBytes() : array = let hash = Array.zeroCreate hashSize let clone = DigestUtils.CreateDigestInstance isSha256 (Some digestInstance) - clone.DoFinal (hash, 0) |> ignore + clone.DoFinal(hash, 0) |> ignore hash member self.PeekDigest @@ -46,9 +46,9 @@ type TorMessageDigest (isSha256: bool) = let clone = DigestUtils.CreateDigestInstance isSha256 (Some digestInstance) - clone.BlockUpdate (data, offset, length) |> ignore - clone.DoFinal (hash, 0) |> ignore + clone.BlockUpdate(data, offset, length) |> ignore + clone.DoFinal(hash, 0) |> ignore hash member self.Update (data: array) (offset: int) (length: int) = - digestInstance.BlockUpdate (data, offset, length) + digestInstance.BlockUpdate(data, offset, length) diff --git a/NOnion/Crypto/TorStreamCipher.fs b/NOnion/Crypto/TorStreamCipher.fs index c102e37b..af1787ac 100644 --- a/NOnion/Crypto/TorStreamCipher.fs +++ b/NOnion/Crypto/TorStreamCipher.fs @@ -3,7 +3,7 @@ open System.Security.Cryptography open System -type TorStreamCipher (keyBytes: array, ivOpt: Option>) = +type TorStreamCipher(keyBytes: array, ivOpt: Option>) = [] let BlockSize = 16 @@ -17,12 +17,12 @@ type TorStreamCipher (keyBytes: array, ivOpt: Option>) = let counterOut: array = Array.zeroCreate BlockSize let mutable keyStreamPointerOpt: Option = None - let encryptLock: obj = obj () + let encryptLock: obj = obj() - member self.Encrypt (data: array) : array = - let safeEncrypt () = + member self.Encrypt(data: array) : array = + let safeEncrypt() = use cipher = - new RijndaelManaged ( + new RijndaelManaged( Key = keyBytes, Mode = CipherMode.ECB, Padding = PaddingMode.None @@ -32,13 +32,13 @@ type TorStreamCipher (keyBytes: array, ivOpt: Option>) = if x >= data.Length then state else - let nextKeyStreamByte () : byte = - let updateCounter () : int = - let encryptCounter () : unit = + let nextKeyStreamByte() : byte = + let updateCounter() : int = + let encryptCounter() : unit = let encryptedCounter = cipher .CreateEncryptor() - .TransformFinalBlock ( + .TransformFinalBlock( counter, 0, BlockSize @@ -51,13 +51,13 @@ type TorStreamCipher (keyBytes: array, ivOpt: Option>) = 0 BlockSize - let increamentCounter () : unit = + let increamentCounter() : unit = let rec innerIncreament i (carry: int) = if i < 0 then () else let x = - (int (counter.[i]) &&& 0xff) + carry + (int(counter.[i]) &&& 0xff) + carry let carry: int = if x > 0xff then @@ -66,29 +66,29 @@ type TorStreamCipher (keyBytes: array, ivOpt: Option>) = 0 counter.[i] <- byte x - innerIncreament (i - 1) carry + innerIncreament(i - 1) carry - innerIncreament (counter.Length - 1) 1 + innerIncreament(counter.Length - 1) 1 - encryptCounter () - increamentCounter () + encryptCounter() + increamentCounter() 0 let keyStreamPointer = match keyStreamPointerOpt with - | None -> updateCounter () + | None -> updateCounter() | Some keyStreamPointer -> if keyStreamPointer >= BlockSize then - updateCounter () + updateCounter() else keyStreamPointer - keyStreamPointerOpt <- Some (keyStreamPointer + 1) + keyStreamPointerOpt <- Some(keyStreamPointer + 1) counterOut.[keyStreamPointer] - let nextByte = (data.[x] ^^^ nextKeyStreamByte ()) - innerEncrypt (x + 1) (Array.append state [| nextByte |]) + let nextByte = (data.[x] ^^^ nextKeyStreamByte()) + innerEncrypt(x + 1) (Array.append state [| nextByte |]) innerEncrypt 0 Array.empty diff --git a/NOnion/Directory/NetworkStatusDocument.fs b/NOnion/Directory/NetworkStatusDocument.fs index 8e28adfb..f1725d80 100644 --- a/NOnion/Directory/NetworkStatusDocument.fs +++ b/NOnion/Directory/NetworkStatusDocument.fs @@ -30,49 +30,49 @@ type DirectorySourceEntry = } - static member Parse (lines: MutableQueue) = + static member Parse(lines: MutableQueue) = let rec innerParse state = if lines.Count = 0 then state else let words = lines.Peek().Split ' ' |> MutableQueue - let readWord () = - words.Dequeue () + let readWord() = + words.Dequeue() - let readInteger () = - words.Dequeue () |> int + let readInteger() = + words.Dequeue() |> int - let readRestAsString () = - words.ToArray () |> String.concat " " + let readRestAsString() = + words.ToArray() |> String.concat " " - match words.Dequeue () with + match words.Dequeue() with | "dir-source" when state.NickName = None -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - NickName = readWord () |> Some - Identity = readWord () |> Some - Address = readWord () |> Some - IP = readWord () |> Some - DirectoryPort = readInteger () |> Some - OnionRouterPort = readInteger () |> Some + NickName = readWord() |> Some + Identity = readWord() |> Some + Address = readWord() |> Some + IP = readWord() |> Some + DirectoryPort = readInteger() |> Some + OnionRouterPort = readInteger() |> Some } | "dir-source" when state.NickName <> None -> state | "contact" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Contact = readRestAsString () |> Some + Contact = readRestAsString() |> Some } | "vote-digest" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - VoteDigest = readRestAsString () |> Some + VoteDigest = readRestAsString() |> Some } | _ -> state @@ -112,91 +112,91 @@ type RouterStatusEntry = PortPolicy = None } - static member Parse (lines: MutableQueue) = + static member Parse(lines: MutableQueue) = let rec innerParse state = if lines.Count = 0 then state else let words = lines.Peek().Split ' ' |> MutableQueue - let readWord () = - words.Dequeue () + let readWord() = + words.Dequeue() - let readInteger () = - words.Dequeue () |> int + let readInteger() = + words.Dequeue() |> int - let readDateTime () = - String.concat " " [ words.Dequeue (); words.Dequeue () ] + let readDateTime() = + String.concat " " [ words.Dequeue(); words.Dequeue() ] |> DateTime.Parse - let readRestAsString () = - words.ToArray () |> String.concat " " + let readRestAsString() = + words.ToArray() |> String.concat " " - match words.Dequeue () with + match words.Dequeue() with | "r" when state.NickName = None -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - NickName = readWord () |> Some - Identity = readWord () |> Some - Digest = readWord () |> Some - PublicationTime = readDateTime () |> Some - IP = readWord () |> Some - OnionRouterPort = readInteger () |> Some - DirectoryPort = readInteger () |> Some + NickName = readWord() |> Some + Identity = readWord() |> Some + Digest = readWord() |> Some + PublicationTime = readDateTime() |> Some + IP = readWord() |> Some + OnionRouterPort = readInteger() |> Some + DirectoryPort = readInteger() |> Some } | "r" when state.NickName <> None -> state | "a" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Address = readRestAsString () |> Some + Address = readRestAsString() |> Some } | "s" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Flags = readRestAsString () |> Some + Flags = readRestAsString() |> Some } | "v" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Version = readRestAsString () |> Some + Version = readRestAsString() |> Some } | "pr" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Protocols = readRestAsString () |> Some + Protocols = readRestAsString() |> Some } | "w" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Bandwidth = readRestAsString () |> Some + Bandwidth = readRestAsString() |> Some } | "p" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - PortPolicy = readRestAsString () |> Some + PortPolicy = readRestAsString() |> Some } | _ -> state innerParse RouterStatusEntry.Empty - member self.GetIdentity () = + member self.GetIdentity() = match self.Identity with | None -> failwith "BUG: identity doesn't exist in RouterStatusEntry" - | Some identity -> identity.Trim () |> Base64Util.FixMissingPadding + | Some identity -> identity.Trim() |> Base64Util.FixMissingPadding type DirectorySignature = { @@ -212,34 +212,34 @@ type DirectorySignature = Signature = None } - static member Parse (lines: MutableQueue) = + static member Parse(lines: MutableQueue) = let rec innerParse state = if lines.Count = 0 then state else - let rec readBlock (state: string) = - let line = lines.Dequeue () + let rec readBlock(state: string) = + let line = lines.Dequeue() if line.StartsWith "-----END" then state + line else - readBlock (state + line) + readBlock(state + line) - let nextLine = lines.Peek () + let nextLine = lines.Peek() let words = nextLine.Split ' ' |> MutableQueue - let readWord () = - words.Dequeue () + let readWord() = + words.Dequeue() - match words.Dequeue () with + match words.Dequeue() with | "directory-signature" when state.Identity = None -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - DirectorySignature.Identity = readWord () |> Some - Digest = readWord () |> Some + DirectorySignature.Identity = readWord() |> Some + Digest = readWord() |> Some Signature = readBlock String.Empty |> Some } | "directory-signature" when state.Identity <> None -> state @@ -301,166 +301,165 @@ type NetworkStatusDocument = Signatures = List.Empty } - static member Parse (stringToParse: string) = + static member Parse(stringToParse: string) = let lines = stringToParse.Split '\n' |> MutableQueue let rec innerParse state = let words = lines.Peek().Split ' ' |> MutableQueue - let readDateTime () = - String.concat " " [ words.Dequeue (); words.Dequeue () ] + let readDateTime() = + String.concat " " [ words.Dequeue(); words.Dequeue() ] |> DateTime.Parse - let readInt () = - words.Dequeue () |> int + let readInt() = + words.Dequeue() |> int - let readRestAsString () = - words.ToArray () |> String.concat " " + let readRestAsString() = + words.ToArray() |> String.concat " " let newState: NetworkStatusDocument = - match words.Dequeue () with + match words.Dequeue() with | "network-status-version" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - Version = readInt () |> Some + Version = readInt() |> Some } | "vote-status" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - VoteStatus = readRestAsString () |> Some + VoteStatus = readRestAsString() |> Some } | "consensus-method" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - ConsensusMethod = readInt () |> Some + ConsensusMethod = readInt() |> Some } | "valid-after" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - ValidAfter = readDateTime () |> Some + ValidAfter = readDateTime() |> Some } | "fresh-until" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - FreshUntil = readDateTime () |> Some + FreshUntil = readDateTime() |> Some } | "valid-until" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - ValidUntil = readDateTime () |> Some + ValidUntil = readDateTime() |> Some } | "voting-delay" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - VotingDelay = readRestAsString () |> Some + VotingDelay = readRestAsString() |> Some } | "client-versions" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - ClientVersions = readRestAsString () |> Some + ClientVersions = readRestAsString() |> Some } | "server-versions" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - ServerVersions = readRestAsString () |> Some + ServerVersions = readRestAsString() |> Some } | "package" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with Packages = - state.Packages - @ List.singleton (readRestAsString ()) + state.Packages @ List.singleton(readRestAsString()) } | "known-flags" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - KnownFlags = readRestAsString () |> Some + KnownFlags = readRestAsString() |> Some } | "recommended-client-protocols" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - RecommendedClientProtocols = readRestAsString () |> Some + RecommendedClientProtocols = readRestAsString() |> Some } | "recommended-relay-protocols" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - RecommendedRelayProtocols = readRestAsString () |> Some + RecommendedRelayProtocols = readRestAsString() |> Some } | "required-client-protocols" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - RequiredClientProtocols = readRestAsString () |> Some + RequiredClientProtocols = readRestAsString() |> Some } | "required-relay-protocols" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - RequiredRelayProtocols = readRestAsString () |> Some + RequiredRelayProtocols = readRestAsString() |> Some } | "params" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with Params = - readRestAsString().Split (' ') - |> Seq.map (fun param -> - let keyValue = param.Split ('=') + readRestAsString().Split(' ') + |> Seq.map(fun param -> + let keyValue = param.Split('=') keyValue.[0], keyValue.[1] ) |> Map.ofSeq } | "shared-rand-previous-value" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - SharedRandomPreviousValue = readRestAsString () |> Some + SharedRandomPreviousValue = readRestAsString() |> Some } | "shared-rand-current-value" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - SharedRandomCurrentValue = readRestAsString () |> Some + SharedRandomCurrentValue = readRestAsString() |> Some } | "bandwidth-weights" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore { state with - BandwithWeights = readRestAsString () |> Some + BandwithWeights = readRestAsString() |> Some } | "dir-source" -> { state with Sources = state.Sources - @ List.singleton (DirectorySourceEntry.Parse lines) + @ List.singleton(DirectorySourceEntry.Parse lines) } | "r" -> { state with Routers = state.Routers - @ List.singleton (RouterStatusEntry.Parse lines) + @ List.singleton(RouterStatusEntry.Parse lines) } | "directory-signature" -> { state with Signatures = state.Signatures - @ List.singleton (DirectorySignature.Parse lines) + @ List.singleton(DirectorySignature.Parse lines) } | _ -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore state if lines.Count > 0 then @@ -470,28 +469,28 @@ type NetworkStatusDocument = innerParse NetworkStatusDocument.Empty - member self.GetHiddenServicesDirectoryInterval () = + member self.GetHiddenServicesDirectoryInterval() = match self.Params.TryFind "hsdir-interval" with | None -> Constants.DefaultHSDirInterval | Some hsDirinterval -> hsDirinterval |> Convert.ToInt32 - member self.GetValidAfter () = + member self.GetValidAfter() = match self.ValidAfter with | None -> failwith "BUG: valid-after field does not exist in the consensus" | Some validAfter -> validAfter - member self.GetValidUntil () = + member self.GetValidUntil() = match self.ValidUntil with | None -> failwith "BUG: valid-until field does not exist in the consensus" | Some validUntil -> validUntil - member self.GetTimePeriod () = + member self.GetTimePeriod() = let validAfterInMinutes = let validAfterSinceEpoch = - self.GetValidAfter () |> DateTimeUtils.GetTimeSpanSinceEpoch + self.GetValidAfter() |> DateTimeUtils.GetTimeSpanSinceEpoch validAfterSinceEpoch .Subtract( @@ -499,7 +498,7 @@ type NetworkStatusDocument = ) .TotalMinutes - let hsDirInterval = self.GetHiddenServicesDirectoryInterval () + let hsDirInterval = self.GetHiddenServicesDirectoryInterval() validAfterInMinutes / (hsDirInterval |> float) |> Math.Floor |> uint64, hsDirInterval |> uint64 diff --git a/NOnion/Directory/ServerDescriptorsDocument.fs b/NOnion/Directory/ServerDescriptorsDocument.fs index 3af5bd5e..b17ddf29 100644 --- a/NOnion/Directory/ServerDescriptorsDocument.fs +++ b/NOnion/Directory/ServerDescriptorsDocument.fs @@ -88,283 +88,282 @@ type ServerDescriptorEntry = Proto = None } - static member Parse (lines: MutableQueue) = + static member Parse(lines: MutableQueue) = let rec innerParse state = - let rec readBlock (state: string) = - let line = lines.Dequeue () + let rec readBlock(state: string) = + let line = lines.Dequeue() if line.StartsWith "-----END" then state + line else - readBlock (state + line) + readBlock(state + line) if lines.Count = 0 then state else - let nextLine = lines.Peek () + let nextLine = lines.Peek() let words = nextLine.Split ' ' |> MutableQueue - let readDateTime () = - String.concat " " [ words.Dequeue (); words.Dequeue () ] + let readDateTime() = + String.concat " " [ words.Dequeue(); words.Dequeue() ] |> DateTime.Parse - let readInt () = - words.Dequeue () |> int + let readInt() = + words.Dequeue() |> int - let readRestAsString () = - words.ToArray () |> String.concat " " + let readRestAsString() = + words.ToArray() |> String.concat " " - let readWord () = - words.Dequeue () + let readWord() = + words.Dequeue() - match words.Dequeue () with + match words.Dequeue() with | "router" when state.Nickname = None -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Nickname = readWord () |> Some - Address = readWord () |> Some - OnionRouterPort = readInt () |> Some - SocksPort = readInt () |> Some - DirectoryPort = readInt () |> Some + Nickname = readWord() |> Some + Address = readWord() |> Some + OnionRouterPort = readInt() |> Some + SocksPort = readInt() |> Some + DirectoryPort = readInt() |> Some } | "identity-ed25519" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with IdentityEd25519 = readBlock String.Empty |> Some } | "master-key-ed25519" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - MasterKeyEd25519 = readRestAsString () |> Some + MasterKeyEd25519 = readRestAsString() |> Some } | "bandwidth" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Bandwidth = readRestAsString () |> Some + Bandwidth = readRestAsString() |> Some } | "platform" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Platform = readRestAsString () |> Some + Platform = readRestAsString() |> Some } | "published" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Published = readDateTime () |> Some + Published = readDateTime() |> Some } | "fingerprint" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with Fingerprint = - (readRestAsString ()) - .Replace (" ", String.Empty) + (readRestAsString()).Replace(" ", String.Empty) |> Some } | "hibernating" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Hibernating = readInt () |> Convert.ToBoolean + Hibernating = readInt() |> Convert.ToBoolean } | "uptime" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Uptime = readInt () |> Some + Uptime = readInt() |> Some } | "onion-key" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with OnionKey = readBlock String.Empty |> Some } | "onion-key-crosscert" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with OnionKeyCrossCert = readBlock String.Empty |> Some } | "ntor-onion-key" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - NTorOnionKey = readRestAsString () |> Some + NTorOnionKey = readRestAsString() |> Some } | "ntor-onion-key-crosscert" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with NTorOnionKeyCrossCert = - (readInt (), readBlock String.Empty) |> Some + (readInt(), readBlock String.Empty) |> Some } | "signing-key" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with SigningKey = readBlock String.Empty |> Some } | "accept" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Accept = readRestAsString () |> Some + Accept = readRestAsString() |> Some } | "reject" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Reject = readRestAsString () |> Some + Reject = readRestAsString() |> Some } | "ipv6-policy" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Reject = readRestAsString () |> Some + Reject = readRestAsString() |> Some } | "ipv6-policy" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - IpV6Policy = readRestAsString () |> Some + IpV6Policy = readRestAsString() |> Some } | "overload-general" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - OverloadGeneral = readRestAsString () |> Some + OverloadGeneral = readRestAsString() |> Some } | "router-sig-ed25519" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - RouterSigEd25519 = readRestAsString () |> Some + RouterSigEd25519 = readRestAsString() |> Some } | "router-signature" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with RouterSignature = readBlock String.Empty |> Some } | "contact" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Contact = readRestAsString () |> Some + Contact = readRestAsString() |> Some } | "bridge-distribution-request" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with BridgeDistributionRequest = - readRestAsString () |> Some + readRestAsString() |> Some } | "family" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Family = readRestAsString () |> Some + Family = readRestAsString() |> Some } | "read-history" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - ReadHistory = readRestAsString () |> Some + ReadHistory = readRestAsString() |> Some } | "write-history" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - WriteHistory = readRestAsString () |> Some + WriteHistory = readRestAsString() |> Some } | "eventdns" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - EventDNS = readInt () |> Convert.ToBoolean |> Some + EventDNS = readInt() |> Convert.ToBoolean |> Some } | "extra-info-digest" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - ExtraInfoDigest = readRestAsString () |> Some + ExtraInfoDigest = readRestAsString() |> Some } | "hidden-service-dir" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with HiddenServiceDir = true } | "protocols" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Protocols = readRestAsString () |> Some + Protocols = readRestAsString() |> Some } | "allow-single-hop-exits" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with AllowSingleHopExits = true } | "or-address" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - OnionRouterAddress = readRestAsString () |> Some + OnionRouterAddress = readRestAsString() |> Some } | "tunnelled-dir-server" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with TunnelledDirServer = true } | "proto" -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore innerParse { state with - Proto = readRestAsString () |> Some + Proto = readRestAsString() |> Some } | "router" when state.Nickname <> None -> state | _ -> state @@ -382,22 +381,22 @@ type ServerDescriptorsDocument = ServerDescriptorsDocument.Routers = List.empty } - static member Parse (stringToParse: string) = + static member Parse(stringToParse: string) = let lines = stringToParse.Split '\n' |> MutableQueue let rec innerParse state = let words = lines.Peek().Split ' ' |> MutableQueue let newState = - match words.Dequeue () with + match words.Dequeue() with | "router" -> { state with Routers = state.Routers - @ List.singleton (ServerDescriptorEntry.Parse lines) + @ List.singleton(ServerDescriptorEntry.Parse lines) } | _ -> - lines.Dequeue () |> ignore + lines.Dequeue() |> ignore state if lines.Count > 0 then diff --git a/NOnion/Directory/TorDirectory.fs b/NOnion/Directory/TorDirectory.fs index 0e8b7862..27142827 100644 --- a/NOnion/Directory/TorDirectory.fs +++ b/NOnion/Directory/TorDirectory.fs @@ -15,15 +15,15 @@ type TorDirectory = mutable ServerDescriptors: Map } - member private self.IsLive () = + member private self.IsLive() = let now = DateTime.UtcNow - self.NetworkStatus.GetValidAfter () < now - && self.NetworkStatus.GetValidUntil () > now + self.NetworkStatus.GetValidAfter() < now + && self.NetworkStatus.GetValidUntil() > now - member private self.GetRandomDirectorySource () = + member private self.GetRandomDirectorySource() = self.NetworkStatus.Routers - |> Seq.filter (fun elem -> + |> Seq.filter(fun elem -> elem.DirectoryPort.IsSome && elem.DirectoryPort.Value <> 0 ) |> SeqUtils.TakeRandom 1 @@ -32,27 +32,27 @@ type TorDirectory = member private self.ConvertToCircuitNodeDetail (entry: ServerDescriptorEntry) = - let fingerprintBytes = Hex.ToByteArray (entry.Fingerprint.Value) - let nTorOnionKeyBytes = Base64Util.FromString (entry.NTorOnionKey.Value) + let fingerprintBytes = Hex.ToByteArray(entry.Fingerprint.Value) + let nTorOnionKeyBytes = Base64Util.FromString(entry.NTorOnionKey.Value) let endpoint = - IPEndPoint ( - IPAddress.Parse (entry.Address.Value), + IPEndPoint( + IPAddress.Parse(entry.Address.Value), entry.OnionRouterPort.Value ) - CircuitNodeDetail.Create (endpoint, nTorOnionKeyBytes, fingerprintBytes) + CircuitNodeDetail.Create(endpoint, nTorOnionKeyBytes, fingerprintBytes) - member self.GetRouter (shouldBeDirectory: bool) = + member self.GetRouter(shouldBeDirectory: bool) = async { - do! self.UpdateConsensusIfNotLive () + do! self.UpdateConsensusIfNotLive() - let rec getRandomRouter () = + let rec getRandomRouter() = async { let! descriptor = if shouldBeDirectory then self.NetworkStatus.Routers - |> Seq.filter (fun router -> + |> Seq.filter(fun router -> router.DirectoryPort.IsSome && router.DirectoryPort.Value > 0 ) @@ -65,30 +65,30 @@ type TorDirectory = if descriptor.Hibernating || descriptor.NTorOnionKey.IsNone || descriptor.Fingerprint.IsNone then - return! getRandomRouter () + return! getRandomRouter() else return descriptor } - let! randomDescriptor = getRandomRouter () + let! randomDescriptor = getRandomRouter() let endpoint = - IPEndPoint ( - IPAddress.Parse (randomDescriptor.Address.Value), + IPEndPoint( + IPAddress.Parse(randomDescriptor.Address.Value), randomDescriptor.OnionRouterPort.Value ) return (endpoint, self.ConvertToCircuitNodeDetail randomDescriptor) } - member self.GetRouterAsync (shouldBeDirectory: bool) = + member self.GetRouterAsync(shouldBeDirectory: bool) = self.GetRouter shouldBeDirectory |> Async.StartAsTask member private self.GetServerDescriptor (routerEntry: RouterStatusEntry) : Async = async { - let fingerprint = routerEntry.GetIdentity () + let fingerprint = routerEntry.GetIdentity() sprintf "TorDirectory: receiving descriptor for router %s" @@ -98,27 +98,24 @@ type TorDirectory = match self.ServerDescriptors.TryFind fingerprint with | Some descriptor -> return descriptor | None -> - let directoryRouter = self.GetRandomDirectorySource () + let directoryRouter = self.GetRandomDirectorySource() use! guard = - TorGuard.NewClient ( - IPEndPoint ( - IPAddress.Parse (directoryRouter.IP.Value), + TorGuard.NewClient( + IPEndPoint( + IPAddress.Parse(directoryRouter.IP.Value), directoryRouter.OnionRouterPort.Value ) ) - let circuit = TorCircuit (guard) - let stream = TorStream (circuit) + let circuit = TorCircuit(guard) + let stream = TorStream(circuit) - do! - circuit.Create (CircuitNodeDetail.FastCreate) - |> Async.Ignore + do! circuit.Create(CircuitNodeDetail.FastCreate) |> Async.Ignore - do! stream.ConnectToDirectory () |> Async.Ignore + do! stream.ConnectToDirectory() |> Async.Ignore - let httpClient = - TorHttpClient (stream, directoryRouter.IP.Value) + let httpClient = TorHttpClient(stream, directoryRouter.IP.Value) let! response = httpClient.GetAsString @@ -141,9 +138,9 @@ type TorDirectory = return serverDescriptor } - member private self.UpdateConsensusIfNotLive () = + member private self.UpdateConsensusIfNotLive() = async { - if self.IsLive () then + if self.IsLive() then TorLogger.Log "TorDirectory: no need to get the consensus document" @@ -151,18 +148,18 @@ type TorDirectory = else TorLogger.Log "TorDirectory: Updating consensus document..." - let directoryRouter = self.GetRandomDirectorySource () + let directoryRouter = self.GetRandomDirectorySource() use! guard = - TorGuard.NewClient ( - IPEndPoint ( - IPAddress.Parse (directoryRouter.IP.Value), + TorGuard.NewClient( + IPEndPoint( + IPAddress.Parse(directoryRouter.IP.Value), directoryRouter.OnionRouterPort.Value ) ) - let circuit = TorCircuit (guard) - let stream = TorStream (circuit) + let circuit = TorCircuit(guard) + let stream = TorStream(circuit) (* * We always use FastCreate authentication because privacy is not important for mono-hop @@ -172,10 +169,9 @@ type TorDirectory = *) do! circuit.Create CircuitNodeDetail.FastCreate |> Async.Ignore - do! stream.ConnectToDirectory () |> Async.Ignore + do! stream.ConnectToDirectory() |> Async.Ignore - let httpClient = - TorHttpClient (stream, directoryRouter.IP.Value) + let httpClient = TorHttpClient(stream, directoryRouter.IP.Value) let! response = httpClient.GetAsString @@ -185,20 +181,17 @@ type TorDirectory = self.NetworkStatus <- NetworkStatusDocument.Parse response } - static member Bootstrap (nodeEndPoint: IPEndPoint) = + static member Bootstrap(nodeEndPoint: IPEndPoint) = async { - use! guard = TorGuard.NewClient (nodeEndPoint) - let circuit = TorCircuit (guard) - do! circuit.Create (CircuitNodeDetail.FastCreate) |> Async.Ignore + use! guard = TorGuard.NewClient(nodeEndPoint) + let circuit = TorCircuit(guard) + do! circuit.Create(CircuitNodeDetail.FastCreate) |> Async.Ignore - let consensusStream = TorStream (circuit) - do! consensusStream.ConnectToDirectory () |> Async.Ignore + let consensusStream = TorStream(circuit) + do! consensusStream.ConnectToDirectory() |> Async.Ignore let consensusHttpClient = - TorHttpClient ( - consensusStream, - nodeEndPoint.Address.ToString () - ) + TorHttpClient(consensusStream, nodeEndPoint.Address.ToString()) let! consensusStr = consensusHttpClient.GetAsString @@ -214,11 +207,11 @@ type TorDirectory = } - member self.GetLiveNetworkStatus () = + member self.GetLiveNetworkStatus() = async { - do! self.UpdateConsensusIfNotLive () + do! self.UpdateConsensusIfNotLive() return self.NetworkStatus } - static member BootstrapAsync (nodeEndPoint: IPEndPoint) = + static member BootstrapAsync(nodeEndPoint: IPEndPoint) = TorDirectory.Bootstrap nodeEndPoint |> Async.StartAsTask diff --git a/NOnion/Exceptions.fs b/NOnion/Exceptions.fs index 9357ec73..a0f5b6ad 100644 --- a/NOnion/Exceptions.fs +++ b/NOnion/Exceptions.fs @@ -2,13 +2,13 @@ open System -type GuardConnectionFailedException (innerException: Exception) = - inherit Exception ("Connecting to guard node failed", innerException) +type GuardConnectionFailedException(innerException: Exception) = + inherit Exception("Connecting to guard node failed", innerException) -type CircuitTruncatedException (reason: DestroyReason) = - inherit Exception (sprintf "Circuit got truncated, reason %A" reason) +type CircuitTruncatedException(reason: DestroyReason) = + inherit Exception(sprintf "Circuit got truncated, reason %A" reason) -type CircuitDestroyedException (reason: DestroyReason) = - inherit Exception (sprintf "Circuit got destroyed, reason %A" reason) +type CircuitDestroyedException(reason: DestroyReason) = + inherit Exception(sprintf "Circuit got destroyed, reason %A" reason) exception TimeoutErrorException diff --git a/NOnion/Http/TorHttpClient.fs b/NOnion/Http/TorHttpClient.fs index 4ec8e3a9..4bdd0d53 100644 --- a/NOnion/Http/TorHttpClient.fs +++ b/NOnion/Http/TorHttpClient.fs @@ -8,12 +8,12 @@ open System.IO.Compression open NOnion open NOnion.Network -type TorHttpClient (stream: TorStream, host: string) = +type TorHttpClient(stream: TorStream, host: string) = // Receives all the data stream until it reaches EOF (until stream receive a RELAY_END) - let rec receiveAll (state: array) = + let rec receiveAll(state: array) = async { - let! maybeNextPartialResponse = stream.Receive () + let! maybeNextPartialResponse = stream.Receive() match maybeNextPartialResponse with | None -> return state @@ -37,7 +37,7 @@ type TorHttpClient (stream: TorStream, host: string) = "Host", host "Accept-Encoding", supportedCompressionAlgorithms ] - |> List.map (fun (k, v) -> sprintf "%s: %s" k v) + |> List.map(fun (k, v) -> sprintf "%s: %s" k v) |> String.concat "\r\n" do! @@ -50,17 +50,16 @@ type TorHttpClient (stream: TorStream, host: string) = |> FSharpUtil.WithTimeout Constants.HttpResponseTimeout let header, body = - let delimiter = - ReadOnlySpan (Encoding.ASCII.GetBytes "\r\n\r\n") + let delimiter = ReadOnlySpan(Encoding.ASCII.GetBytes "\r\n\r\n") let headerEndIndex = - MemoryExtensions.IndexOf (httpResponse.AsSpan (), delimiter) + MemoryExtensions.IndexOf(httpResponse.AsSpan(), delimiter) - Encoding.UTF8.GetString (httpResponse, 0, headerEndIndex), + Encoding.UTF8.GetString(httpResponse, 0, headerEndIndex), httpResponse.[headerEndIndex + delimiter.Length..] let headerLines = - header.Split (Array.singleton "\r\n", StringSplitOptions.None) + header.Split(Array.singleton "\r\n", StringSplitOptions.None) let _protocol, status = let responseLine = headerLines.[0].Split ' ' @@ -68,13 +67,13 @@ type TorHttpClient (stream: TorStream, host: string) = if status <> "200" then return - failwith ( + failwith( sprintf "Non-200 status code received, code: %s" status ) - let parseHeaderLine (header: string) = + let parseHeaderLine(header: string) = let splittedHeader = - header.Split (Array.singleton ": ", StringSplitOptions.None) + header.Split(Array.singleton ": ", StringSplitOptions.None) splittedHeader.[0], splittedHeader.[1] @@ -90,11 +89,11 @@ type TorHttpClient (stream: TorStream, host: string) = | true, "deflate" -> // DeflateStream needs the zlib header to be chopped off first let body = Array.skip Constants.DeflateStreamHeaderLength body - use outMemStream = new MemoryStream () - use inMemStream = new MemoryStream (body) + use outMemStream = new MemoryStream() + use inMemStream = new MemoryStream(body) use compressedStream = - new DeflateStream ( + new DeflateStream( inMemStream, CompressionMode.Decompress, false @@ -102,10 +101,10 @@ type TorHttpClient (stream: TorStream, host: string) = do! compressedStream.CopyToAsync outMemStream |> Async.AwaitTask - return outMemStream.ToArray () |> Encoding.UTF8.GetString + return outMemStream.ToArray() |> Encoding.UTF8.GetString | true, compressionMethod -> return - failwith ( + failwith( sprintf "Unknown content-encoding value, %s" compressionMethod diff --git a/NOnion/Network/StreamState.fs b/NOnion/Network/StreamState.fs index d8ef1b00..ab2b012a 100644 --- a/NOnion/Network/StreamState.fs +++ b/NOnion/Network/StreamState.fs @@ -14,7 +14,7 @@ type StreamState = member self.Id = match self with - | Connecting (streamId, _) + | Connecting(streamId, _) | Connected streamId - | Ended (streamId, _) -> string streamId + | Ended(streamId, _) -> string streamId | Initialized -> "TBD" diff --git a/NOnion/Network/TorCircuit.fs b/NOnion/Network/TorCircuit.fs index d2eeddb8..2e121118 100644 --- a/NOnion/Network/TorCircuit.fs +++ b/NOnion/Network/TorCircuit.fs @@ -32,48 +32,48 @@ type TorCircuit serviceStreamCallback: Option TorCircuit -> Async> ) = let mutable circuitState: CircuitState = CircuitState.Initialized - let controlLock: SemaphoreLocker = SemaphoreLocker () + let controlLock: SemaphoreLocker = SemaphoreLocker() let mutable streamsCount: int = 1 let mutable streamsMap: Map = Map.empty // Prevents two stream setup happening at once (to prevent race condition on writing to StreamIds list) - let streamSetupLock: obj = obj () + let streamSetupLock: obj = obj() //Client-only - new (guard: TorGuard) = TorCircuit (guard, None) + new(guard: TorGuard) = TorCircuit(guard, None) //Client-Server F# version - new (guard: TorGuard, - serviceStreamCallback: uint16 -> TorCircuit -> Async) = - TorCircuit (guard, Some serviceStreamCallback) + new(guard: TorGuard, + serviceStreamCallback: uint16 -> TorCircuit -> Async) = + TorCircuit(guard, Some serviceStreamCallback) //Client-Server C# version - new (guard: TorGuard, serviceStreamCallback: Func) = + new(guard: TorGuard, serviceStreamCallback: Func) = let callback streamId circuit = async { return! - serviceStreamCallback.Invoke (streamId, circuit) + serviceStreamCallback.Invoke(streamId, circuit) |> Async.AwaitTask } - TorCircuit (guard, Some callback) + TorCircuit(guard, Some callback) member __.Id = match circuitState with - | Creating (circuitId, _, _) - | Extending (circuitId, _, _, _) - | RegisteringAsIntorductionPoint (circuitId, _, _, _, _, _) - | RegisteringAsRendezvousPoint (circuitId, _, _) - | WaitingForIntroduceAcknowledge (circuitId, _, _) - | WaitingForRendezvousRequest (circuitId, _, _, _, _, _, _) - | Ready (circuitId, _) - | ReadyAsIntroductionPoint (circuitId, _, _, _, _) - | ReadyAsRendezvousPoint (circuitId, _) - | Destroyed (circuitId, _) - | Truncated (circuitId, _) -> circuitId + | Creating(circuitId, _, _) + | Extending(circuitId, _, _, _) + | RegisteringAsIntorductionPoint(circuitId, _, _, _, _, _) + | RegisteringAsRendezvousPoint(circuitId, _, _) + | WaitingForIntroduceAcknowledge(circuitId, _, _) + | WaitingForRendezvousRequest(circuitId, _, _, _, _, _, _) + | Ready(circuitId, _) + | ReadyAsIntroductionPoint(circuitId, _, _, _, _) + | ReadyAsRendezvousPoint(circuitId, _) + | Destroyed(circuitId, _) + | Truncated(circuitId, _) -> circuitId | _ -> failwith "should not happen!" member __.LastNode = match circuitState with - | Ready (_, nodesStates) -> nodesStates |> List.rev |> List.head + | Ready(_, nodesStates) -> nodesStates |> List.rev |> List.head | _ -> failwith "" member private self.UnsafeSendRelayCell @@ -84,11 +84,11 @@ type TorCircuit = async { match circuitState with - | Ready (circuitId, nodesStates) - | Extending (circuitId, _, nodesStates, _) - | RegisteringAsIntorductionPoint (circuitId, nodesStates, _, _, _, _) - | WaitingForIntroduceAcknowledge (circuitId, nodesStates, _) - | RegisteringAsRendezvousPoint (circuitId, nodesStates, _) -> + | Ready(circuitId, nodesStates) + | Extending(circuitId, _, nodesStates, _) + | RegisteringAsIntorductionPoint(circuitId, nodesStates, _, _, _, _) + | WaitingForIntroduceAcknowledge(circuitId, nodesStates, _) + | RegisteringAsRendezvousPoint(circuitId, nodesStates, _) -> let onionList, destination = match customDestinationOpt with | None -> @@ -97,8 +97,8 @@ type TorCircuit | Some destination -> nodesStates - |> List.takeWhile (fun node -> node <> destination) - |> List.append (List.singleton destination) + |> List.takeWhile(fun node -> node <> destination) + |> List.append(List.singleton destination) |> List.rev, destination @@ -116,7 +116,7 @@ type TorCircuit relayPlainBytes.Length let digest = - destination.CryptoState.ForwardDigest.GetDigestBytes () + destination.CryptoState.ForwardDigest.GetDigestBytes() |> Array.take Constants.RelayDigestLength let plainRelayCell = @@ -150,7 +150,7 @@ type TorCircuit // too many to log () | _ -> - TorLogger.Log ( + TorLogger.Log( sprintf "TorCircuit[%i,%s]: Sent relay cell %A over circuit" self.Id @@ -158,10 +158,10 @@ type TorCircuit relayData ) | _ -> - failwith ( + failwith( sprintf "Can't relay cell over circuit, %s state" - (circuitState.ToString ()) + (circuitState.ToString()) ) } @@ -171,7 +171,7 @@ type TorCircuit (customDestinationOpt: Option) = async { - let safeSend () = + let safeSend() = async { match circuitState with | Ready _ -> @@ -182,27 +182,27 @@ type TorCircuit customDestinationOpt false | _ -> - failwith ( + failwith( sprintf "Can't relay cell over circuit, %s state" - (circuitState.ToString ()) + (circuitState.ToString()) ) } return! controlLock.RunAsyncWithSemaphore safeSend } - member private self.DecryptCell (encryptedRelayCell: CellEncryptedRelay) = - let safeDecryptCell () = + member private self.DecryptCell(encryptedRelayCell: CellEncryptedRelay) = + let safeDecryptCell() = match circuitState with - | Ready (_circuitId, nodes) - | ReadyAsIntroductionPoint (_circuitId, nodes, _, _, _) - | ReadyAsRendezvousPoint (_circuitId, nodes) - | RegisteringAsIntorductionPoint (_circuitId, nodes, _, _, _, _) - | RegisteringAsRendezvousPoint (_circuitId, nodes, _) - | WaitingForIntroduceAcknowledge (_circuitId, nodes, _) - | WaitingForRendezvousRequest (_circuitId, nodes, _, _, _, _, _) - | Extending (_circuitId, _, nodes, _) -> + | Ready(_circuitId, nodes) + | ReadyAsIntroductionPoint(_circuitId, nodes, _, _, _) + | ReadyAsRendezvousPoint(_circuitId, nodes) + | RegisteringAsIntorductionPoint(_circuitId, nodes, _, _, _, _) + | RegisteringAsRendezvousPoint(_circuitId, nodes, _) + | WaitingForIntroduceAcknowledge(_circuitId, nodes, _) + | WaitingForRendezvousRequest(_circuitId, nodes, _, _, _, _, _) + | Extending(_circuitId, _, nodes, _) -> let rec decryptMessage (message: array) (nodes: List) @@ -213,7 +213,7 @@ type TorCircuit node.CryptoState.BackwardCipher.Encrypt message let recognized = - System.BitConverter.ToUInt16 ( + System.BitConverter.ToUInt16( decryptedRelayCellBytes, Constants.RelayRecognizedOffset ) @@ -260,7 +260,7 @@ type TorCircuit //Too many to log () | _ -> - TorLogger.Log ( + TorLogger.Log( sprintf "TorCircuit[%i,%s]: decrypted relay cell %A over circuit" self.Id @@ -278,28 +278,27 @@ type TorCircuit controlLock.RunSyncWithSemaphore safeDecryptCell - member self.Create (guardDetailOpt: CircuitNodeDetail) = + member self.Create(guardDetailOpt: CircuitNodeDetail) = async { - let create () = + let create() = async { match circuitState with | CircuitState.Initialized -> let circuitId = guard.RegisterCircuit self - let connectionCompletionSource = TaskCompletionSource () + let connectionCompletionSource = TaskCompletionSource() let handshakeState, handshakeCell = match guardDetailOpt with | FastCreate -> - let state = - FastHandshake.Create () :> IHandshake + let state = FastHandshake.Create() :> IHandshake state, { CellCreateFast.X = - state.GenerateClientMaterial () + state.GenerateClientMaterial() } :> ICell - | Create (_, onionKey, identityKey) -> + | Create(_, onionKey, identityKey) -> let state = NTorHandshake.Create identityKey onionKey :> IHandshake @@ -309,12 +308,12 @@ type TorCircuit CellCreate2.HandshakeType = HandshakeType.NTor HandshakeData = - state.GenerateClientMaterial () + state.GenerateClientMaterial() } :> ICell circuitState <- - Creating ( + Creating( circuitId, handshakeState, connectionCompletionSource @@ -322,7 +321,7 @@ type TorCircuit do! guard.Send circuitId handshakeCell - TorLogger.Log ( + TorLogger.Log( sprintf "TorCircuit[%i,%s]: sending create cell" self.Id @@ -341,12 +340,12 @@ type TorCircuit |> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout } - member self.Extend (nodeDetail: CircuitNodeDetail) = + member self.Extend(nodeDetail: CircuitNodeDetail) = async { - let extend () = + let extend() = async { match circuitState with - | CircuitState.Ready (circuitId, nodes) -> + | CircuitState.Ready(circuitId, nodes) -> return! match nodeDetail with | FastCreate -> @@ -355,10 +354,10 @@ type TorCircuit failwith "Only first hop can be created using CREATE_FAST" } - | Create (address, onionKey, identityKey) -> + | Create(address, onionKey, identityKey) -> async { let connectionCompletionSource = - TaskCompletionSource () + TaskCompletionSource() let handshakeState, handshakeCell = let state = @@ -381,12 +380,12 @@ type TorCircuit ] HandshakeType = HandshakeType.NTor HandshakeData = - state.GenerateClientMaterial () + state.GenerateClientMaterial() } |> RelayData.RelayExtend2 circuitState <- - Extending ( + Extending( circuitId, handshakeState, nodes, @@ -421,10 +420,10 @@ type TorCircuit (authKeyPairOpt: Option) callback = - let registerAsIntroduction () = + let registerAsIntroduction() = async { match circuitState with - | Ready (circuitId, nodes) -> + | Ready(circuitId, nodes) -> let lastNode = self.LastNode let authPrivateKey, authPublicKey = @@ -432,14 +431,14 @@ type TorCircuit match authKeyPairOpt with | Some authKeyPair -> authKeyPair | None -> - let kpGen = Ed25519KeyPairGenerator () - let random = SecureRandom () + let kpGen = Ed25519KeyPairGenerator() + let random = SecureRandom() - kpGen.Init ( + kpGen.Init( Ed25519KeyGenerationParameters random ) - kpGen.GenerateKeyPair () + kpGen.GenerateKeyPair() authKeyPair.Private :?> Ed25519PrivateKeyParameters, authKeyPair.Public :?> Ed25519PublicKeyParameters @@ -451,10 +450,10 @@ type TorCircuit lastNode.CryptoState.KeyHandshake |> RelayData.RelayEstablishIntro - let connectionCompletionSource = TaskCompletionSource () + let connectionCompletionSource = TaskCompletionSource() circuitState <- - CircuitState.RegisteringAsIntorductionPoint ( + CircuitState.RegisteringAsIntorductionPoint( circuitId, nodes, authPrivateKey, @@ -487,20 +486,20 @@ type TorCircuit |> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout } - member self.RegisterAsRendezvousPoint (cookie: array) = - let registerAsRendezvousPoint () = + member self.RegisterAsRendezvousPoint(cookie: array) = + let registerAsRendezvousPoint() = async { match circuitState with - | Ready (circuitId, nodes) -> + | Ready(circuitId, nodes) -> let lastNode = self.LastNode let establishRendezvousCell = RelayData.RelayEstablishRendezvous cookie - let connectionCompletionSource = TaskCompletionSource () + let connectionCompletionSource = TaskCompletionSource() circuitState <- - CircuitState.RegisteringAsRendezvousPoint ( + CircuitState.RegisteringAsRendezvousPoint( circuitId, nodes, connectionCompletionSource @@ -536,16 +535,16 @@ type TorCircuit member self.CreateAsync guardDetailOpt = self.Create guardDetailOpt |> Async.StartAsTask - member self.Introduce (introduceMsg: RelayIntroduce) = - let sendIntroduceCell () = + member self.Introduce(introduceMsg: RelayIntroduce) = + let sendIntroduceCell() = async { match circuitState with - | Ready (circuitId, nodes) -> + | Ready(circuitId, nodes) -> let connectionCompletionSource = - TaskCompletionSource () + TaskCompletionSource() circuitState <- - WaitingForIntroduceAcknowledge ( + WaitingForIntroduceAcknowledge( circuitId, nodes, connectionCompletionSource @@ -580,14 +579,14 @@ type TorCircuit (introAuthPublicKey: Ed25519PublicKeyParameters) (introEncPublicKey: X25519PublicKeyParameters) = - let waitingForRendezvous () = + let waitingForRendezvous() = async { match circuitState with - | ReadyAsRendezvousPoint (circuitId, nodes) -> - let connectionCompletionSource = TaskCompletionSource () + | ReadyAsRendezvousPoint(circuitId, nodes) -> + let connectionCompletionSource = TaskCompletionSource() circuitState <- - WaitingForRendezvousRequest ( + WaitingForRendezvousRequest( circuitId, nodes, clientRandomPrivateKey, @@ -610,7 +609,7 @@ type TorCircuit return! completionTask |> Async.AwaitTask - |> FSharpUtil.WithTimeout (TimeSpan.FromMinutes 2.) + |> FSharpUtil.WithTimeout(TimeSpan.FromMinutes 2.) } member self.Rendezvous @@ -620,15 +619,15 @@ type TorCircuit (introEncPrivateKey: X25519PrivateKeyParameters) (introEncPublicKey: X25519PublicKeyParameters) = - let sendRendezvousCell () = + let sendRendezvousCell() = async { match circuitState with - | Ready (circuitId, nodes) -> + | Ready(circuitId, nodes) -> let serverPublicKey, serverPrivateKey = - let kpGenX = X25519KeyPairGenerator () - let random = SecureRandom () - kpGenX.Init (X25519KeyGenerationParameters random) - let keyPair = kpGenX.GenerateKeyPair () + let kpGenX = X25519KeyPairGenerator() + let random = SecureRandom() + kpGenX.Init(X25519KeyGenerationParameters random) + let keyPair = kpGenX.GenerateKeyPair() keyPair.Public :?> X25519PublicKeyParameters, keyPair.Private :?> X25519PrivateKeyParameters @@ -647,7 +646,7 @@ type TorCircuit RelayRendezvous.Cookie = cookie HandshakeData = Array.concat - [ serverPublicKey.GetEncoded (); mac ] + [ serverPublicKey.GetEncoded(); mac ] } |> RelayRendezvous1 @@ -660,7 +659,7 @@ type TorCircuit *) circuitState <- - Ready ( + Ready( circuitId, nodes @ List.singleton @@ -694,45 +693,44 @@ type TorCircuit (callback: Func) = fun relayIntroduce -> - async { - return! callback.Invoke (relayIntroduce) |> Async.AwaitTask } + async { return! callback.Invoke(relayIntroduce) |> Async.AwaitTask } |> self.RegisterAsIntroductionPoint authKeyPairOpt |> Async.StartAsTask - member self.RegisterAsRendezvousPointAsync (cookie: array) = + member self.RegisterAsRendezvousPointAsync(cookie: array) = self.RegisterAsRendezvousPoint cookie |> Async.StartAsTask member internal __.RegisterStream (stream: ITorStream) (idOpt: Option) : uint16 = - let safeRegister () = + let safeRegister() = match idOpt with | Some id -> - streamsMap <- streamsMap.Add (id, stream) + streamsMap <- streamsMap.Add(id, stream) id | None -> let newId = uint16 streamsCount streamsCount <- streamsCount + 1 - streamsMap <- streamsMap.Add (newId, stream) + streamsMap <- streamsMap.Add(newId, stream) newId lock streamSetupLock safeRegister interface ITorCircuit with - member self.HandleIncomingCell (cell: ICell) = + member self.HandleIncomingCell(cell: ICell) = async { //TODO: Handle circuit-level cells like destroy/truncate etc.. match cell with | :? ICreatedCell as createdMsg -> - let handleCreated () = + let handleCreated() = match circuitState with - | Creating (circuitId, handshakeState, tcs) -> + | Creating(circuitId, handshakeState, tcs) -> let kdfResult = handshakeState.GenerateKdfResult createdMsg circuitState <- - Ready ( + Ready( circuitId, List.singleton { @@ -757,23 +755,23 @@ type TorCircuit match relayData with | RelayData.RelayData _ -> - fromNode.Window.DeliverDecrease () + fromNode.Window.DeliverDecrease() - if fromNode.Window.NeedSendme () then + if fromNode.Window.NeedSendme() then do! self.SendRelayCell Constants.DefaultStreamId RelayData.RelaySendMe (Some fromNode) | RelayData.RelayExtended2 extended2 -> - let handleExtended () = + let handleExtended() = match circuitState with - | Extending (circuitId, handshakeState, nodes, tcs) -> + | Extending(circuitId, handshakeState, nodes, tcs) -> let kdfResult = handshakeState.GenerateKdfResult extended2 circuitState <- - Ready ( + Ready( circuitId, nodes @ List.singleton @@ -796,16 +794,16 @@ type TorCircuit controlLock.RunSyncWithSemaphore handleExtended | RelayData.RelayEstablishedIntro _ -> - let handleEstablished () = + let handleEstablished() = match circuitState with - | RegisteringAsIntorductionPoint (circuitId, - nodes, - _privateKey, - _publicKey, - tcs, - _callback) -> + | RegisteringAsIntorductionPoint(circuitId, + nodes, + _privateKey, + _publicKey, + tcs, + _callback) -> circuitState <- - ReadyAsIntroductionPoint ( + ReadyAsIntroductionPoint( circuitId, nodes, _privateKey, @@ -813,35 +811,33 @@ type TorCircuit _callback ) - tcs.SetResult () + tcs.SetResult() | _ -> failwith "Unexpected circuit state when receiving ESTABLISHED_INTRO cell" controlLock.RunSyncWithSemaphore handleEstablished | RelayData.RelayEstablishedRendezvous -> - let handleEstablished () = + let handleEstablished() = match circuitState with - | RegisteringAsRendezvousPoint (circuitId, - nodes, - tcs) -> + | RegisteringAsRendezvousPoint(circuitId, nodes, tcs) -> circuitState <- - ReadyAsRendezvousPoint (circuitId, nodes) + ReadyAsRendezvousPoint(circuitId, nodes) - tcs.SetResult () + tcs.SetResult() | _ -> failwith "Unexpected circuit state when receiving RENDEZVOUS_ESTABLISHED cell" controlLock.RunSyncWithSemaphore handleEstablished | RelaySendMe _ when streamId = Constants.DefaultStreamId -> - fromNode.Window.PackageIncrease () + fromNode.Window.PackageIncrease() | RelayIntroduce2 introduceMsg -> - let handleIntroduce () = + let handleIntroduce() = async { match circuitState with - | ReadyAsIntroductionPoint (_, _, _, _, callback) -> - do! callback (introduceMsg) + | ReadyAsIntroductionPoint(_, _, _, _, callback) -> + do! callback(introduceMsg) | _ -> return failwith @@ -850,79 +846,79 @@ type TorCircuit do! controlLock.RunAsyncWithSemaphore handleIntroduce | RelayTruncated reason -> - let handleTruncated () = + let handleTruncated() = match circuitState with - | Creating (circuitId, _, tcs) - | Extending (circuitId, _, _, tcs) -> - circuitState <- Truncated (circuitId, reason) + | Creating(circuitId, _, tcs) + | Extending(circuitId, _, _, tcs) -> + circuitState <- Truncated(circuitId, reason) - tcs.SetException ( + tcs.SetException( CircuitTruncatedException reason ) - | WaitingForIntroduceAcknowledge (circuitId, _, tcs) -> - circuitState <- Truncated (circuitId, reason) + | WaitingForIntroduceAcknowledge(circuitId, _, tcs) -> + circuitState <- Truncated(circuitId, reason) - tcs.SetException ( + tcs.SetException( CircuitTruncatedException reason ) - | RegisteringAsRendezvousPoint (circuitId, _, tcs) - | RegisteringAsIntorductionPoint (circuitId, - _, - _, - _, - tcs, - _) - | WaitingForRendezvousRequest (circuitId, - _, - _, - _, - _, - _, - tcs) -> - circuitState <- Truncated (circuitId, reason) - - tcs.SetException ( + | RegisteringAsRendezvousPoint(circuitId, _, tcs) + | RegisteringAsIntorductionPoint(circuitId, + _, + _, + _, + tcs, + _) + | WaitingForRendezvousRequest(circuitId, + _, + _, + _, + _, + _, + tcs) -> + circuitState <- Truncated(circuitId, reason) + + tcs.SetException( CircuitTruncatedException reason ) - | Ready (circuitId, _) -> + | Ready(circuitId, _) -> //FIXME: how can we tell the user that circuit is destroyed? if we throw here the listening thread with throw and user never finds out why - circuitState <- Truncated (circuitId, reason) + circuitState <- Truncated(circuitId, reason) | _ -> //FIXME: can this even happen? () controlLock.RunSyncWithSemaphore handleTruncated | RelayData.RelayIntroduceAck ackMsg -> - let handleIntroduceAck () = + let handleIntroduceAck() = match circuitState with - | WaitingForIntroduceAcknowledge (circuitId, - nodes, - tcs) -> - circuitState <- Ready (circuitId, nodes) + | WaitingForIntroduceAcknowledge(circuitId, + nodes, + tcs) -> + circuitState <- Ready(circuitId, nodes) - tcs.SetResult (ackMsg) + tcs.SetResult(ackMsg) | _ -> failwith "Unexpected circuit state when receiving RENDEZVOUS_ESTABLISHED cell" controlLock.RunSyncWithSemaphore handleIntroduceAck | RelayData.RelayRendezvous2 rendMsg -> - let handleRendezvous () = + let handleRendezvous() = match circuitState with - | WaitingForRendezvousRequest (circuitId, - nodes, - clientRandomPrivateKey, - clientRandomPublicKey, - introAuthPublicKey, - introEncPublicKey, - tcs) -> + | WaitingForRendezvousRequest(circuitId, + nodes, + clientRandomPrivateKey, + clientRandomPublicKey, + introAuthPublicKey, + introEncPublicKey, + tcs) -> let serverPublicKey = rendMsg.HandshakeData |> Array.take 32 let ntorKeySeed, mac = HiddenServicesCipher.CalculateClientRendezvousKeys - (X25519PublicKeyParameters ( + (X25519PublicKeyParameters( serverPublicKey, 0 )) @@ -937,7 +933,7 @@ type TorCircuit circuitState <- - Ready ( + Ready( circuitId, nodes @ List.singleton @@ -953,7 +949,7 @@ type TorCircuit } ) - tcs.SetResult () + tcs.SetResult() | _ -> failwith "Unexpected circuit state when receiving RENDEZVOUS_ESTABLISHED cell" @@ -972,50 +968,50 @@ type TorCircuit | (None, RelayBegin _) -> () | (None, _) -> failwith "Unknown stream" | :? CellDestroy as destroyCell -> - let handleDestroyed () = + let handleDestroyed() = match circuitState with - | Creating (circuitId, _, tcs) - | Extending (circuitId, _, _, tcs) -> + | Creating(circuitId, _, tcs) + | Extending(circuitId, _, _, tcs) -> circuitState <- - Destroyed (circuitId, destroyCell.Reason) + Destroyed(circuitId, destroyCell.Reason) - tcs.SetException ( + tcs.SetException( CircuitDestroyedException destroyCell.Reason ) - | RegisteringAsRendezvousPoint (circuitId, _, tcs) - | RegisteringAsIntorductionPoint (circuitId, - _, - _, - _, - tcs, - _) - | WaitingForRendezvousRequest (circuitId, - _, - _, - _, - _, - _, - tcs) -> + | RegisteringAsRendezvousPoint(circuitId, _, tcs) + | RegisteringAsIntorductionPoint(circuitId, + _, + _, + _, + tcs, + _) + | WaitingForRendezvousRequest(circuitId, + _, + _, + _, + _, + _, + tcs) -> circuitState <- - Destroyed (circuitId, destroyCell.Reason) + Destroyed(circuitId, destroyCell.Reason) - tcs.SetException ( + tcs.SetException( CircuitDestroyedException destroyCell.Reason ) - | WaitingForIntroduceAcknowledge (circuitId, _, tcs) -> + | WaitingForIntroduceAcknowledge(circuitId, _, tcs) -> circuitState <- - Destroyed (circuitId, destroyCell.Reason) + Destroyed(circuitId, destroyCell.Reason) - tcs.SetException ( + tcs.SetException( CircuitDestroyedException destroyCell.Reason ) - | Ready (circuitId, _) -> + | Ready(circuitId, _) -> //FIXME: how can we tell the user that circuit is destroyed? if we throw here the listening thread with throw and user never finds out why circuitState <- - Destroyed (circuitId, destroyCell.Reason) + Destroyed(circuitId, destroyCell.Reason) | _ -> //FIXME: can this even happen? () diff --git a/NOnion/Network/TorGuard.fs b/NOnion/Network/TorGuard.fs index 2c8daba4..59dfdee5 100644 --- a/NOnion/Network/TorGuard.fs +++ b/NOnion/Network/TorGuard.fs @@ -14,23 +14,23 @@ open NOnion.Cells open NOnion.Utility type TorGuard private (client: TcpClient, sslStream: SslStream) = - let shutdownToken = new CancellationTokenSource () + let shutdownToken = new CancellationTokenSource() let mutable circuitsMap: Map = Map.empty // Prevents two circuit setup happening at once (to prevent race condition on writing to CircuitIds list) - let circuitSetupLock: obj = obj () + let circuitSetupLock: obj = obj() - static member NewClient (ipEndpoint: IPEndPoint) = + static member NewClient(ipEndpoint: IPEndPoint) = async { - let tcpClient = new TcpClient () + let tcpClient = new TcpClient() try - ipEndpoint.ToString () + ipEndpoint.ToString() |> sprintf "TorGuard: trying to connect to %s guard node" |> TorLogger.Log do! - tcpClient.ConnectAsync (ipEndpoint.Address, ipEndpoint.Port) + tcpClient.ConnectAsync(ipEndpoint.Address, ipEndpoint.Port) |> Async.AwaitTask with @@ -41,18 +41,18 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = | _ -> return raise <| FSharpUtil.ReRaise aggException let sslStream = - new SslStream ( - tcpClient.GetStream (), + new SslStream( + tcpClient.GetStream(), false, fun _ _ _ _ -> true ) - ipEndpoint.ToString () + ipEndpoint.ToString() |> sprintf "TorGuard: creating ssl connection to %s guard node" |> TorLogger.Log do! - sslStream.AuthenticateAsClientAsync ( + sslStream.AuthenticateAsClientAsync( String.Empty, null, SslProtocols.Tls12, @@ -61,18 +61,18 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = |> Async.AwaitTask |> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout - ipEndpoint.ToString () + ipEndpoint.ToString() |> sprintf "TorGuard: ssl connection to %s guard node authenticated" |> TorLogger.Log - let guard = new TorGuard (tcpClient, sslStream) - do! guard.Handshake () + let guard = new TorGuard(tcpClient, sslStream) + do! guard.Handshake() - ipEndpoint.ToString () + ipEndpoint.ToString() |> sprintf "TorGuard: connection with %s established" |> TorLogger.Log - guard.StartListening () + guard.StartListening() return guard } @@ -82,8 +82,8 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = member __.Send (circuidId: uint16) (cellToSend: ICell) = async { - use memStream = new MemoryStream (Constants.FixedPayloadLength) - use writer = new BinaryWriter (memStream) + use memStream = new MemoryStream(Constants.FixedPayloadLength) + use writer = new BinaryWriter(memStream) cellToSend.Serialize writer // Write circuitId and command for the cell @@ -105,18 +105,18 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = |> IntegerSerialization.FromUInt16ToBigEndianByteArray |> StreamUtil.Write sslStream else - Array.zeroCreate ( + Array.zeroCreate( Constants.FixedPayloadLength - int memStream.Position ) |> writer.Write - do! memStream.ToArray () |> StreamUtil.Write sslStream + do! memStream.ToArray() |> StreamUtil.Write sslStream } member self.SendAsync (circuidId: uint16) (cellToSend: ICell) = self.Send circuidId cellToSend |> Async.StartAsTask - member private __.ReceiveInternal () = + member private __.ReceiveInternal() = async { (* If at any time "ReadFixedSize" returns None, it means that either stream is closed/disposed or @@ -164,58 +164,58 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = StreamUtil.ReadFixedSize sslStream bodyLength match maybeBody with - | Some body -> return Some (circuitId, command, body) + | Some body -> return Some(circuitId, command, body) | None -> return None | None -> return None | None -> return None } - member private self.ReceiveExpected<'T when 'T :> ICell> () : Async<'T> = + member private self.ReceiveExpected<'T when 'T :> ICell>() : Async<'T> = async { - let expectedCommandType = Command.GetCommandByCellType<'T> () + let expectedCommandType = Command.GetCommandByCellType<'T>() //This is only used for handshake process so circuitId doesn't matter - let! maybeMessage = self.ReceiveInternal () + let! maybeMessage = self.ReceiveInternal() match maybeMessage with | None -> return failwith "Socket got closed before receiving an expected cell" - | Some (_circuitId, command, body) -> + | Some(_circuitId, command, body) -> //FIXME: maybe continue instead of failing? if command <> expectedCommandType then - failwith (sprintf "Unexpected msg type %i" command) + failwith(sprintf "Unexpected msg type %i" command) - use memStream = new MemoryStream (body) - use reader = new BinaryReader (memStream) + use memStream = new MemoryStream(body) + use reader = new BinaryReader(memStream) return Command.DeserializeCell reader expectedCommandType :?> 'T } - member private self.ReceiveMessage () = + member private self.ReceiveMessage() = async { - let! maybeMessage = self.ReceiveInternal () + let! maybeMessage = self.ReceiveInternal() match maybeMessage with - | Some (circuitId, command, body) -> - use memStream = new MemoryStream (body) - use reader = new BinaryReader (memStream) + | Some(circuitId, command, body) -> + use memStream = new MemoryStream(body) + use reader = new BinaryReader(memStream) return (circuitId, Command.DeserializeCell reader command) |> Some | None -> return None } - member private self.StartListening () = - let listeningJob () = + member private self.StartListening() = + let listeningJob() = async { - let rec readFromStream () = + let rec readFromStream() = async { - let! maybeCell = self.ReceiveMessage () + let! maybeCell = self.ReceiveMessage() match maybeCell with | None -> () - | Some (cid, cell) -> + | Some(cid, cell) -> if cid = 0us then //TODO: handle control message? () @@ -231,26 +231,26 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = sprintf "TorGuard: exception when trying to handle incomming cell type=%i, ex=%s" cell.Command - (ex.ToString ()) + (ex.ToString()) |> TorLogger.Log | None -> - failwith ( + failwith( sprintf "Unknown circuit, Id = %i" cid ) - return! readFromStream () + return! readFromStream() } TorLogger.Log "TorGuard: started listening for incoming messages" - return! readFromStream () + return! readFromStream() } - Async.Start (listeningJob (), shutdownToken.Token) + Async.Start(listeningJob(), shutdownToken.Token) - member private self.Handshake () = + member private self.Handshake() = async { TorLogger.Log "TorGuard: started handshake process" @@ -262,11 +262,11 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = Constants.SupportedProtocolVersion } - let! _version = self.ReceiveExpected () - let! _certs = self.ReceiveExpected () + let! _version = self.ReceiveExpected() + let! _certs = self.ReceiveExpected() //TODO: Client authentication isn't implemented yet! - do! self.ReceiveExpected () |> Async.Ignore - let! netInfo = self.ReceiveExpected () + do! self.ReceiveExpected() |> Async.Ignore + let! netInfo = self.ReceiveExpected() do! self.Send @@ -283,13 +283,13 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = } |> FSharpUtil.WithTimeout Constants.CircuitOperationTimeout - member internal __.RegisterCircuit (circuit: ITorCircuit) : uint16 = - let rec createCircuitId (retry: int) = - let registerId (cid: uint16) = + member internal __.RegisterCircuit(circuit: ITorCircuit) : uint16 = + let rec createCircuitId(retry: int) = + let registerId(cid: uint16) = if Map.containsKey cid circuitsMap then false else - circuitsMap <- circuitsMap.Add (cid, circuit) + circuitsMap <- circuitsMap.Add(cid, circuit) true if retry >= Constants.MaxCircuitIdGenerationRetry then @@ -307,13 +307,13 @@ type TorGuard private (client: TcpClient, sslStream: SslStream) = if registerId cid then cid else - createCircuitId (retry + 1) + createCircuitId(retry + 1) lock circuitSetupLock (fun () -> createCircuitId 0) interface IDisposable with - member __.Dispose () = - shutdownToken.Cancel () - sslStream.Dispose () - client.Close () - client.Dispose () + member __.Dispose() = + shutdownToken.Cancel() + sslStream.Dispose() + client.Close() + client.Dispose() diff --git a/NOnion/Network/TorStream.fs b/NOnion/Network/TorStream.fs index e34cc6f9..3a52f88e 100644 --- a/NOnion/Network/TorStream.fs +++ b/NOnion/Network/TorStream.fs @@ -9,15 +9,15 @@ open NOnion.Cells.Relay open NOnion.Utility -type TorStream (circuit: TorCircuit) = +type TorStream(circuit: TorCircuit) = let mutable streamState: StreamState = StreamState.Initialized - let controlLock: SemaphoreLocker = SemaphoreLocker () + let controlLock: SemaphoreLocker = SemaphoreLocker() let window: TorWindow = TorWindow Constants.DefaultStreamLevelWindowParams - let incomingCells: BufferBlock = BufferBlock () - let receiveLock: SemaphoreLocker = SemaphoreLocker () + let incomingCells: BufferBlock = BufferBlock() + let receiveLock: SemaphoreLocker = SemaphoreLocker() static member Accept (streamId: uint16) (circuit: TorCircuit) = async { @@ -35,9 +35,9 @@ type TorStream (circuit: TorCircuit) = return stream } - member __.End () = + member __.End() = async { - let safeSend () = + let safeSend() = async { match streamState with | Connected streamId -> @@ -60,13 +60,13 @@ type TorStream (circuit: TorCircuit) = return! controlLock.RunAsyncWithSemaphore safeSend } - member self.EndAsync () = - self.End () |> Async.StartAsTask + member self.EndAsync() = + self.End() |> Async.StartAsTask - member __.SendData (data: array) = + member __.SendData(data: array) = async { - let safeSend () = + let safeSend() = async { match streamState with | Connected streamId -> @@ -80,7 +80,7 @@ type TorStream (circuit: TorCircuit) = match Seq.tryHead dataChunks with | None -> () | Some head -> - circuit.LastNode.Window.PackageDecrease () + circuit.LastNode.Window.PackageDecrease() do! circuit.SendRelayCell @@ -90,7 +90,7 @@ type TorStream (circuit: TorCircuit) = |> RelayData.RelayData) None - window.PackageDecrease () + window.PackageDecrease() do! Seq.tail dataChunks |> sendChunks } @@ -106,14 +106,14 @@ type TorStream (circuit: TorCircuit) = member self.SendDataAsync data = self.SendData data |> Async.StartAsTask - member self.ConnectToService () = - let startConnectionProcess () = + member self.ConnectToService() = + let startConnectionProcess() = async { let streamId = circuit.RegisterStream self None - let tcs = TaskCompletionSource () + let tcs = TaskCompletionSource() - streamState <- Connecting (streamId, tcs) + streamState <- Connecting(streamId, tcs) sprintf "TorStream[%d,%d]: creating a hidden service stream" @@ -144,15 +144,15 @@ type TorStream (circuit: TorCircuit) = |> FSharpUtil.WithTimeout Constants.StreamCreationTimeout } - member self.ConnectToDirectory () = + member self.ConnectToDirectory() = async { - let startConnectionProcess () = + let startConnectionProcess() = async { let streamId = circuit.RegisterStream self None - let tcs = TaskCompletionSource () + let tcs = TaskCompletionSource() - streamState <- Connecting (streamId, tcs) + streamState <- Connecting(streamId, tcs) sprintf "TorStream[%d,%d]: creating a directory stream" @@ -178,26 +178,26 @@ type TorStream (circuit: TorCircuit) = |> FSharpUtil.WithTimeout Constants.StreamCreationTimeout } - member self.ConnectToDirectoryAsync () = - self.ConnectToDirectory () |> Async.StartAsTask + member self.ConnectToDirectoryAsync() = + self.ConnectToDirectory() |> Async.StartAsTask - member private self.RegisterIncomingStream (streamId: uint16) = - let registerProcess () = + member private self.RegisterIncomingStream(streamId: uint16) = + let registerProcess() = streamState <- circuit.RegisterStream self (Some streamId) |> Connected controlLock.RunSyncWithSemaphore registerProcess - member self.Receive () = + member self.Receive() = async { - let safeReceive () = + let safeReceive() = async { - let! cell = incomingCells.ReceiveAsync () |> Async.AwaitTask + let! cell = incomingCells.ReceiveAsync() |> Async.AwaitTask match cell with | RelayData data -> return data |> Some | RelayEnd reason when reason = EndReason.Done -> - TorLogger.Log ( + TorLogger.Log( sprintf "TorStream[%s,%d]: pushed EOF to consumer" streamState.Id @@ -207,10 +207,10 @@ type TorStream (circuit: TorCircuit) = return None | RelayEnd reason -> return - failwith ( + failwith( sprintf "Stream closed unexpectedly, reason = %s" - (reason.ToString ()) + (reason.ToString()) ) | _ -> return @@ -221,17 +221,17 @@ type TorStream (circuit: TorCircuit) = return! receiveLock.RunAsyncWithSemaphore safeReceive } - member self.ReceiveAsync () = - self.Receive () |> Async.StartAsTask + member self.ReceiveAsync() = + self.Receive() |> Async.StartAsTask interface ITorStream with - member __.HandleIncomingData (message: RelayData) = + member __.HandleIncomingData(message: RelayData) = async { match message with | RelayConnected _ -> - let handleRelayConnected () = + let handleRelayConnected() = match streamState with - | Connecting (streamId, tcs) -> + | Connecting(streamId, tcs) -> streamState <- Connected streamId tcs.SetResult streamId @@ -247,10 +247,10 @@ type TorStream (circuit: TorCircuit) = controlLock.RunSyncWithSemaphore handleRelayConnected | RelayData _ -> - window.DeliverDecrease () + window.DeliverDecrease() - if window.NeedSendme () then - let sendSendMe () = + if window.NeedSendme() then + let sendSendMe() = async { match streamState with | Connected streamId -> @@ -267,23 +267,23 @@ type TorStream (circuit: TorCircuit) = do! controlLock.RunAsyncWithSemaphore sendSendMe incomingCells.Post message |> ignore - | RelaySendMe _ -> window.PackageIncrease () + | RelaySendMe _ -> window.PackageIncrease() | RelayEnd reason -> - let handleRelayEnd () = + let handleRelayEnd() = match streamState with - | Connecting (streamId, tcs) -> + | Connecting(streamId, tcs) -> sprintf "TorStream[%d,%d]: received end packet while connecting" streamId circuit.Id |> TorLogger.Log - streamState <- Ended (streamId, reason) + streamState <- Ended(streamId, reason) - Failure ( + Failure( sprintf "Stream connection process failed! Reason: %s" - (reason.ToString ()) + (reason.ToString()) ) |> tcs.SetException | Connected streamId -> @@ -294,7 +294,7 @@ type TorStream (circuit: TorCircuit) = |> TorLogger.Log incomingCells.Post message |> ignore - streamState <- Ended (streamId, reason) + streamState <- Ended(streamId, reason) | _ -> failwith "Unexpected state when receiving RelayEnd cell" diff --git a/NOnion/Network/TorWindow.fs b/NOnion/Network/TorWindow.fs index 567a12af..b1ed10e6 100644 --- a/NOnion/Network/TorWindow.fs +++ b/NOnion/Network/TorWindow.fs @@ -1,15 +1,15 @@ namespace NOnion.Network -type TorWindow (start: int, increament: int) = +type TorWindow(start: int, increament: int) = let mutable package = start let mutable delivery = start let increament = increament let start = start - let windowLock = obj () + let windowLock = obj() - member __.NeedSendme () = - let safeCheck () = + member __.NeedSendme() = + let safeCheck() = if delivery > (start - increament) then false else @@ -18,20 +18,20 @@ type TorWindow (start: int, increament: int) = lock windowLock safeCheck - member __.DeliverDecrease () = - let safeDecrease () = + member __.DeliverDecrease() = + let safeDecrease() = delivery <- delivery - 1 lock windowLock safeDecrease - member __.PackageDecrease () = - let safeDecrease () = + member __.PackageDecrease() = + let safeDecrease() = package <- package - 1 lock windowLock safeDecrease - member __.PackageIncrease () = - let safeIncrease () = + member __.PackageIncrease() = + let safeIncrease() = package <- package + increament lock windowLock safeIncrease diff --git a/NOnion/Services/TorServiceClient.fs b/NOnion/Services/TorServiceClient.fs index 5c58e4ce..584c7085 100644 --- a/NOnion/Services/TorServiceClient.fs +++ b/NOnion/Services/TorServiceClient.fs @@ -26,7 +26,7 @@ type TorServiceClient = Stream: TorStream } - member self.GetStream () = + member self.GetStream() = self.Stream static member ConnectAsync @@ -44,16 +44,16 @@ type TorServiceClient = |> JsonSerializer.Deserialize> |> Seq.head - Ed25519PublicKeyParameters ( + Ed25519PublicKeyParameters( info.AuthKey |> Convert.FromBase64String, 0 ), - X25519PublicKeyParameters ( + X25519PublicKeyParameters( info.EncryptionKey |> Convert.FromBase64String, 0 ), - CircuitNodeDetail.Create ( - IPEndPoint (IPAddress.Parse (info.Address), info.Port), + CircuitNodeDetail.Create( + IPEndPoint(IPAddress.Parse(info.Address), info.Port), info.OnionKey |> Convert.FromBase64String, info.Fingerprint |> Convert.FromBase64String ), @@ -77,16 +77,16 @@ type TorServiceClient = do! rendCircuit.RegisterAsRendezvousPoint randomGeneratedCookie let privateKey, publicKey = - let kpGen = X25519KeyPairGenerator () - let random = SecureRandom () - kpGen.Init (X25519KeyGenerationParameters random) - let keyPair = kpGen.GenerateKeyPair () + let kpGen = X25519KeyPairGenerator() + let random = SecureRandom() + kpGen.Init(X25519KeyGenerationParameters random) + let keyPair = kpGen.GenerateKeyPair() keyPair.Private :?> X25519PrivateKeyParameters, keyPair.Public :?> X25519PublicKeyParameters match rendNode with - | Create (address, onionKey, identityKey) -> + | Create(address, onionKey, identityKey) -> let introduceInnerData = { RelayIntroduceInnerData.OnionKey = onionKey @@ -103,12 +103,12 @@ type TorServiceClient = ] } - let! networkStatus = directory.GetLiveNetworkStatus () - let periodInfo = networkStatus.GetTimePeriod () + let! networkStatus = directory.GetLiveNetworkStatus() + let periodInfo = networkStatus.GetTimePeriod() let data, mac = HiddenServicesCipher.EncryptIntroductionData - (introduceInnerData.ToBytes ()) + (introduceInnerData.ToBytes()) privateKey publicKey authKey @@ -119,11 +119,11 @@ type TorServiceClient = let introduce1Packet = { RelayIntroduce.AuthKey = - RelayIntroAuthKey.ED25519SHA3256 ( - authKey.GetEncoded () + RelayIntroAuthKey.ED25519SHA3256( + authKey.GetEncoded() ) Extensions = List.empty - ClientPublicKey = publicKey.GetEncoded () + ClientPublicKey = publicKey.GetEncoded() Mac = mac EncryptedData = data } @@ -146,7 +146,7 @@ type TorServiceClient = if ack.Status <> RelayIntroduceStatus.Success then return - failwith ( + failwith( sprintf "Unsuccessful introduction: %A" ack.Status @@ -156,7 +156,7 @@ type TorServiceClient = do! Async.Parallel [ introduceJob; rendJoin ] |> Async.Ignore let serviceStream = TorStream rendCircuit - do! serviceStream.ConnectToService () |> Async.Ignore + do! serviceStream.ConnectToService() |> Async.Ignore return { @@ -168,5 +168,5 @@ type TorServiceClient = } interface IDisposable with - member self.Dispose () = - (self.RendezvousGuard :> IDisposable).Dispose () + member self.Dispose() = + (self.RendezvousGuard :> IDisposable).Dispose() diff --git a/NOnion/Services/TorServiceHost.fs b/NOnion/Services/TorServiceHost.fs index b1ecba0f..f6ae177f 100644 --- a/NOnion/Services/TorServiceHost.fs +++ b/NOnion/Services/TorServiceHost.fs @@ -50,27 +50,27 @@ type TorServiceHost Map.empty let mutable guardNode: Option = None - let introductionPointSemaphore: SemaphoreLocker = SemaphoreLocker () - let newClientSemaphore = new SemaphoreSlim (0) + let introductionPointSemaphore: SemaphoreLocker = SemaphoreLocker() + let newClientSemaphore = new SemaphoreSlim(0) let mutable pendingConnectionQueue: Queue = Queue.empty - let queueLock: SemaphoreLocker = SemaphoreLocker () + let queueLock: SemaphoreLocker = SemaphoreLocker() member private self.IncomingServiceStreamCallback (streamId: uint16) (senderCircuit: TorCircuit) = async { - let registerConnectionRequest () = + let registerConnectionRequest() = pendingConnectionQueue <- - pendingConnectionQueue.Conj (streamId, senderCircuit) + pendingConnectionQueue.Conj(streamId, senderCircuit) - newClientSemaphore.Release () |> ignore + newClientSemaphore.Release() |> ignore queueLock.RunSyncWithSemaphore registerConnectionRequest } - member private self.RelayIntroduceCallback (introduce: RelayIntroduce) = + member private self.RelayIntroduceCallback(introduce: RelayIntroduce) = let rec tryConnectingToRendezvous tryNumber maxRetryCount @@ -90,13 +90,13 @@ type TorServiceHost let! guard = TorGuard.NewClient endPoint let rendCircuit = - TorCircuit (guard, self.IncomingServiceStreamCallback) + TorCircuit(guard, self.IncomingServiceStreamCallback) do! rendCircuit.Create randomNodeDetails |> Async.Ignore do! - rendCircuit.Extend ( - CircuitNodeDetail.Create ( + rendCircuit.Extend( + CircuitNodeDetail.Create( rendEndpoint, onionKey, rendFingerPrint @@ -107,7 +107,7 @@ type TorServiceHost do! rendCircuit.Rendezvous cookie - (X25519PublicKeyParameters (clientPubKey, 0)) + (X25519PublicKeyParameters(clientPubKey, 0)) introAuthPubKey introEncPrivKey introEncPubKey @@ -119,7 +119,7 @@ type TorServiceHost | :? SocketException as ex -> sprintf "Exception happened when trying to connect to rendezvous point, ex=%s" - (ex.ToString ()) + (ex.ToString()) |> TorLogger.Log if tryNumber <= maxRetryCount then @@ -144,7 +144,7 @@ type TorServiceHost | ex -> sprintf "Exception happened when trying to connect to rendezvous point, ex=%s" - (ex.ToString ()) + (ex.ToString()) |> TorLogger.Log return raise <| FSharpUtil.ReRaise ex @@ -174,13 +174,13 @@ type TorServiceHost introductionPointDetails.EncryptionKey.Private :?> X25519PrivateKeyParameters - let! networkStatus = directory.GetLiveNetworkStatus () - let periodInfo = networkStatus.GetTimePeriod () + let! networkStatus = directory.GetLiveNetworkStatus() + let periodInfo = networkStatus.GetTimePeriod() let decryptedData, digest = HiddenServicesCipher.DecryptIntroductionData introduce.EncryptedData - (X25519PublicKeyParameters (introduce.ClientPublicKey, 0)) + (X25519PublicKeyParameters(introduce.ClientPublicKey, 0)) (introductionPointDetails.AuthKey.Public :?> Ed25519PublicKeyParameters) (introductionPointDetails.EncryptionKey.Private @@ -190,8 +190,8 @@ type TorServiceHost periodInfo introductionPointDetails.MasterPublicKey - use decryptedStream = new MemoryStream (decryptedData) - use decryptedReader = new BinaryReader (decryptedStream) + use decryptedStream = new MemoryStream(decryptedData) + use decryptedReader = new BinaryReader(decryptedStream) let innerData = RelayIntroduceInnerData.Deserialize decryptedReader if digest <> introduce.Mac then @@ -199,15 +199,15 @@ type TorServiceHost let rendEndpoint = (innerData.RendezvousLinkSpecifiers - |> Seq.filter (fun linkS -> + |> Seq.filter(fun linkS -> linkS.Type = LinkSpecifierType.TLSOverTCPV4 ) |> Seq.exactlyOne) - .ToEndPoint () + .ToEndPoint() let rendFingerPrint = (innerData.RendezvousLinkSpecifiers - |> Seq.filter (fun linkS -> + |> Seq.filter(fun linkS -> linkS.Type = LinkSpecifierType.LegacyIdentity ) |> Seq.exactlyOne) @@ -229,35 +229,35 @@ type TorServiceHost return () } - member self.StartAsync () = - self.Start () |> Async.StartAsTask + member self.StartAsync() = + self.Start() |> Async.StartAsTask - member self.Start () = - let safeCreateIntroductionPoint () = + member self.Start() = + let safeCreateIntroductionPoint() = async { let! _, introNodeDetail = directory.GetRouter false match introNodeDetail with | FastCreate -> return failwith "should not happen" - | Create (address, onionKey, fingerprint) -> + | Create(address, onionKey, fingerprint) -> let! guard = TorGuard.NewClient address let circuit = TorCircuit guard let encKeyPair, authKeyPair, randomMasterPubKey = - let kpGen = Ed25519KeyPairGenerator () - let kpGenX = X25519KeyPairGenerator () + let kpGen = Ed25519KeyPairGenerator() + let kpGenX = X25519KeyPairGenerator() - let random = SecureRandom () + let random = SecureRandom() - kpGen.Init (Ed25519KeyGenerationParameters random) - kpGenX.Init (X25519KeyGenerationParameters random) + kpGen.Init(Ed25519KeyGenerationParameters random) + kpGenX.Init(X25519KeyGenerationParameters random) - kpGenX.GenerateKeyPair (), - kpGen.GenerateKeyPair (), + kpGenX.GenerateKeyPair(), + kpGen.GenerateKeyPair(), (kpGen.GenerateKeyPair().Public :?> Ed25519PublicKeyParameters) - .GetEncoded () + .GetEncoded() let introductionPointInfo = { @@ -274,7 +274,7 @@ type TorServiceHost introductionPointKeys <- Map.add ((authKeyPair.Public :?> Ed25519PublicKeyParameters) - .GetEncoded () + .GetEncoded() |> Convert.ToBase64String) introductionPointInfo introductionPointKeys @@ -290,24 +290,24 @@ type TorServiceHost introductionPointSemaphore.RunAsyncWithSemaphore safeCreateIntroductionPoint - member __.AcceptClient () = + member __.AcceptClient() = async { let! cancelToken = Async.CancellationToken - cancelToken.ThrowIfCancellationRequested () + cancelToken.ThrowIfCancellationRequested() - let tryGetConnectionRequest () = + let tryGetConnectionRequest() = let nextItemOpt = pendingConnectionQueue.TryUncons match nextItemOpt with - | Some (nextItem, rest) -> + | Some(nextItem, rest) -> pendingConnectionQueue <- rest Some nextItem | None -> None - let rec getConnectionRequest () = + let rec getConnectionRequest() = async { do! - newClientSemaphore.WaitAsync (cancelToken) + newClientSemaphore.WaitAsync(cancelToken) |> Async.AwaitTask let nextItemOpt = @@ -318,35 +318,35 @@ type TorServiceHost | None -> return failwith "should not happen" } - let! (streamId, senderCircuit) = getConnectionRequest () + let! (streamId, senderCircuit) = getConnectionRequest() let! stream = TorStream.Accept streamId senderCircuit return stream } - member self.AcceptClientAsync () = - self.AcceptClient () |> Async.StartAsTask + member self.AcceptClientAsync() = + self.AcceptClient() |> Async.StartAsTask - member self.AcceptClientAsync (cancellationToken: CancellationToken) = - Async.StartAsTask ( - self.AcceptClient (), + member self.AcceptClientAsync(cancellationToken: CancellationToken) = + Async.StartAsTask( + self.AcceptClient(), cancellationToken = cancellationToken ) - member self.Export () = - let exportIntroductionPoint (_key, info: IntroductionPointInfo) = + member self.Export() = + let exportIntroductionPoint(_key, info: IntroductionPointInfo) = { IntroductionPointPublicInfo.Address = - info.Address.Address.ToString () + info.Address.Address.ToString() Port = info.Address.Port OnionKey = info.OnionKey Fingerprint = info.Fingerprint AuthKey = (info.AuthKey.Public :?> Ed25519PublicKeyParameters) - .GetEncoded () + .GetEncoded() |> Convert.ToBase64String EncryptionKey = (info.EncryptionKey.Public :?> X25519PublicKeyParameters) - .GetEncoded () + .GetEncoded() |> Convert.ToBase64String MasterPublicKey = info.MasterPublicKey |> Convert.ToBase64String } diff --git a/NOnion/TorHandshakes/FastHandshake.fs b/NOnion/TorHandshakes/FastHandshake.fs index f05f5941..bc2fe4ee 100644 --- a/NOnion/TorHandshakes/FastHandshake.fs +++ b/NOnion/TorHandshakes/FastHandshake.fs @@ -11,7 +11,7 @@ type FastHandshake = RandomClientMaterial: array } - static member Create () = + static member Create() = let clientMaterial = Array.zeroCreate Constants.HashLength RandomNumberGenerator @@ -23,7 +23,7 @@ type FastHandshake = } interface IHandshake with - member self.GenerateClientMaterial () = + member self.GenerateClientMaterial() = self.RandomClientMaterial member self.GenerateKdfResult serverSideData = diff --git a/NOnion/TorHandshakes/NTorHandshake.fs b/NOnion/TorHandshakes/NTorHandshake.fs index 76b0017a..9f88a43a 100644 --- a/NOnion/TorHandshakes/NTorHandshake.fs +++ b/NOnion/TorHandshakes/NTorHandshake.fs @@ -27,48 +27,48 @@ type NTorHandshake = let privateKey, publicKey = let keyPair = - let kpGen = X25519KeyPairGenerator () - let random = SecureRandom () - kpGen.Init (X25519KeyGenerationParameters random) - kpGen.GenerateKeyPair () + let kpGen = X25519KeyPairGenerator() + let random = SecureRandom() + kpGen.Init(X25519KeyGenerationParameters random) + kpGen.GenerateKeyPair() keyPair.Private :?> X25519PrivateKeyParameters, keyPair.Public :?> X25519PublicKeyParameters { IdentityDigest = identityDigest - NTorOnionKey = X25519PublicKeyParameters (nTorOnionKey, 0) + NTorOnionKey = X25519PublicKeyParameters(nTorOnionKey, 0) RandomClientPrivateKey = privateKey RandomClientPublicKey = publicKey } interface IHandshake with - member self.GenerateClientMaterial () = + member self.GenerateClientMaterial() = Array.concat [ self.IdentityDigest - self.NTorOnionKey.GetEncoded () - self.RandomClientPublicKey.GetEncoded () + self.NTorOnionKey.GetEncoded() + self.RandomClientPublicKey.GetEncoded() ] member self.GenerateKdfResult serverSideData = let randomServerPublicKey = - X25519PublicKeyParameters (serverSideData.ServerHandshake, 0) + X25519PublicKeyParameters(serverSideData.ServerHandshake, 0) - let keyAgreement = X25519Agreement () + let keyAgreement = X25519Agreement() keyAgreement.Init self.RandomClientPrivateKey let sharedSecretWithY, sharedSecretWithB = Array.zeroCreate keyAgreement.AgreementSize, Array.zeroCreate keyAgreement.AgreementSize - keyAgreement.CalculateAgreement ( + keyAgreement.CalculateAgreement( randomServerPublicKey, sharedSecretWithY, 0 ) - keyAgreement.CalculateAgreement ( + keyAgreement.CalculateAgreement( self.NTorOnionKey, sharedSecretWithB, 0 @@ -80,14 +80,14 @@ type NTorHandshake = sharedSecretWithY sharedSecretWithB self.IdentityDigest - self.NTorOnionKey.GetEncoded () - self.RandomClientPublicKey.GetEncoded () - randomServerPublicKey.GetEncoded () + self.NTorOnionKey.GetEncoded() + self.RandomClientPublicKey.GetEncoded() + randomServerPublicKey.GetEncoded() Constants.NTorProtoId ] let calculateHmacSha256 (data: array) (key: array) = - use hmacSha256 = new HMACSHA256 (key) + use hmacSha256 = new HMACSHA256(key) hmacSha256.ComputeHash data @@ -98,9 +98,9 @@ type NTorHandshake = [ verify self.IdentityDigest - self.NTorOnionKey.GetEncoded () - randomServerPublicKey.GetEncoded () - self.RandomClientPublicKey.GetEncoded () + self.NTorOnionKey.GetEncoded() + randomServerPublicKey.GetEncoded() + self.RandomClientPublicKey.GetEncoded() Constants.NTorAuthInputSuffix ] diff --git a/NOnion/TorLogger.fs b/NOnion/TorLogger.fs index fe4ae4b9..c4d43e63 100644 --- a/NOnion/TorLogger.fs +++ b/NOnion/TorLogger.fs @@ -5,10 +5,10 @@ open System module TorLogger = let mutable LoggerOpt: Option> = None - let Init (loggingFunc: Action) = + let Init(loggingFunc: Action) = LoggerOpt <- Some loggingFunc - let Log (msg: string) = + let Log(msg: string) = match LoggerOpt with | None -> () - | Some logger -> logger.Invoke (msg) + | Some logger -> logger.Invoke(msg) diff --git a/NOnion/Utility/Base64Util.fs b/NOnion/Utility/Base64Util.fs index 3dac87dc..48e8d5f5 100644 --- a/NOnion/Utility/Base64Util.fs +++ b/NOnion/Utility/Base64Util.fs @@ -4,7 +4,7 @@ module Base64Util = let private modulus = 4 let private paddingCharacter = "=" - let FixMissingPadding (input: string) = + let FixMissingPadding(input: string) = (* * Length of base64 strings should be divisble by 4 or they'll be padded with = * According to tor directory spec, "The trailing '=' sign MAY be omitted from the base64 encoding" @@ -15,9 +15,9 @@ module Base64Util = if missingPadding > 0 then input - + (String.replicate (modulus - missingPadding) paddingCharacter) + + (String.replicate(modulus - missingPadding) paddingCharacter) else input - let FromString (input: string) = + let FromString(input: string) = FixMissingPadding input |> System.Convert.FromBase64String diff --git a/NOnion/Utility/BigIntegerSerialization.fs b/NOnion/Utility/BigIntegerSerialization.fs index 0213ea13..a97006a8 100644 --- a/NOnion/Utility/BigIntegerSerialization.fs +++ b/NOnion/Utility/BigIntegerSerialization.fs @@ -3,8 +3,8 @@ open System.Numerics module BigIntegerSerialization = - let FromBigEndianBytes (data: array) = + let FromBigEndianBytes(data: array) = data |> Array.rev |> BigInteger - let ToBigEndianBytes (num: BigInteger) = - num.ToByteArray () |> Array.rev + let ToBigEndianBytes(num: BigInteger) = + num.ToByteArray() |> Array.rev diff --git a/NOnion/Utility/BinaryIO.fs b/NOnion/Utility/BinaryIO.fs index d53311cc..4c157390 100644 --- a/NOnion/Utility/BinaryIO.fs +++ b/NOnion/Utility/BinaryIO.fs @@ -12,8 +12,8 @@ module BinaryIO = let WriteUInt32BigEndian (writer: BinaryWriter) (num: uint32) : unit = FromUInt32ToBigEndianByteArray num |> writer.Write - let ReadBigEndianUInt16 (reader: BinaryReader) : uint16 = + let ReadBigEndianUInt16(reader: BinaryReader) : uint16 = sizeof |> reader.ReadBytes |> FromBigEndianByteArrayToUInt16 - let ReadBigEndianUInt32 (reader: BinaryReader) : uint32 = + let ReadBigEndianUInt32(reader: BinaryReader) : uint32 = sizeof |> reader.ReadBytes |> FromBigEndianByteArrayToUInt32 diff --git a/NOnion/Utility/DateTimeUtils.fs b/NOnion/Utility/DateTimeUtils.fs index d813ea32..f0fd5c1a 100644 --- a/NOnion/Utility/DateTimeUtils.fs +++ b/NOnion/Utility/DateTimeUtils.fs @@ -3,8 +3,8 @@ open System module DateTimeUtils = - let internal GetTimeSpanSinceEpoch (dt: DateTime) = - dt - DateTime (1970, 1, 1) + let internal GetTimeSpanSinceEpoch(dt: DateTime) = + dt - DateTime(1970, 1, 1) - let internal ToUnixTimestamp (dt: DateTime) = + let internal ToUnixTimestamp(dt: DateTime) = (GetTimeSpanSinceEpoch dt).TotalSeconds |> uint diff --git a/NOnion/Utility/DigestUtils.fs b/NOnion/Utility/DigestUtils.fs index 0d45e683..d9eefe58 100644 --- a/NOnion/Utility/DigestUtils.fs +++ b/NOnion/Utility/DigestUtils.fs @@ -8,9 +8,9 @@ module DigestUtils = (previousDigestOpt: Option) : GeneralDigest = match isSha256, previousDigestOpt with - | false, None -> Sha1Digest () :> GeneralDigest + | false, None -> Sha1Digest() :> GeneralDigest | false, Some previousDigest -> - Sha1Digest (previousDigest :?> Sha1Digest) :> GeneralDigest - | true, None -> Sha256Digest () :> GeneralDigest + Sha1Digest(previousDigest :?> Sha1Digest) :> GeneralDigest + | true, None -> Sha256Digest() :> GeneralDigest | true, Some previousDigest -> - Sha256Digest (previousDigest :?> Sha256Digest) :> GeneralDigest + Sha256Digest(previousDigest :?> Sha256Digest) :> GeneralDigest diff --git a/NOnion/Utility/FSharpUtil.fs b/NOnion/Utility/FSharpUtil.fs index 9fbc6384..11cbcdcc 100644 --- a/NOnion/Utility/FSharpUtil.fs +++ b/NOnion/Utility/FSharpUtil.fs @@ -5,8 +5,8 @@ open System.Runtime.ExceptionServices module FSharpUtil = //Implementation copied from https://github.com/nblockchain/geewallet/blob/master/src/GWallet.Backend/FSharpUtil.fs - let ReRaise (ex: Exception) : Exception = - (ExceptionDispatchInfo.Capture ex).Throw () + let ReRaise(ex: Exception) : Exception = + (ExceptionDispatchInfo.Capture ex).Throw() failwith "Should be unreachable" ex @@ -26,10 +26,10 @@ module FSharpUtil = async { let total = int timeSpan.TotalMilliseconds do! Async.Sleep total - return FailureResult <| TimeoutException () |> Some + return FailureResult <| TimeoutException() |> Some } - let! dummyOption = Async.Choice ([ read; delay ]) + let! dummyOption = Async.Choice([ read; delay ]) match dummyOption with | Some theResult -> diff --git a/NOnion/Utility/Hex.fs b/NOnion/Utility/Hex.fs index 142fd262..aa859335 100644 --- a/NOnion/Utility/Hex.fs +++ b/NOnion/Utility/Hex.fs @@ -5,23 +5,23 @@ open System [] module Hex = - let FromByteArray (bytes: byte []) : string = + let FromByteArray(bytes: byte []) : string = bytes - |> Array.map (fun (x: byte) -> String.Format ("{0:X2}", x)) + |> Array.map(fun (x: byte) -> String.Format("{0:X2}", x)) |> String.concat String.Empty - let ToByteArray (hex: string) : byte [] = + let ToByteArray(hex: string) : byte [] = // validate hex length if hex.Length % 2 <> 0 then invalidArg "hex" "hex.Length is not even" // blit bytes to array - let bytes = Array.create (hex.Length / 2) 0uy + let bytes = Array.create(hex.Length / 2) 0uy let mutable i = 0 while i < bytes.Length do - bytes.[i] <- Convert.ToByte (hex.Substring (i * 2, 2), 16) + bytes.[i] <- Convert.ToByte(hex.Substring(i * 2, 2), 16) i <- i + 1 bytes diff --git a/NOnion/Utility/IntegerSerialization.fs b/NOnion/Utility/IntegerSerialization.fs index f4bc0192..7e1155ec 100644 --- a/NOnion/Utility/IntegerSerialization.fs +++ b/NOnion/Utility/IntegerSerialization.fs @@ -5,7 +5,7 @@ open System module IntegerSerialization = - let FromUInt16ToBigEndianByteArray (value: uint16) : array = + let FromUInt16ToBigEndianByteArray(value: uint16) : array = let maybeLEbytes = BitConverter.GetBytes value if BitConverter.IsLittleEndian then @@ -13,16 +13,16 @@ module IntegerSerialization = else maybeLEbytes - let FromBigEndianByteArrayToUInt16 (bytes: array) : uint16 = + let FromBigEndianByteArrayToUInt16(bytes: array) : uint16 = let bytesForBitConverter = if BitConverter.IsLittleEndian then Array.rev bytes else bytes - BitConverter.ToUInt16 (bytesForBitConverter, 0) + BitConverter.ToUInt16(bytesForBitConverter, 0) - let FromUInt32ToBigEndianByteArray (value: uint32) : array = + let FromUInt32ToBigEndianByteArray(value: uint32) : array = let maybeLEbytes = BitConverter.GetBytes value if BitConverter.IsLittleEndian then @@ -30,16 +30,16 @@ module IntegerSerialization = else maybeLEbytes - let FromBigEndianByteArrayToUInt32 (bytes: array) : uint32 = + let FromBigEndianByteArrayToUInt32(bytes: array) : uint32 = let bytesForBitConverter = if BitConverter.IsLittleEndian then Array.rev bytes else bytes - BitConverter.ToUInt32 (bytesForBitConverter, 0) + BitConverter.ToUInt32(bytesForBitConverter, 0) - let FromUInt64ToBigEndianByteArray (value: uint64) : array = + let FromUInt64ToBigEndianByteArray(value: uint64) : array = let maybeLEbytes = BitConverter.GetBytes value if BitConverter.IsLittleEndian then diff --git a/NOnion/Utility/SemaphoreLocker.fs b/NOnion/Utility/SemaphoreLocker.fs index fc67907f..7807751d 100644 --- a/NOnion/Utility/SemaphoreLocker.fs +++ b/NOnion/Utility/SemaphoreLocker.fs @@ -2,22 +2,22 @@ open System.Threading -type SemaphoreLocker () = +type SemaphoreLocker() = //FIXME: Semaphores are not disposed correctly let semaphore = new SemaphoreSlim 1 - member __.RunAsyncWithSemaphore (func: unit -> Async<'T>) : Async<'T> = + member __.RunAsyncWithSemaphore(func: unit -> Async<'T>) : Async<'T> = async { try - do! semaphore.WaitAsync () |> Async.AwaitTask - return! func () + do! semaphore.WaitAsync() |> Async.AwaitTask + return! func() finally - semaphore.Release () |> ignore + semaphore.Release() |> ignore } - member __.RunSyncWithSemaphore (func: unit -> 'T) : 'T = + member __.RunSyncWithSemaphore(func: unit -> 'T) : 'T = try - semaphore.Wait () - func () + semaphore.Wait() + func() finally - semaphore.Release () |> ignore + semaphore.Release() |> ignore diff --git a/NOnion/Utility/SeqUtils.fs b/NOnion/Utility/SeqUtils.fs index 446bf84b..27c3322e 100644 --- a/NOnion/Utility/SeqUtils.fs +++ b/NOnion/Utility/SeqUtils.fs @@ -4,9 +4,9 @@ module SeqUtils = // Helper function copied from https://stackoverflow.com/a/21615676 let Chunk n xs = xs - |> Seq.mapi (fun i x -> i / n, x) + |> Seq.mapi(fun i x -> i / n, x) |> Seq.groupBy fst - |> Seq.map (fun (_, g) -> Seq.map snd g) + |> Seq.map(fun (_, g) -> Seq.map snd g) let TakeRandom n xs = - xs |> Seq.sortBy (fun _ -> System.Guid.NewGuid ()) |> Seq.take n + xs |> Seq.sortBy(fun _ -> System.Guid.NewGuid()) |> Seq.take n diff --git a/NOnion/Utility/StreamUtil.fs b/NOnion/Utility/StreamUtil.fs index 5d7de88b..bd92a13d 100644 --- a/NOnion/Utility/StreamUtil.fs +++ b/NOnion/Utility/StreamUtil.fs @@ -15,7 +15,7 @@ module StreamUtil = return None else let! filledBytes = - stream.ReadAsync ( + stream.ReadAsync( buffer, offset, count - offset, @@ -46,6 +46,6 @@ module StreamUtil = let! ct = Async.CancellationToken return! - stream.WriteAsync (buffer, 0, buffer.Length, ct) + stream.WriteAsync(buffer, 0, buffer.Length, ct) |> Async.AwaitTask }