Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
briar
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
681
Issues
681
List
Boards
Labels
Service Desk
Milestones
Merge Requests
16
Merge Requests
16
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
briar
briar
Commits
1ec3fa3a
Verified
Commit
1ec3fa3a
authored
Jun 05, 2019
by
akwizgran
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement Tor rendezvous crypto.
parent
64ae99bb
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
119 additions
and
10 deletions
+119
-10
bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java
...org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java
+2
-1
bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java
...arproject/bramble/plugin/tor/AndroidTorPluginFactory.java
+3
-1
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
...n/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
+50
-2
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorRendezvousCrypto.java
.../briarproject/bramble/plugin/tor/TorRendezvousCrypto.java
+8
-0
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorRendezvousCryptoImpl.java
...arproject/bramble/plugin/tor/TorRendezvousCryptoImpl.java
+46
-0
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
...va/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
+3
-2
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
...va/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
+3
-2
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
...briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
+4
-2
No files found.
bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPlugin.java
View file @
1ec3fa3a
...
...
@@ -41,11 +41,12 @@ class AndroidTorPlugin extends TorPlugin {
Clock
clock
,
ResourceProvider
resourceProvider
,
CircumventionProvider
circumventionProvider
,
BatteryManager
batteryManager
,
Backoff
backoff
,
TorRendezvousCrypto
torRendezvousCrypto
,
PluginCallback
callback
,
String
architecture
,
int
maxLatency
,
int
maxIdleTime
)
{
super
(
ioExecutor
,
networkManager
,
locationUtils
,
torSocketFactory
,
clock
,
resourceProvider
,
circumventionProvider
,
batteryManager
,
backoff
,
callback
,
architecture
,
maxLatency
,
maxIdleTime
,
backoff
,
torRendezvousCrypto
,
callback
,
architecture
,
maxLatency
,
maxIdleTime
,
appContext
.
getDir
(
"tor"
,
MODE_PRIVATE
));
this
.
appContext
=
appContext
;
PowerManager
pm
=
(
PowerManager
)
...
...
bramble-android/src/main/java/org/briarproject/bramble/plugin/tor/AndroidTorPluginFactory.java
View file @
1ec3fa3a
...
...
@@ -106,10 +106,12 @@ public class AndroidTorPluginFactory implements DuplexPluginFactory {
Backoff
backoff
=
backoffFactory
.
createBackoff
(
MIN_POLLING_INTERVAL
,
MAX_POLLING_INTERVAL
,
BACKOFF_BASE
);
TorRendezvousCrypto
torRendezvousCrypto
=
new
TorRendezvousCryptoImpl
();
AndroidTorPlugin
plugin
=
new
AndroidTorPlugin
(
ioExecutor
,
scheduler
,
appContext
,
networkManager
,
locationUtils
,
torSocketFactory
,
clock
,
resourceProvider
,
circumventionProvider
,
batteryManager
,
backoff
,
callback
,
architecture
,
MAX_LATENCY
,
MAX_IDLE_TIME
);
backoff
,
torRendezvousCrypto
,
callback
,
architecture
,
MAX_LATENCY
,
MAX_IDLE_TIME
);
eventBus
.
addListener
(
plugin
);
return
plugin
;
}
...
...
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorPlugin.java
View file @
1ec3fa3a
...
...
@@ -105,6 +105,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
private
final
Clock
clock
;
private
final
BatteryManager
batteryManager
;
private
final
Backoff
backoff
;
private
final
TorRendezvousCrypto
torRendezvousCrypto
;
private
final
PluginCallback
callback
;
private
final
String
architecture
;
private
final
CircumventionProvider
circumventionProvider
;
...
...
@@ -131,6 +132,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
Clock
clock
,
ResourceProvider
resourceProvider
,
CircumventionProvider
circumventionProvider
,
BatteryManager
batteryManager
,
Backoff
backoff
,
TorRendezvousCrypto
torRendezvousCrypto
,
PluginCallback
callback
,
String
architecture
,
int
maxLatency
,
int
maxIdleTime
,
File
torDirectory
)
{
this
.
ioExecutor
=
ioExecutor
;
...
...
@@ -142,6 +144,7 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
this
.
circumventionProvider
=
circumventionProvider
;
this
.
batteryManager
=
batteryManager
;
this
.
backoff
=
backoff
;
this
.
torRendezvousCrypto
=
torRendezvousCrypto
;
this
.
callback
=
callback
;
this
.
architecture
=
architecture
;
this
.
maxLatency
=
maxLatency
;
...
...
@@ -609,13 +612,58 @@ abstract class TorPlugin implements DuplexPlugin, EventHandler, EventListener {
@Override
public
boolean
supportsRendezvous
()
{
return
fals
e
;
return
tru
e
;
}
@Override
public
RendezvousEndpoint
createRendezvousEndpoint
(
KeyMaterialSource
k
,
boolean
alice
,
ConnectionHandler
incoming
)
{
throw
new
UnsupportedOperationException
();
byte
[]
aliceSeed
=
k
.
getKeyMaterial
(
32
);
byte
[]
bobSeed
=
k
.
getKeyMaterial
(
32
);
byte
[]
localSeed
=
alice
?
aliceSeed
:
bobSeed
;
byte
[]
remoteSeed
=
alice
?
bobSeed
:
aliceSeed
;
String
blob
=
torRendezvousCrypto
.
getPrivateKeyBlob
(
localSeed
);
String
localOnion
=
torRendezvousCrypto
.
getOnionAddress
(
localSeed
);
String
remoteOnion
=
torRendezvousCrypto
.
getOnionAddress
(
remoteSeed
);
TransportProperties
remote
=
new
TransportProperties
();
remote
.
put
(
PROP_ONION_V3
,
remoteOnion
);
try
{
ServerSocket
ss
=
new
ServerSocket
();
ss
.
bind
(
new
InetSocketAddress
(
"127.0.0.1"
,
0
));
int
port
=
ss
.
getLocalPort
();
ioExecutor
.
execute
(()
->
{
try
{
//noinspection InfiniteLoopStatement
while
(
true
)
{
Socket
s
=
ss
.
accept
();
incoming
.
handleConnection
(
new
TorTransportConnection
(
this
,
s
));
}
}
catch
(
IOException
e
)
{
// This is expected when the socket is closed
if
(
LOG
.
isLoggable
(
INFO
))
LOG
.
info
(
e
.
toString
());
}
});
Map
<
Integer
,
String
>
portLines
=
singletonMap
(
80
,
"127.0.0.1:"
+
port
);
controlConnection
.
addOnion
(
blob
,
portLines
);
return
new
RendezvousEndpoint
()
{
@Override
public
TransportProperties
getRemoteTransportProperties
()
{
return
remote
;
}
@Override
public
void
close
()
throws
IOException
{
controlConnection
.
delOnion
(
localOnion
);
tryToClose
(
ss
);
}
};
}
catch
(
IOException
e
)
{
logException
(
LOG
,
WARNING
,
e
);
return
null
;
}
}
@Override
...
...
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorRendezvousCrypto.java
0 → 100644
View file @
1ec3fa3a
package
org.briarproject.bramble.plugin.tor
;
interface
TorRendezvousCrypto
{
String
getOnionAddress
(
byte
[]
seed
);
String
getPrivateKeyBlob
(
byte
[]
seed
);
}
bramble-core/src/main/java/org/briarproject/bramble/plugin/tor/TorRendezvousCryptoImpl.java
0 → 100644
View file @
1ec3fa3a
package
org.briarproject.bramble.plugin.tor
;
import
net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec
;
import
net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable
;
import
net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec
;
import
org.briarproject.bramble.util.Base32
;
import
org.spongycastle.crypto.Digest
;
import
org.spongycastle.crypto.digests.SHA3Digest
;
import
org.spongycastle.util.encoders.Base64
;
import
java.nio.charset.Charset
;
import
static
java
.
lang
.
System
.
arraycopy
;
public
class
TorRendezvousCryptoImpl
implements
TorRendezvousCrypto
{
private
static
final
EdDSANamedCurveSpec
CURVE_SPEC
=
EdDSANamedCurveTable
.
getByName
(
"Ed25519"
);
@Override
public
String
getOnionAddress
(
byte
[]
seed
)
{
EdDSAPrivateKeySpec
spec
=
new
EdDSAPrivateKeySpec
(
seed
,
CURVE_SPEC
);
byte
[]
publicKey
=
spec
.
getA
().
toByteArray
();
Digest
digest
=
new
SHA3Digest
(
256
);
byte
[]
label
=
".onion checksum"
.
getBytes
(
Charset
.
forName
(
"US-ASCII"
));
digest
.
update
(
label
,
0
,
label
.
length
);
digest
.
update
(
publicKey
,
0
,
publicKey
.
length
);
digest
.
update
((
byte
)
3
);
byte
[]
checksum
=
new
byte
[
digest
.
getDigestSize
()];
digest
.
doFinal
(
checksum
,
0
);
byte
[]
address
=
new
byte
[
publicKey
.
length
+
3
];
arraycopy
(
publicKey
,
0
,
address
,
0
,
publicKey
.
length
);
arraycopy
(
checksum
,
0
,
address
,
publicKey
.
length
,
2
);
address
[
address
.
length
-
1
]
=
3
;
return
Base32
.
encode
(
address
).
toLowerCase
();
}
@Override
public
String
getPrivateKeyBlob
(
byte
[]
seed
)
{
EdDSAPrivateKeySpec
spec
=
new
EdDSAPrivateKeySpec
(
seed
,
CURVE_SPEC
);
byte
[]
hash
=
spec
.
getH
();
byte
[]
base64
=
Base64
.
encode
(
hash
);
return
"ED25519-V3:"
+
new
String
(
base64
,
Charset
.
forName
(
"US-ASCII"
));
}
}
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/JavaTorPlugin.java
View file @
1ec3fa3a
...
...
@@ -25,12 +25,13 @@ abstract class JavaTorPlugin extends TorPlugin {
Clock
clock
,
ResourceProvider
resourceProvider
,
CircumventionProvider
circumventionProvider
,
BatteryManager
batteryManager
,
Backoff
backoff
,
TorRendezvousCrypto
torRendezvousCrypto
,
PluginCallback
callback
,
String
architecture
,
int
maxLatency
,
int
maxIdleTime
,
File
torDirectory
)
{
super
(
ioExecutor
,
networkManager
,
locationUtils
,
torSocketFactory
,
clock
,
resourceProvider
,
circumventionProvider
,
batteryManager
,
backoff
,
callback
,
architecture
,
maxLatency
,
maxIdleTim
e
,
torDirectory
);
backoff
,
torRendezvousCrypto
,
callback
,
architectur
e
,
maxLatency
,
maxIdleTime
,
torDirectory
);
}
@Override
...
...
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPlugin.java
View file @
1ec3fa3a
...
...
@@ -25,12 +25,13 @@ class UnixTorPlugin extends JavaTorPlugin {
Clock
clock
,
ResourceProvider
resourceProvider
,
CircumventionProvider
circumventionProvider
,
BatteryManager
batteryManager
,
Backoff
backoff
,
TorRendezvousCrypto
torRendezvousCrypto
,
PluginCallback
callback
,
String
architecture
,
int
maxLatency
,
int
maxIdleTime
,
File
torDirectory
)
{
super
(
ioExecutor
,
networkManager
,
locationUtils
,
torSocketFactory
,
clock
,
resourceProvider
,
circumventionProvider
,
batteryManager
,
backoff
,
callback
,
architecture
,
maxLatency
,
maxIdleTim
e
,
torDirectory
);
backoff
,
torRendezvousCrypto
,
callback
,
architectur
e
,
maxLatency
,
maxIdleTime
,
torDirectory
);
}
@Override
...
...
bramble-java/src/main/java/org/briarproject/bramble/plugin/tor/UnixTorPluginFactory.java
View file @
1ec3fa3a
...
...
@@ -96,10 +96,12 @@ public class UnixTorPluginFactory implements DuplexPluginFactory {
Backoff
backoff
=
backoffFactory
.
createBackoff
(
MIN_POLLING_INTERVAL
,
MAX_POLLING_INTERVAL
,
BACKOFF_BASE
);
TorRendezvousCrypto
torRendezvousCrypto
=
new
TorRendezvousCryptoImpl
();
UnixTorPlugin
plugin
=
new
UnixTorPlugin
(
ioExecutor
,
networkManager
,
locationUtils
,
torSocketFactory
,
clock
,
resourceProvider
,
circumventionProvider
,
batteryManager
,
backoff
,
callback
,
architecture
,
MAX_LATENCY
,
MAX_IDLE_TIME
,
torDirectory
);
circumventionProvider
,
batteryManager
,
backoff
,
torRendezvousCrypto
,
callback
,
architecture
,
MAX_LATENCY
,
MAX_IDLE_TIME
,
torDirectory
);
eventBus
.
addListener
(
plugin
);
return
plugin
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment