diff --git a/.classpath b/.classpath
index 82469dc51..fadbb9f4b 100644
--- a/.classpath
+++ b/.classpath
@@ -4,8 +4,7 @@
-
-
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ec268b6b..9ea7c7e0d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,16 @@
### Upcoming release (2014-06-??)
+* added "local repo" support to host an FDroid repo on the device itself, with
+ full signed repo support, icons, and optional HTTPS://
+
+* "Setup Local Repo" UI for setting up the local repo based on choosing from
+ any installed app on the device
+
+* find local repos on the same network using Bonjour/mDNS
+
+* directly send installed apps to other devices via Bluetooth and Android Beam
+ (NFC+Bluetooth), also compatible with Samsung/HTC S-Beam
+
* Fix some crashes
* Translation updates
diff --git a/extern/ant-src/fi b/extern/symlinks-for-ant-and-eclipse/fi
similarity index 100%
rename from extern/ant-src/fi
rename to extern/symlinks-for-ant-and-eclipse/fi
diff --git a/extern/ant-src/javax b/extern/symlinks-for-ant-and-eclipse/javax
similarity index 100%
rename from extern/ant-src/javax
rename to extern/symlinks-for-ant-and-eclipse/javax
diff --git a/extern/symlinks-for-ant-and-eclipse/kellinwood b/extern/symlinks-for-ant-and-eclipse/kellinwood
new file mode 120000
index 000000000..443258ed6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/kellinwood
@@ -0,0 +1 @@
+../zipsigner/src/main/java/kellinwood
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ApplicationSpecificParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ApplicationSpecificParser.java
new file mode 120000
index 000000000..b80518bc6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ApplicationSpecificParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1ApplicationSpecificParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Boolean.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Boolean.java
new file mode 120000
index 000000000..46914a84a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Boolean.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Boolean.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Choice.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Choice.java
new file mode 120000
index 000000000..aaa8f3e00
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Choice.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Choice.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encodable.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encodable.java
new file mode 120000
index 000000000..3cebeff2b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encodable.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Encodable.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1EncodableVector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1EncodableVector.java
new file mode 120000
index 000000000..939efb240
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1EncodableVector.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1EncodableVector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encoding.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encoding.java
new file mode 120000
index 000000000..a3938539c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Encoding.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Encoding.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Enumerated.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Enumerated.java
new file mode 120000
index 000000000..480bac8c7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Enumerated.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Enumerated.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Exception.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Exception.java
new file mode 120000
index 000000000..4779396b3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Exception.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Exception.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1GeneralizedTime.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1GeneralizedTime.java
new file mode 120000
index 000000000..5b9ed8d6b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1GeneralizedTime.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1GeneralizedTime.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Generator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Generator.java
new file mode 120000
index 000000000..996ceffe5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Generator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Generator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1InputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1InputStream.java
new file mode 120000
index 000000000..712454dd8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1InputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1InputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Integer.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Integer.java
new file mode 120000
index 000000000..fef57beaf
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Integer.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Integer.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Null.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Null.java
new file mode 120000
index 000000000..692f63865
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Null.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Null.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Object.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Object.java
new file mode 120000
index 000000000..0af6647ae
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Object.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Object.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ObjectIdentifier.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ObjectIdentifier.java
new file mode 120000
index 000000000..5fc25c364
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ObjectIdentifier.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1ObjectIdentifier.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetString.java
new file mode 120000
index 000000000..29bae24ee
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1OctetString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetStringParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetStringParser.java
new file mode 120000
index 000000000..9db1fdb50
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OctetStringParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1OctetStringParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OutputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OutputStream.java
new file mode 120000
index 000000000..9a55b266d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1OutputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1OutputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ParsingException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ParsingException.java
new file mode 120000
index 000000000..0ac9d7087
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1ParsingException.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1ParsingException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Primitive.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Primitive.java
new file mode 120000
index 000000000..7acb00ec6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Primitive.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Primitive.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Sequence.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Sequence.java
new file mode 120000
index 000000000..89629db8d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Sequence.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Sequence.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SequenceParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SequenceParser.java
new file mode 120000
index 000000000..368dda3b1
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SequenceParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1SequenceParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Set.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Set.java
new file mode 120000
index 000000000..0237569a5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1Set.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1Set.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SetParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SetParser.java
new file mode 120000
index 000000000..8044c7a7f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1SetParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1SetParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1StreamParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1StreamParser.java
new file mode 120000
index 000000000..8aef586b8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1StreamParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1StreamParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1String.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1String.java
new file mode 120000
index 000000000..06858eb6b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1String.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1String.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObject.java
new file mode 120000
index 000000000..28eb29271
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObject.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1TaggedObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObjectParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObjectParser.java
new file mode 120000
index 000000000..d7ce7a8f5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1TaggedObjectParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1TaggedObjectParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1UTCTime.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1UTCTime.java
new file mode 120000
index 000000000..d311500f1
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ASN1UTCTime.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ASN1UTCTime.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecific.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecific.java
new file mode 120000
index 000000000..5231df9f3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecific.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERApplicationSpecific.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecificParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecificParser.java
new file mode 120000
index 000000000..0429be0fb
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERApplicationSpecificParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERApplicationSpecificParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERConstructedOctetString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERConstructedOctetString.java
new file mode 120000
index 000000000..7923c43fc
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERConstructedOctetString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERConstructedOctetString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERFactory.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERFactory.java
new file mode 120000
index 000000000..d19bb6363
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERFactory.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERFactory.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERGenerator.java
new file mode 120000
index 000000000..d405e3895
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetString.java
new file mode 120000
index 000000000..557e55222
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BEROctetString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringGenerator.java
new file mode 120000
index 000000000..eba199ce6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BEROctetStringGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringParser.java
new file mode 120000
index 000000000..7f69aa3ee
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROctetStringParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BEROctetStringParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROutputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROutputStream.java
new file mode 120000
index 000000000..86cb15cf9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BEROutputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BEROutputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequence.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequence.java
new file mode 120000
index 000000000..454f99966
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequence.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERSequence.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceGenerator.java
new file mode 120000
index 000000000..e08e77993
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERSequenceGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceParser.java
new file mode 120000
index 000000000..32b0aa14c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSequenceParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERSequenceParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSet.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSet.java
new file mode 120000
index 000000000..9afc5b1e2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSet.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERSet.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSetParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSetParser.java
new file mode 120000
index 000000000..e6830715b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERSetParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERSetParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObject.java
new file mode 120000
index 000000000..4340f7661
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObject.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERTaggedObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObjectParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObjectParser.java
new file mode 120000
index 000000000..182cd1780
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTaggedObjectParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERTaggedObjectParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTags.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTags.java
new file mode 120000
index 000000000..69146a042
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/BERTags.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/BERTags.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ConstructedOctetStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ConstructedOctetStream.java
new file mode 120000
index 000000000..ff46ce1a9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ConstructedOctetStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ConstructedOctetStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERApplicationSpecific.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERApplicationSpecific.java
new file mode 120000
index 000000000..2df97223c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERApplicationSpecific.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERApplicationSpecific.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBMPString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBMPString.java
new file mode 120000
index 000000000..ade02fd1e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBMPString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERBMPString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBitString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBitString.java
new file mode 120000
index 000000000..fad6260bc
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBitString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERBitString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBoolean.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBoolean.java
new file mode 120000
index 000000000..a8cd6a3e4
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERBoolean.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERBoolean.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREncodableVector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREncodableVector.java
new file mode 120000
index 000000000..3fe35aa9e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREncodableVector.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DEREncodableVector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREnumerated.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREnumerated.java
new file mode 120000
index 000000000..371e110db
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEREnumerated.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DEREnumerated.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternal.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternal.java
new file mode 120000
index 000000000..ae0481a39
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternal.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERExternal.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternalParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternalParser.java
new file mode 120000
index 000000000..737118bac
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERExternalParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERExternalParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERFactory.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERFactory.java
new file mode 120000
index 000000000..c99b65378
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERFactory.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERFactory.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralString.java
new file mode 120000
index 000000000..1e875296c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERGeneralString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralizedTime.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralizedTime.java
new file mode 120000
index 000000000..bcdffffdd
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGeneralizedTime.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERGeneralizedTime.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGenerator.java
new file mode 120000
index 000000000..c9c975cb1
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERIA5String.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERIA5String.java
new file mode 120000
index 000000000..0c6f45042
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERIA5String.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERIA5String.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERInteger.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERInteger.java
new file mode 120000
index 000000000..33ff46a26
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERInteger.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERInteger.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNull.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNull.java
new file mode 120000
index 000000000..6234b0dc5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNull.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERNull.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNumericString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNumericString.java
new file mode 120000
index 000000000..3092bd349
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERNumericString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERNumericString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERObjectIdentifier.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERObjectIdentifier.java
new file mode 120000
index 000000000..4b29a96ad
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERObjectIdentifier.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERObjectIdentifier.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetString.java
new file mode 120000
index 000000000..3d756aad5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DEROctetString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetStringParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetStringParser.java
new file mode 120000
index 000000000..19f2419ae
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROctetStringParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DEROctetStringParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROutputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROutputStream.java
new file mode 120000
index 000000000..94d7f2e1f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DEROutputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DEROutputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERPrintableString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERPrintableString.java
new file mode 120000
index 000000000..899e20023
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERPrintableString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERPrintableString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequence.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequence.java
new file mode 120000
index 000000000..aa598d9f7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequence.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERSequence.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceGenerator.java
new file mode 120000
index 000000000..97ecf9512
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERSequenceGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceParser.java
new file mode 120000
index 000000000..057ddcb58
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSequenceParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERSequenceParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSet.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSet.java
new file mode 120000
index 000000000..f3c1436b2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSet.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERSet.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSetParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSetParser.java
new file mode 120000
index 000000000..f0ea0277d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERSetParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERSetParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61String.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61String.java
new file mode 120000
index 000000000..70e1b866a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61String.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERT61String.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61UTF8String.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61UTF8String.java
new file mode 120000
index 000000000..d764d2ea3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERT61UTF8String.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERT61UTF8String.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTaggedObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTaggedObject.java
new file mode 120000
index 000000000..644bc4527
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTaggedObject.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERTaggedObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTags.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTags.java
new file mode 120000
index 000000000..6d1f73ac7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERTags.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERTags.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTCTime.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTCTime.java
new file mode 120000
index 000000000..6b2237a23
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTCTime.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERUTCTime.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTF8String.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTF8String.java
new file mode 120000
index 000000000..9238fbf55
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUTF8String.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERUTF8String.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUniversalString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUniversalString.java
new file mode 120000
index 000000000..fa8c01e81
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERUniversalString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERUniversalString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERVisibleString.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERVisibleString.java
new file mode 120000
index 000000000..262336fd8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DERVisibleString.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DERVisibleString.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLOutputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLOutputStream.java
new file mode 120000
index 000000000..2f25558c2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLOutputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DLOutputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSequence.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSequence.java
new file mode 120000
index 000000000..3df51a2d7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSequence.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DLSequence.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSet.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSet.java
new file mode 120000
index 000000000..a49f1e9a0
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLSet.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DLSet.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLTaggedObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLTaggedObject.java
new file mode 120000
index 000000000..0eacf6481
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DLTaggedObject.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DLTaggedObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DefiniteLengthInputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DefiniteLengthInputStream.java
new file mode 120000
index 000000000..5fab3db87
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/DefiniteLengthInputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/DefiniteLengthInputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/InMemoryRepresentable.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/InMemoryRepresentable.java
new file mode 120000
index 000000000..bd194ba50
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/InMemoryRepresentable.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/InMemoryRepresentable.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/IndefiniteLengthInputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/IndefiniteLengthInputStream.java
new file mode 120000
index 000000000..beb53b6d3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/IndefiniteLengthInputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/IndefiniteLengthInputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyConstructionEnumeration.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyConstructionEnumeration.java
new file mode 120000
index 000000000..fbfe9a040
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyConstructionEnumeration.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/LazyConstructionEnumeration.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyEncodedSequence.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyEncodedSequence.java
new file mode 120000
index 000000000..8f8278e82
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LazyEncodedSequence.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/LazyEncodedSequence.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LimitedInputStream.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LimitedInputStream.java
new file mode 120000
index 000000000..4bc579862
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/LimitedInputStream.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/LimitedInputStream.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/OIDTokenizer.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/OIDTokenizer.java
new file mode 120000
index 000000000..d317d1ada
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/OIDTokenizer.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/OIDTokenizer.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/StreamUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/StreamUtil.java
new file mode 120000
index 000000000..c176f3aef
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/StreamUtil.java
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/StreamUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/bc b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/bc
new file mode 120000
index 000000000..86f58bd50
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/bc
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/bc
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cmp b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cmp
new file mode 120000
index 000000000..92373c910
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cmp
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/cmp
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cms b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cms
new file mode 120000
index 000000000..ee4340bfa
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cms
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/cms
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/crmf b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/crmf
new file mode 120000
index 000000000..94044c39d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/crmf
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/crmf
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cryptopro b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cryptopro
new file mode 120000
index 000000000..082d08ab3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/cryptopro
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/cryptopro
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/eac b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/eac
new file mode 120000
index 000000000..e6d18116d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/eac
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/eac
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/gnu b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/gnu
new file mode 120000
index 000000000..22ba3d2e6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/gnu
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/gnu
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/iana b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/iana
new file mode 120000
index 000000000..285b1090a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/iana
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/iana
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/isismtt b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/isismtt
new file mode 120000
index 000000000..4b6af9ceb
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/isismtt
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/isismtt
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/kisa b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/kisa
new file mode 120000
index 000000000..53c8b0126
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/kisa
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/kisa
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/misc b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/misc
new file mode 120000
index 000000000..55d904f6b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/misc
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/misc
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/mozilla b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/mozilla
new file mode 120000
index 000000000..07c6741b5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/mozilla
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/mozilla
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/nist b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/nist
new file mode 120000
index 000000000..4a44b3191
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/nist
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/nist
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ntt b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ntt
new file mode 120000
index 000000000..e4867a9f5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ntt
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ntt
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ocsp b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ocsp
new file mode 120000
index 000000000..a815c35d9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ocsp
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ocsp
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/oiw b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/oiw
new file mode 120000
index 000000000..416ef949f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/oiw
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/oiw
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/pkcs b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/pkcs
new file mode 120000
index 000000000..9e681aec3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/pkcs
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/pkcs
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/sec b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/sec
new file mode 120000
index 000000000..c40020273
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/sec
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/sec
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/teletrust b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/teletrust
new file mode 120000
index 000000000..2097d01a8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/teletrust
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/teletrust
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/tsp b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/tsp
new file mode 120000
index 000000000..0220060a7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/tsp
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/tsp
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ua b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ua
new file mode 120000
index 000000000..58e986944
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/ua
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/ua
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/util b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/util
new file mode 120000
index 000000000..7bc3bb4e1
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/util
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/util
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x500 b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x500
new file mode 120000
index 000000000..c0a09c240
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x500
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/x500
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x509 b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x509
new file mode 120000
index 000000000..e79663739
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x509
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/x509
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x9 b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x9
new file mode 120000
index 000000000..e80d46d95
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/asn1/x9
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/asn1/x9
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cert b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cert
new file mode 120000
index 000000000..72ff90805
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cert
@@ -0,0 +1 @@
+../../../spongycastle/pkix/src/main/java/org/spongycastle/cert
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cms b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cms
new file mode 120000
index 000000000..d5222f6c5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/cms
@@ -0,0 +1 @@
+../../../spongycastle/pkix/src/main/java/org/spongycastle/cms
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/crypto b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/crypto
new file mode 120000
index 000000000..73c1163b2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/crypto
@@ -0,0 +1 @@
+../../../spongycastle/core/src/main/java/org/spongycastle/crypto
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/i18n b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/i18n
new file mode 120000
index 000000000..af504fb4a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/i18n
@@ -0,0 +1 @@
+../../../spongycastle/core/src/main/java/org/spongycastle/i18n
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jcajce b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jcajce
new file mode 120000
index 000000000..aeb7c4c59
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jcajce
@@ -0,0 +1 @@
+../../../spongycastle/prov/src/main/java/org/spongycastle/jcajce
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECGOST3410NamedCurveTable.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECGOST3410NamedCurveTable.java
new file mode 120000
index 000000000..85a167493
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECGOST3410NamedCurveTable.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/ECGOST3410NamedCurveTable.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECKeyUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECKeyUtil.java
new file mode 120000
index 000000000..247a8b7a5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECKeyUtil.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/ECKeyUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECNamedCurveTable.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECNamedCurveTable.java
new file mode 120000
index 000000000..1c70aaf03
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECNamedCurveTable.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/ECNamedCurveTable.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECPointUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECPointUtil.java
new file mode 120000
index 000000000..4ee1c0b51
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/ECPointUtil.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/ECPointUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/MultiCertStoreParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/MultiCertStoreParameters.java
new file mode 120000
index 000000000..82e03628a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/MultiCertStoreParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/MultiCertStoreParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS10CertificationRequest.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS10CertificationRequest.java
new file mode 120000
index 000000000..595c7b9fa
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS10CertificationRequest.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/PKCS10CertificationRequest.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS12Util.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS12Util.java
new file mode 120000
index 000000000..1c65f4081
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PKCS12Util.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/PKCS12Util.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PrincipalUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PrincipalUtil.java
new file mode 120000
index 000000000..a6352af2e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/PrincipalUtil.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/PrincipalUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509KeyUsage.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509KeyUsage.java
new file mode 120000
index 000000000..6f7a30366
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509KeyUsage.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/X509KeyUsage.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509LDAPCertStoreParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509LDAPCertStoreParameters.java
new file mode 120000
index 000000000..69b78a6bc
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509LDAPCertStoreParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/X509LDAPCertStoreParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509Principal.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509Principal.java
new file mode 120000
index 000000000..9e93b34ee
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/X509Principal.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/X509Principal.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/exception b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/exception
new file mode 120000
index 000000000..18723f8d3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/exception
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/exception
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/interfaces b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/interfaces
new file mode 120000
index 000000000..2e12d5422
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/interfaces
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/interfaces
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/AnnotatedException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/AnnotatedException.java
new file mode 120000
index 000000000..a17cc1a5b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/AnnotatedException.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/AnnotatedException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProvider.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProvider.java
new file mode 120000
index 000000000..19b9993ff
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProvider.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/BouncyCastleProvider.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProviderConfiguration.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProviderConfiguration.java
new file mode 120000
index 000000000..6186311d7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BouncyCastleProviderConfiguration.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/BouncyCastleProviderConfiguration.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenJCEBlockCipher.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenJCEBlockCipher.java
new file mode 120000
index 000000000..80ab322c4
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenJCEBlockCipher.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/BrokenJCEBlockCipher.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenKDF2BytesGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenKDF2BytesGenerator.java
new file mode 120000
index 000000000..ed461e38a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenKDF2BytesGenerator.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/BrokenKDF2BytesGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenPBE.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenPBE.java
new file mode 120000
index 000000000..dedf6d02d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/BrokenPBE.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/BrokenPBE.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertPathValidatorUtilities.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertPathValidatorUtilities.java
new file mode 120000
index 000000000..0b15e047f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertPathValidatorUtilities.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/CertPathValidatorUtilities.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStatus.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStatus.java
new file mode 120000
index 000000000..0f700b517
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStatus.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/CertStatus.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStoreCollectionSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStoreCollectionSpi.java
new file mode 120000
index 000000000..d57bc96c2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/CertStoreCollectionSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/CertStoreCollectionSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/DHUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/DHUtil.java
new file mode 120000
index 000000000..0a5db15e8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/DHUtil.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/DHUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ExtCRLException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ExtCRLException.java
new file mode 120000
index 000000000..9e8263158
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ExtCRLException.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/ExtCRLException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPrivateKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPrivateKey.java
new file mode 120000
index 000000000..03684ee5e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPrivateKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEDHPrivateKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPublicKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPublicKey.java
new file mode 120000
index 000000000..9803a0249
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEDHPublicKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEDHPublicKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPrivateKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPrivateKey.java
new file mode 120000
index 000000000..7e16440c1
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPrivateKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEECPrivateKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPublicKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPublicKey.java
new file mode 120000
index 000000000..90f4a70c7
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEECPublicKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEECPublicKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPrivateKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPrivateKey.java
new file mode 120000
index 000000000..84866b855
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPrivateKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEElGamalPrivateKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPublicKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPublicKey.java
new file mode 120000
index 000000000..f7291294d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEElGamalPublicKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEElGamalPublicKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateCrtKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateCrtKey.java
new file mode 120000
index 000000000..ebebdb693
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateCrtKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCERSAPrivateCrtKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateKey.java
new file mode 120000
index 000000000..06ae733fc
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPrivateKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCERSAPrivateKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPublicKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPublicKey.java
new file mode 120000
index 000000000..fe29ccd3d
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCERSAPublicKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCERSAPublicKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEStreamCipher.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEStreamCipher.java
new file mode 120000
index 000000000..a72744fd9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JCEStreamCipher.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JCEStreamCipher.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPrivateKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPrivateKey.java
new file mode 120000
index 000000000..9c81bd9d6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPrivateKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JDKDSAPrivateKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPublicKey.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPublicKey.java
new file mode 120000
index 000000000..d7f2b4792
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKDSAPublicKey.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JDKDSAPublicKey.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKPKCS12StoreParameter.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKPKCS12StoreParameter.java
new file mode 120000
index 000000000..75e6cf659
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/JDKPKCS12StoreParameter.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/JDKPKCS12StoreParameter.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/MultiCertStoreSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/MultiCertStoreSpi.java
new file mode 120000
index 000000000..e37877c27
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/MultiCertStoreSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/MultiCertStoreSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PEMUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PEMUtil.java
new file mode 120000
index 000000000..a8d3b6b50
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PEMUtil.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PEMUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathBuilderSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathBuilderSpi.java
new file mode 120000
index 000000000..d25de9aa8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathBuilderSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXAttrCertPathBuilderSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathValidatorSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathValidatorSpi.java
new file mode 120000
index 000000000..bcf9c6677
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXAttrCertPathValidatorSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXAttrCertPathValidatorSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCRLUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCRLUtil.java
new file mode 120000
index 000000000..b15fdd33e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCRLUtil.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXCRLUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathBuilderSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathBuilderSpi.java
new file mode 120000
index 000000000..389434741
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathBuilderSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXCertPathBuilderSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathValidatorSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathValidatorSpi.java
new file mode 120000
index 000000000..dbab12bb9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXCertPathValidatorSpi.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXCertPathValidatorSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidator.java
new file mode 120000
index 000000000..870e97815
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidator.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXNameConstraintValidator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidatorException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidatorException.java
new file mode 120000
index 000000000..b2b022602
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXNameConstraintValidatorException.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXNameConstraintValidatorException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXPolicyNode.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXPolicyNode.java
new file mode 120000
index 000000000..f135d82f9
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/PKIXPolicyNode.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/PKIXPolicyNode.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3280CertPathUtilities.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3280CertPathUtilities.java
new file mode 120000
index 000000000..b1545f960
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3280CertPathUtilities.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/RFC3280CertPathUtilities.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3281CertPathUtilities.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3281CertPathUtilities.java
new file mode 120000
index 000000000..9bf137403
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/RFC3281CertPathUtilities.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/RFC3281CertPathUtilities.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ReasonsMask.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ReasonsMask.java
new file mode 120000
index 000000000..69ea8ebf5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/ReasonsMask.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/ReasonsMask.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509AttrCertParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509AttrCertParser.java
new file mode 120000
index 000000000..af1537def
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509AttrCertParser.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509AttrCertParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLEntryObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLEntryObject.java
new file mode 120000
index 000000000..e5b5192ec
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLEntryObject.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CRLEntryObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLObject.java
new file mode 120000
index 000000000..9f6d01eb2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLObject.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CRLObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLParser.java
new file mode 120000
index 000000000..9ae15edbe
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CRLParser.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CRLParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertPairParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertPairParser.java
new file mode 120000
index 000000000..b5b0129a3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertPairParser.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CertPairParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertParser.java
new file mode 120000
index 000000000..98fed98e6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertParser.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CertParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertificateObject.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertificateObject.java
new file mode 120000
index 000000000..21e2f213c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509CertificateObject.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509CertificateObject.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509SignatureUtil.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509SignatureUtil.java
new file mode 120000
index 000000000..b89b84852
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509SignatureUtil.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509SignatureUtil.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreAttrCertCollection.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreAttrCertCollection.java
new file mode 120000
index 000000000..f7b93deab
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreAttrCertCollection.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509StoreAttrCertCollection.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCRLCollection.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCRLCollection.java
new file mode 120000
index 000000000..c3b1afe9f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCRLCollection.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509StoreCRLCollection.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertCollection.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertCollection.java
new file mode 120000
index 000000000..66ee054e2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertCollection.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509StoreCertCollection.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertPairCollection.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertPairCollection.java
new file mode 120000
index 000000000..3821264c3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/provider/X509StoreCertPairCollection.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/provider/X509StoreCertPairCollection.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/spec b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/spec
new file mode 120000
index 000000000..a57149cc8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/jce/spec
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/jce/spec
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/math b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/math
new file mode 120000
index 000000000..879523869
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/math
@@ -0,0 +1 @@
+../../../spongycastle/core/src/main/java/org/spongycastle/math
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/mozilla b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/mozilla
new file mode 120000
index 000000000..023e32f6e
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/mozilla
@@ -0,0 +1 @@
+../../../spongycastle/pkix/src/main/java/org/spongycastle/mozilla
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/operator b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/operator
new file mode 120000
index 000000000..7307766ea
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/operator
@@ -0,0 +1 @@
+../../../spongycastle/pkix/src/main/java/org/spongycastle/operator
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pkcs b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pkcs
new file mode 120000
index 000000000..20235a46a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pkcs
@@ -0,0 +1 @@
+../../../spongycastle/pkix/src/main/java/org/spongycastle/pkcs
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/asn1 b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/asn1
new file mode 120000
index 000000000..882f32de4
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/asn1
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/pqc/asn1
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/crypto b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/crypto
new file mode 120000
index 000000000..f68dc7d37
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/crypto
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/pqc/crypto
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/jcajce b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/jcajce
new file mode 120000
index 000000000..f7ee4db36
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/jcajce
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/pqc/jcajce
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/math b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/math
new file mode 120000
index 000000000..c54bddb65
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/pqc/math
@@ -0,0 +1 @@
+../../../../spongycastle/core/src/main/java/org/spongycastle/pqc/math
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/util b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/util
new file mode 120000
index 000000000..26566a804
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/util
@@ -0,0 +1 @@
+../../../spongycastle/core/src/main/java/org/spongycastle/util
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateHolder.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateHolder.java
new file mode 120000
index 000000000..449cbc84c
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateHolder.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/AttributeCertificateHolder.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateIssuer.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateIssuer.java
new file mode 120000
index 000000000..e95b91120
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/AttributeCertificateIssuer.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/AttributeCertificateIssuer.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/CertPathReviewerException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/CertPathReviewerException.java
new file mode 120000
index 000000000..328857ece
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/CertPathReviewerException.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/CertPathReviewerException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtCertificateEncodingException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtCertificateEncodingException.java
new file mode 120000
index 000000000..a4ebd94d6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtCertificateEncodingException.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/ExtCertificateEncodingException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXBuilderParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXBuilderParameters.java
new file mode 120000
index 000000000..91138abcd
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXBuilderParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/ExtendedPKIXBuilderParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXParameters.java
new file mode 120000
index 000000000..8e8b5d3a5
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/ExtendedPKIXParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/ExtendedPKIXParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchParserException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchParserException.java
new file mode 120000
index 000000000..5f1d75cc8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchParserException.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/NoSuchParserException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchStoreException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchStoreException.java
new file mode 120000
index 000000000..c30100a98
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/NoSuchStoreException.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/NoSuchStoreException.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXAttrCertChecker.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXAttrCertChecker.java
new file mode 120000
index 000000000..f756fae9f
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXAttrCertChecker.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/PKIXAttrCertChecker.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXCertPathReviewer.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXCertPathReviewer.java
new file mode 120000
index 000000000..4dde00db4
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/PKIXCertPathReviewer.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/PKIXCertPathReviewer.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Attribute.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Attribute.java
new file mode 120000
index 000000000..00d7d88b2
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Attribute.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509Attribute.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertStoreSelector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertStoreSelector.java
new file mode 120000
index 000000000..2325963d3
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertStoreSelector.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509AttributeCertStoreSelector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertificate.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertificate.java
new file mode 120000
index 000000000..d7c7d4487
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509AttributeCertificate.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509AttributeCertificate.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CRLStoreSelector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CRLStoreSelector.java
new file mode 120000
index 000000000..f89602f11
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CRLStoreSelector.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509CRLStoreSelector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertPairStoreSelector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertPairStoreSelector.java
new file mode 120000
index 000000000..2ab1dc1f8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertPairStoreSelector.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509CertPairStoreSelector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertStoreSelector.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertStoreSelector.java
new file mode 120000
index 000000000..32e539801
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertStoreSelector.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509CertStoreSelector.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertificatePair.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertificatePair.java
new file mode 120000
index 000000000..f77f16468
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CertificatePair.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509CertificatePair.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CollectionStoreParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CollectionStoreParameters.java
new file mode 120000
index 000000000..06f1e6e1b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509CollectionStoreParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509CollectionStoreParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Store.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Store.java
new file mode 120000
index 000000000..c6b2546ec
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Store.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509Store.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreParameters.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreParameters.java
new file mode 120000
index 000000000..d88eba314
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreParameters.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509StoreParameters.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreSpi.java
new file mode 120000
index 000000000..bec53a9d6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StoreSpi.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509StoreSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParser.java
new file mode 120000
index 000000000..6434dae4a
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParser.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509StreamParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParserSpi.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParserSpi.java
new file mode 120000
index 000000000..9826a7183
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509StreamParserSpi.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509StreamParserSpi.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Util.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Util.java
new file mode 120000
index 000000000..e5ce6324b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509Util.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509Util.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V1CertificateGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V1CertificateGenerator.java
new file mode 120000
index 000000000..0f9c09f01
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V1CertificateGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509V1CertificateGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificate.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificate.java
new file mode 120000
index 000000000..4189c2d78
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificate.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509V2AttributeCertificate.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificateGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificateGenerator.java
new file mode 120000
index 000000000..1179a0fd8
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2AttributeCertificateGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509V2AttributeCertificateGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2CRLGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2CRLGenerator.java
new file mode 120000
index 000000000..494902bd6
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V2CRLGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509V2CRLGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V3CertificateGenerator.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V3CertificateGenerator.java
new file mode 120000
index 000000000..a53b0b38b
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/X509V3CertificateGenerator.java
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/X509V3CertificateGenerator.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/extension b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/extension
new file mode 120000
index 000000000..493af5f83
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/extension
@@ -0,0 +1 @@
+../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/extension
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParser.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParser.java
new file mode 120000
index 000000000..c92a26626
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParser.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/util/StreamParser.java
\ No newline at end of file
diff --git a/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParsingException.java b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParsingException.java
new file mode 120000
index 000000000..2f2fa9862
--- /dev/null
+++ b/extern/symlinks-for-ant-and-eclipse/org/spongycastle/x509/util/StreamParsingException.java
@@ -0,0 +1 @@
+../../../../../spongycastle/prov/src/main/java/org/spongycastle/x509/util/StreamParsingException.java
\ No newline at end of file
diff --git a/project.properties b/project.properties
index e12ad6cf0..4a6e95cc5 100644
--- a/project.properties
+++ b/project.properties
@@ -8,5 +8,5 @@ android.library.reference.3=extern/AndroidPinning
android.library.reference.4=extern/libsuperuser/libsuperuser
android.library.reference.5=extern/zxing-core
-# For java libraries, place symlinks in extern/ant-src
-source.dir=src;extern/ant-src
+# For java libraries, place symlinks in extern/symlinks-for-ant-and-eclipse/
+source.dir=src;extern/symlinks-for-ant-and-eclipse
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 179619796..f523a3cb5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -39,6 +39,9 @@
Do not advertise your local repo.
Name of your Local Repo
The advertised title of your local repo: %s
+ Use Private Connection
+ Use encrypted HTTPS:// connection for local repo
+ Use insecure HTTP:// connection for local repo
Search Results
App Details
@@ -174,7 +177,8 @@
Update Repo
Deleting current repo…
Adding %s to repo…
- Writing raw index file (index.xml)…
+ Writing signed index file (index.jar)…
+ Failed to create the repo index!
Linking APKs into the repo…
Copying app icons into the repo…
Finished updating local repo
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index fce6f7cb3..9c4f3e65b 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -51,6 +51,10 @@
+
selectedApps = null; // init in SelectLocalAppsFragment
private static Messenger localRepoServiceMessenger = null;
@@ -125,8 +106,6 @@ public class FDroidApp extends Application {
// Apply the Google PRNG fixes to properly seed SecureRandom
PRNGFixes.apply();
- localRepo = new LocalRepoManager(getApplicationContext());
-
// Check that the installed app cache hasn't gotten out of sync somehow.
// e.g. if we crashed/ran out of battery half way through responding
// to a package installed intent. It doesn't really matter where
diff --git a/src/org/fdroid/fdroid/Preferences.java b/src/org/fdroid/fdroid/Preferences.java
index 0355395f9..ca6d750fd 100644
--- a/src/org/fdroid/fdroid/Preferences.java
+++ b/src/org/fdroid/fdroid/Preferences.java
@@ -46,6 +46,7 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
public static final String PREF_SYSTEM_INSTALLER = "systemInstaller";
public static final String PREF_LOCAL_REPO_BONJOUR = "localRepoBonjour";
public static final String PREF_LOCAL_REPO_NAME = "localRepoName";
+ public static final String PREF_LOCAL_REPO_HTTPS = "localRepoHttps";
private static final boolean DEFAULT_COMPACT_LAYOUT = false;
private static final boolean DEFAULT_ROOTED = true;
@@ -53,6 +54,7 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
private static final boolean DEFAULT_ROOT_INSTALLER = false;
private static final boolean DEFAULT_SYSTEM_INSTALLER = false;
private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true;
+ private static final boolean DEFAULT_LOCAL_REPO_HTTPS = false;
private boolean compactLayout = DEFAULT_COMPACT_LAYOUT;
private boolean filterAppsRequiringRoot = DEFAULT_ROOTED;
@@ -64,6 +66,7 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
private List updateHistoryListeners = new ArrayList();
private List localRepoBonjourListeners = new ArrayList();
private List localRepoNameListeners = new ArrayList();
+ private List localRepoHttpsListeners = new ArrayList();
private boolean isInitialized(String key) {
return initialized.containsKey(key) && initialized.get(key);
@@ -89,6 +92,10 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
return preferences.getBoolean(PREF_LOCAL_REPO_BONJOUR, DEFAULT_LOCAL_REPO_BONJOUR);
}
+ public boolean isLocalRepoHttpsEnabled() {
+ return preferences.getBoolean(PREF_LOCAL_REPO_HTTPS, DEFAULT_LOCAL_REPO_HTTPS);
+ }
+
private String getDefaultLocalRepoName() {
return (Build.BRAND + " " + Build.MODEL + String.valueOf(new Random().nextInt(9999)))
.replaceAll(" ", "-");
@@ -178,6 +185,10 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
for ( ChangeListener listener : localRepoNameListeners ) {
listener.onPreferenceChange();
}
+ } else if (key.equals(PREF_LOCAL_REPO_HTTPS)) {
+ for ( ChangeListener listener : localRepoHttpsListeners ) {
+ listener.onPreferenceChange();
+ }
}
}
@@ -205,6 +216,14 @@ public class Preferences implements SharedPreferences.OnSharedPreferenceChangeLi
localRepoNameListeners.remove(listener);
}
+ public void registerLocalRepoHttpsListeners(ChangeListener listener) {
+ localRepoHttpsListeners.add(listener);
+ }
+
+ public void unregisterLocalRepoHttpsListeners(ChangeListener listener) {
+ localRepoHttpsListeners.remove(listener);
+ }
+
public static interface ChangeListener {
public void onPreferenceChange();
}
diff --git a/src/org/fdroid/fdroid/PreferencesActivity.java b/src/org/fdroid/fdroid/PreferencesActivity.java
index 15e532e4a..9bf66d4b0 100644
--- a/src/org/fdroid/fdroid/PreferencesActivity.java
+++ b/src/org/fdroid/fdroid/PreferencesActivity.java
@@ -56,6 +56,7 @@ public class PreferencesActivity extends PreferenceActivity implements
Preferences.PREF_IGN_TOUCH,
Preferences.PREF_LOCAL_REPO_BONJOUR,
Preferences.PREF_LOCAL_REPO_NAME,
+ Preferences.PREF_LOCAL_REPO_HTTPS,
Preferences.PREF_CACHE_APK,
Preferences.PREF_EXPERT,
Preferences.PREF_ROOT_INSTALLER,
@@ -154,6 +155,10 @@ public class PreferencesActivity extends PreferenceActivity implements
} else if (key.equals(Preferences.PREF_LOCAL_REPO_NAME)) {
textSummary(key, R.string.local_repo_name_summary);
+ } else if (key.equals(Preferences.PREF_LOCAL_REPO_HTTPS)) {
+ onoffSummary(key, R.string.local_repo_https_on,
+ R.string.local_repo_https_off);
+
} else if (key.equals(Preferences.PREF_CACHE_APK)) {
onoffSummary(key, R.string.cache_downloaded_on,
R.string.cache_downloaded_off);
diff --git a/src/org/fdroid/fdroid/localrepo/LocalRepoKeyStore.java b/src/org/fdroid/fdroid/localrepo/LocalRepoKeyStore.java
new file mode 100644
index 000000000..b48a684e0
--- /dev/null
+++ b/src/org/fdroid/fdroid/localrepo/LocalRepoKeyStore.java
@@ -0,0 +1,354 @@
+
+package org.fdroid.fdroid.localrepo;
+
+import android.content.Context;
+import android.util.Log;
+
+import org.fdroid.fdroid.FDroidApp;
+import org.spongycastle.asn1.ASN1Sequence;
+import org.spongycastle.asn1.x500.X500Name;
+import org.spongycastle.asn1.x509.*;
+import org.spongycastle.cert.X509CertificateHolder;
+import org.spongycastle.cert.X509v3CertificateBuilder;
+import org.spongycastle.cert.jcajce.JcaX509CertificateConverter;
+import org.spongycastle.operator.ContentSigner;
+import org.spongycastle.operator.OperatorCreationException;
+import org.spongycastle.operator.jcajce.JcaContentSignerBuilder;
+
+import java.io.*;
+import java.math.BigInteger;
+import java.net.Socket;
+import java.security.*;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.X509KeyManager;
+
+import kellinwood.security.zipsigner.ZipSigner;
+
+// TODO Address exception handling in a uniform way throughout
+
+public class LocalRepoKeyStore {
+ private static final String TAG = "KerplappKeyStore";
+
+ static {
+ Security.insertProviderAt(
+ new org.spongycastle.jce.provider.BouncyCastleProvider(), 1);
+ }
+
+ public static final String INDEX_CERT_ALIAS = "fdroid";
+ public static final String HTTP_CERT_ALIAS = "https";
+
+ private static final String DEFAULT_SIG_ALG = "SHA1withRSA";
+ private static final String DEFAULT_KEY_ALGO = "RSA";
+ private static final int DEFAULT_KEY_BITS = 2048;
+
+ private static final String DEFAULT_INDEX_CERT_INFO = "O=Kerplapp,OU=GuardianProject";
+
+ private static LocalRepoKeyStore localRepoKeyStore;
+ private KeyStore keyStore;
+ private KeyManager[] keyManagers;
+ private File keyStoreFile;
+
+ public static LocalRepoKeyStore get(Context context) {
+ if (localRepoKeyStore == null)
+ localRepoKeyStore = new LocalRepoKeyStore(context);
+ return localRepoKeyStore;
+ }
+
+ private LocalRepoKeyStore(Context context) {
+ try {
+ Log.d(TAG, "generating LocalRepoKeyStore instance");
+ File appKeyStoreDir = context.getDir("keystore", Context.MODE_PRIVATE);
+ this.keyStoreFile = new File(appKeyStoreDir, "kerplapp.bks");
+ this.keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+
+ // If there isn't a persisted BKS keystore on disk we need to
+ // create a new empty keystore
+ if (!keyStoreFile.exists()) {
+ // Init a new keystore with a blank passphrase
+ keyStore.load(null, "".toCharArray());
+ } else {
+ keyStore.load(new FileInputStream(keyStoreFile), "".toCharArray());
+ }
+
+ /*
+ * If the keystore we loaded doesn't have an INDEX_CERT_ALIAS entry
+ * we need to generate a new random keypair and a self signed
+ * certificate for this slot.
+ */
+ if (keyStore.getKey(INDEX_CERT_ALIAS, "".toCharArray()) == null) {
+ /*
+ * Generate a random key pair to associate with the
+ * INDEX_CERT_ALIAS certificate in the keystore. This keypair
+ * will be used for the HTTPS cert as well.
+ */
+ KeyPair rndKeys = generateRandomKeypair();
+
+ /*
+ * Generate a self signed certificate for signing the index.jar
+ * We can't generate the HTTPS certificate until we know what
+ * the IP address will be to use for the CN field.
+ */
+ X500Name subject = new X500Name(DEFAULT_INDEX_CERT_INFO);
+ Certificate indexCert = generateSelfSignedCertChain(rndKeys, subject);
+
+ addToStore(INDEX_CERT_ALIAS, rndKeys, indexCert);
+ }
+
+ /*
+ * Kerplapp uses its own KeyManager to to ensure the correct
+ * keystore alias is used for the correct purpose. With the default
+ * key manager it is not possible to specify that HTTP_CERT_ALIAS
+ * should be used for TLS and INDEX_CERT_ALIAS for signing the
+ * index.jar.
+ */
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory
+ .getInstance(KeyManagerFactory.getDefaultAlgorithm());
+
+ keyManagerFactory.init(keyStore, "".toCharArray());
+ KeyManager defaultKeyManager = keyManagerFactory.getKeyManagers()[0];
+ KeyManager wrappedKeyManager = new KerplappKeyManager(
+ (X509KeyManager) defaultKeyManager);
+ keyManagers = new KeyManager[] {
+ wrappedKeyManager
+ };
+ } catch (UnrecoverableKeyException e) {
+ e.printStackTrace();
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (CertificateException e) {
+ e.printStackTrace();
+ } catch (OperatorCreationException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void setupHTTPSCertificate() {
+ try {
+ // Get the existing private/public keypair to use for the HTTPS cert
+ KeyPair kerplappKeypair = getKerplappKeypair();
+
+ /*
+ * Once we have an IP address, that can be used as the hostname. We
+ * can generate a self signed cert with a valid CN field to stash
+ * into the keystore in a predictable place. If the IP address
+ * changes we should run this method again to stomp old
+ * HTTPS_CERT_ALIAS entries.
+ */
+ X500Name subject = new X500Name("CN=" + FDroidApp.ipAddressString);
+ Certificate indexCert = generateSelfSignedCertChain(kerplappKeypair, subject,
+ FDroidApp.ipAddressString);
+ addToStore(HTTP_CERT_ALIAS, kerplappKeypair, indexCert);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public File getKeyStoreFile() {
+ return keyStoreFile;
+ }
+
+ public KeyStore getKeyStore() {
+ return keyStore;
+ }
+
+ public KeyManager[] getKeyManagers() {
+ return keyManagers;
+ }
+
+ public void signZip(File input, File output) {
+ try {
+ ZipSigner zipSigner = new ZipSigner();
+
+ KeyStore keystore = getKeyStore();
+ X509Certificate cert = (X509Certificate) keystore.getCertificate(INDEX_CERT_ALIAS);
+
+ KeyPair kp = getKerplappKeypair();
+ PrivateKey priv = kp.getPrivate();
+
+ zipSigner.setKeys("kerplapp", cert, priv, DEFAULT_SIG_ALG, null);
+ zipSigner.signZip(input.getAbsolutePath(), output.getAbsolutePath());
+
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ } catch (UnrecoverableKeyException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (GeneralSecurityException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private KeyPair getKerplappKeypair() throws KeyStoreException, UnrecoverableKeyException,
+ NoSuchAlgorithmException {
+ /*
+ * You can't store a keypair without an associated certificate chain so,
+ * we'll use the INDEX_CERT_ALIAS as the de-facto keypair/certificate
+ * chain. This cert/key is initialized when the KerplappKeyStore is
+ * constructed for the first time and should *always* be present.
+ */
+ Key key = keyStore.getKey(INDEX_CERT_ALIAS, "".toCharArray());
+
+ if (key instanceof PrivateKey) {
+ Certificate cert = keyStore.getCertificate(INDEX_CERT_ALIAS);
+ PublicKey publicKey = cert.getPublicKey();
+ return new KeyPair(publicKey, (PrivateKey) key);
+ }
+
+ return null;
+ }
+
+ public Certificate getCertificate() {
+ try {
+ Key key = keyStore.getKey(INDEX_CERT_ALIAS, "".toCharArray());
+ if (key instanceof PrivateKey)
+ return keyStore.getCertificate(INDEX_CERT_ALIAS);
+ } catch (KeyStoreException e) {
+ e.printStackTrace();
+ } catch (UnrecoverableKeyException e) {
+ e.printStackTrace();
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private void addToStore(String alias, KeyPair kp, Certificate cert) throws KeyStoreException,
+ NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException,
+ UnrecoverableKeyException {
+ Certificate[] chain = new Certificate[] {
+ cert
+ };
+ keyStore.setKeyEntry(alias, kp.getPrivate(),
+ "".toCharArray(), chain);
+
+ keyStore.store(new FileOutputStream(keyStoreFile), "".toCharArray());
+
+ /*
+ * After adding an entry to the keystore we need to create a fresh
+ * KeyManager by reinitializing the KeyManagerFactory with the new key
+ * store content and then rewrapping the default KeyManager with our own
+ */
+ KeyManagerFactory keyManagerFactory = KeyManagerFactory
+ .getInstance(KeyManagerFactory.getDefaultAlgorithm());
+
+ keyManagerFactory.init(keyStore, "".toCharArray());
+ KeyManager defaultKeyManager = keyManagerFactory.getKeyManagers()[0];
+ KeyManager wrappedKeyManager = new KerplappKeyManager((X509KeyManager) defaultKeyManager);
+ keyManagers = new KeyManager[] {
+ wrappedKeyManager
+ };
+ }
+
+ private KeyPair generateRandomKeypair() throws NoSuchAlgorithmException {
+ KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(DEFAULT_KEY_ALGO);
+ keyPairGenerator.initialize(DEFAULT_KEY_BITS);
+ KeyPair keyPair = keyPairGenerator.generateKeyPair();
+ return keyPair;
+ }
+
+ private Certificate generateSelfSignedCertChain(KeyPair kp, X500Name subject)
+ throws CertificateException, OperatorCreationException, IOException {
+ return generateSelfSignedCertChain(kp, subject, null);
+ }
+
+ private Certificate generateSelfSignedCertChain(KeyPair kp, X500Name subject, String hostname)
+ throws CertificateException, OperatorCreationException, IOException {
+ SecureRandom rand = new SecureRandom();
+ PrivateKey privKey = kp.getPrivate();
+ PublicKey pubKey = kp.getPublic();
+ ContentSigner sigGen = new JcaContentSignerBuilder(DEFAULT_SIG_ALG).build(privKey);
+
+ SubjectPublicKeyInfo subPubKeyInfo = new SubjectPublicKeyInfo(
+ ASN1Sequence.getInstance(pubKey.getEncoded()));
+
+ Date startDate = new Date(); // now
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(startDate);
+ c.add(Calendar.YEAR, 1);
+ Date endDate = c.getTime();
+
+ X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
+ subject,
+ BigInteger.valueOf(rand.nextLong()),
+ startDate, endDate,
+ subject,
+ subPubKeyInfo);
+
+ if (hostname != null) {
+ GeneralNames subjectAltName = new GeneralNames(
+ new GeneralName(GeneralName.iPAddress, hostname));
+ v3CertGen.addExtension(X509Extension.subjectAlternativeName, false, subjectAltName);
+ }
+
+ X509CertificateHolder certHolder = v3CertGen.build(sigGen);
+ return new JcaX509CertificateConverter().getCertificate(certHolder);
+ }
+
+ /*
+ * A X509KeyManager that always returns the KerplappKeyStore.HTTP_CERT_ALIAS
+ * for it's chosen server alias. All other operations are deferred to the
+ * wrapped X509KeyManager.
+ */
+ private static class KerplappKeyManager implements X509KeyManager {
+ private final X509KeyManager wrapped;
+
+ private KerplappKeyManager(X509KeyManager wrapped) {
+ this.wrapped = wrapped;
+ }
+
+ @Override
+ public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
+ return wrapped.chooseClientAlias(keyType, issuers, socket);
+ }
+
+ @Override
+ public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) {
+ /*
+ * Always use the HTTP_CERT_ALIAS for the server alias.
+ */
+ return LocalRepoKeyStore.HTTP_CERT_ALIAS;
+ }
+
+ @Override
+ public X509Certificate[] getCertificateChain(String alias) {
+ return wrapped.getCertificateChain(alias);
+ }
+
+ @Override
+ public String[] getClientAliases(String keyType, Principal[] issuers) {
+ return wrapped.getClientAliases(keyType, issuers);
+ }
+
+ @Override
+ public PrivateKey getPrivateKey(String alias) {
+ return wrapped.getPrivateKey(alias);
+ }
+
+ @Override
+ public String[] getServerAliases(String keyType, Principal[] issuers) {
+ return wrapped.getServerAliases(keyType, issuers);
+ }
+ }
+
+}
diff --git a/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java
index 21108edd1..5060b388b 100644
--- a/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java
+++ b/src/org/fdroid/fdroid/localrepo/LocalRepoManager.java
@@ -15,10 +15,9 @@ import android.graphics.drawable.Drawable;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
+import android.widget.Toast;
-import org.fdroid.fdroid.Preferences;
-import org.fdroid.fdroid.Utils;
-import org.fdroid.fdroid.data.Apk;
+import org.fdroid.fdroid.*;
import org.fdroid.fdroid.data.App;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -28,10 +27,14 @@ import java.security.cert.CertificateEncodingException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
@@ -42,6 +45,7 @@ public class LocalRepoManager {
// For ref, official F-droid repo presently uses a maxage of 14 days
private static final String DEFAULT_REPO_MAX_AGE_DAYS = "14";
+ private final Context context;
private final PackageManager pm;
private final AssetManager assetManager;
private final SharedPreferences prefs;
@@ -53,12 +57,23 @@ public class LocalRepoManager {
private Map apps = new HashMap();
public final File xmlIndex;
+ private File xmlIndexJar = null;
+ private File xmlIndexJarUnsigned = null;
public final File webRoot;
public final File fdroidDir;
public final File repoDir;
public final File iconsDir;
- public LocalRepoManager(Context c) {
+ private static LocalRepoManager localRepoManager;
+
+ public static LocalRepoManager get(Context context) {
+ if (localRepoManager == null)
+ localRepoManager = new LocalRepoManager(context);
+ return localRepoManager;
+ }
+
+ private LocalRepoManager(Context c) {
+ context = c.getApplicationContext();
pm = c.getPackageManager();
assetManager = c.getAssets();
prefs = PreferenceManager.getDefaultSharedPreferences(c);
@@ -70,6 +85,8 @@ public class LocalRepoManager {
repoDir = new File(fdroidDir, "repo");
iconsDir = new File(repoDir, "icons");
xmlIndex = new File(repoDir, "index.xml");
+ xmlIndexJar = new File(repoDir, "index.jar");
+ xmlIndexJarUnsigned = new File(repoDir, "index.unsigned.jar");
if (!fdroidDir.exists())
if (!fdroidDir.mkdir())
@@ -260,7 +277,7 @@ public class LocalRepoManager {
// TODO this needs to be ported to < android-8
@TargetApi(8)
- public void writeIndexXML() throws Exception {
+ private void writeIndexXML() throws TransformerException, ParserConfigurationException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
@@ -278,9 +295,9 @@ public class LocalRepoManager {
repo.setAttribute("icon", "blah.png");
repo.setAttribute("maxage", String.valueOf(repoMaxAge));
repo.setAttribute("name", repoName + " on " + ipAddressString);
+ repo.setAttribute("pubkey", Hasher.hex(LocalRepoKeyStore.get(context).getCertificate()));
long timestamp = System.currentTimeMillis() / 1000L;
repo.setAttribute("timestamp", String.valueOf(timestamp));
- repo.setAttribute("url", uriString);
rootElement.appendChild(repo);
Element repoDesc = doc.createElement("description");
@@ -417,4 +434,38 @@ public class LocalRepoManager {
transformer.transform(domSource, result);
}
+
+ public void writeIndexJar() throws IOException {
+ try {
+ writeIndexXML();
+ } catch (Exception e) {
+ Toast.makeText(context, R.string.failed_to_create_index, Toast.LENGTH_LONG).show();
+ e.printStackTrace();
+ return;
+ }
+
+ BufferedOutputStream bo = new BufferedOutputStream(
+ new FileOutputStream(xmlIndexJarUnsigned));
+ JarOutputStream jo = new JarOutputStream(bo);
+
+ BufferedInputStream bi = new BufferedInputStream(new FileInputStream(xmlIndex));
+
+ JarEntry je = new JarEntry("index.xml");
+ jo.putNextEntry(je);
+
+ byte[] buf = new byte[1024];
+ int bytesRead;
+
+ while ((bytesRead = bi.read(buf)) != -1) {
+ jo.write(buf, 0, bytesRead);
+ }
+
+ bi.close();
+ jo.close();
+ bo.close();
+
+ LocalRepoKeyStore.get(context).signZip(xmlIndexJarUnsigned, xmlIndexJar);
+
+ xmlIndexJarUnsigned.delete();
+ }
}
diff --git a/src/org/fdroid/fdroid/localrepo/LocalRepoService.java b/src/org/fdroid/fdroid/localrepo/LocalRepoService.java
index 690105fdc..fc182352d 100644
--- a/src/org/fdroid/fdroid/localrepo/LocalRepoService.java
+++ b/src/org/fdroid/fdroid/localrepo/LocalRepoService.java
@@ -5,15 +5,12 @@ import android.annotation.SuppressLint;
import android.app.*;
import android.content.*;
import android.os.*;
-import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
-import org.fdroid.fdroid.FDroidApp;
-import org.fdroid.fdroid.Preferences;
+import org.fdroid.fdroid.*;
import org.fdroid.fdroid.Preferences.ChangeListener;
-import org.fdroid.fdroid.R;
import org.fdroid.fdroid.net.LocalHTTPD;
import org.fdroid.fdroid.net.WifiStateChangeService;
import org.fdroid.fdroid.views.LocalRepoActivity;
@@ -91,6 +88,23 @@ public class LocalRepoService extends Service {
}
};
+ private ChangeListener localRepoHttpsChangeListener = new ChangeListener() {
+ @Override
+ public void onPreferenceChange() {
+ Log.i("localRepoHttpsChangeListener", "onPreferenceChange");
+ if (localHttpd.isAlive()) {
+ new AsyncTask() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ stopNetworkServices();
+ startNetworkServices();
+ return null;
+ }
+ }.execute();
+ }
+ }
+ };
+
@Override
public void onCreate() {
notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
@@ -137,23 +151,29 @@ public class LocalRepoService extends Service {
startWebServer();
if (Preferences.get().isLocalRepoBonjourEnabled())
registerMDNSService();
+ Preferences.get().registerLocalRepoHttpsListeners(localRepoHttpsChangeListener);
}
private void stopNetworkServices() {
+ Preferences.get().unregisterLocalRepoHttpsListeners(localRepoHttpsChangeListener);
unregisterMDNSService();
stopWebServer();
}
private void startWebServer() {
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
-
Runnable webServer = new Runnable() {
// Tell Eclipse this is not a leak because of Looper use.
@SuppressLint("HandlerLeak")
@Override
public void run() {
- localHttpd = new LocalHTTPD(getFilesDir(),
- prefs.getBoolean("use_https", false));
+ localHttpd = new LocalHTTPD(
+ LocalRepoService.this,
+ getFilesDir(),
+ Preferences.get().isLocalRepoHttpsEnabled());
+ if (localHttpd == null) {
+ Log.e(TAG, "localHttpd == null!");
+ return;
+ }
Looper.prepare(); // must be run before creating a Handler
webServerThreadHandler = new Handler() {
@@ -200,11 +220,16 @@ public class LocalRepoService extends Service {
final HashMap values = new HashMap();
values.put("path", "/fdroid/repo");
values.put("name", repoName);
- // TODO set type based on "use HTTPS" pref
- // values.put("fingerprint", FDroidApp.repo.fingerprint);
- values.put("type", "fdroidrepo");
- pairService = ServiceInfo.create("_http._tcp.local.",
- repoName, FDroidApp.port, 0, 0, values);
+ values.put("fingerprint", FDroidApp.repo.fingerprint);
+ String type;
+ if (Preferences.get().isLocalRepoHttpsEnabled()) {
+ values.put("type", "fdroidrepos");
+ type = "_https._tcp.local.";
+ } else {
+ values.put("type", "fdroidrepo");
+ type = "_http._tcp.local.";
+ }
+ pairService = ServiceInfo.create(type, repoName, FDroidApp.port, 0, 0, values);
new Thread(new Runnable() {
@Override
diff --git a/src/org/fdroid/fdroid/net/LocalHTTPD.java b/src/org/fdroid/fdroid/net/LocalHTTPD.java
index 499da4967..1eaa2e67d 100644
--- a/src/org/fdroid/fdroid/net/LocalHTTPD.java
+++ b/src/org/fdroid/fdroid/net/LocalHTTPD.java
@@ -1,39 +1,33 @@
package org.fdroid.fdroid.net;
+import android.content.Context;
import android.util.Log;
import android.webkit.MimeTypeMap;
import fi.iki.elonen.NanoHTTPD;
import org.fdroid.fdroid.FDroidApp;
+import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
import java.net.URLEncoder;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
+import java.util.*;
import javax.net.ssl.SSLServerSocketFactory;
public class LocalHTTPD extends NanoHTTPD {
private static final String TAG = LocalHTTPD.class.getCanonicalName();
+ private final Context context;
private final File webRoot;
private final boolean logRequests;
- public LocalHTTPD(File webRoot, boolean useHttps) {
+ public LocalHTTPD(Context context, File webRoot, boolean useHttps) {
super(FDroidApp.ipAddressString, FDroidApp.port);
this.logRequests = false;
this.webRoot = webRoot;
+ this.context = context.getApplicationContext();
if (useHttps)
enableHTTPS();
}
@@ -91,7 +85,15 @@ public class LocalHTTPD extends NanoHTTPD {
}
private void enableHTTPS() {
- // TODO copy implementation from Kerplapp
+ try {
+ LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context);
+ SSLServerSocketFactory factory = NanoHTTPD.makeSSLSocketFactory(
+ localRepoKeyStore.getKeyStore(),
+ localRepoKeyStore.getKeyManagers());
+ makeSecure(factory);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
private Response respond(Map headers, String uri) {
@@ -305,7 +307,8 @@ public class LocalHTTPD extends NanoHTTPD {
}
for (String directory : directories) {
String dir = directory + "/";
- msg.append("").append(dir)
.append("");
}
diff --git a/src/org/fdroid/fdroid/net/MDnsHelper.java b/src/org/fdroid/fdroid/net/MDnsHelper.java
index ab3404138..ae2799a46 100644
--- a/src/org/fdroid/fdroid/net/MDnsHelper.java
+++ b/src/org/fdroid/fdroid/net/MDnsHelper.java
@@ -8,7 +8,6 @@ import android.net.wifi.WifiManager.MulticastLock;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Looper;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -21,7 +20,6 @@ import org.fdroid.fdroid.R;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.List;
import javax.jmdns.*;
@@ -36,13 +34,14 @@ public class MDnsHelper implements ServiceListener {
final RepoScanListAdapter mAdapter;
private JmDNS mJmdns;
- private MulticastLock mMulticastLock;
+ private final WifiManager wifiManager;
+ private final MulticastLock mMulticastLock;
public MDnsHelper(Activity activity, final RepoScanListAdapter adapter) {
mActivity = activity;
mAdapter = adapter;
- WifiManager wm = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
- mMulticastLock = wm.createMulticastLock(activity.getPackageName());
+ wifiManager = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
+ mMulticastLock = wifiManager.createMulticastLock(activity.getPackageName());
mMulticastLock.setReferenceCounted(false);
}
@@ -59,8 +58,15 @@ public class MDnsHelper implements ServiceListener {
}
@Override
- public void serviceAdded(ServiceEvent event) {
+ public void serviceAdded(final ServiceEvent event) {
addFDroidService(event);
+ new AsyncTask() {
+ @Override
+ protected Void doInBackground(Void... params) {
+ mJmdns.requestServiceInfo(event.getType(), event.getName(), true);
+ return null;
+ }
+ }.execute();
}
@Override
@@ -88,7 +94,14 @@ public class MDnsHelper implements ServiceListener {
@Override
protected Void doInBackground(Void... params) {
try {
- mJmdns = JmDNS.create();
+ int ip = wifiManager.getConnectionInfo().getIpAddress();
+ byte[] byteIp = new byte[] {
+ (byte) (ip & 0xff),
+ (byte) (ip >> 8 & 0xff),
+ (byte) (ip >> 16 & 0xff),
+ (byte) (ip >> 24 & 0xff)
+ };
+ mJmdns = JmDNS.create(InetAddress.getByAddress(byteIp));
} catch (IOException e) {
e.printStackTrace();
}
diff --git a/src/org/fdroid/fdroid/net/WifiStateChangeService.java b/src/org/fdroid/fdroid/net/WifiStateChangeService.java
index 78b35abe6..c24271ff9 100644
--- a/src/org/fdroid/fdroid/net/WifiStateChangeService.java
+++ b/src/org/fdroid/fdroid/net/WifiStateChangeService.java
@@ -4,19 +4,20 @@ package org.fdroid.fdroid.net;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
-import android.content.SharedPreferences;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.IBinder;
-import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils;
+import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
+import org.fdroid.fdroid.localrepo.LocalRepoManager;
+import java.security.cert.Certificate;
import java.util.Locale;
public class WifiStateChangeService extends Service {
@@ -58,18 +59,31 @@ public class WifiStateChangeService extends Service {
FDroidApp.bssid = wifiInfo.getBSSID();
String scheme;
- // TODO move this to Preferences.get().isHttpsEnabled();
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(WifiStateChangeService.this);
- if (prefs.getBoolean("use_https", false))
+ if (Preferences.get().isLocalRepoHttpsEnabled())
scheme = "https";
else
scheme = "http";
FDroidApp.repo.name = Preferences.get().getLocalRepoName();
FDroidApp.repo.address = String.format(Locale.ENGLISH, "%s://%s:%d/fdroid/repo",
scheme, FDroidApp.ipAddressString, FDroidApp.port);
- FDroidApp.localRepo.setUriString(FDroidApp.repo.address);
- FDroidApp.localRepo.writeIndexPage(
- Utils.getSharingUri(WifiStateChangeService.this, FDroidApp.repo).toString());
+
+ Context context = WifiStateChangeService.this.getApplicationContext();
+ LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context);
+ Certificate localCert = localRepoKeyStore.getCertificate();
+ FDroidApp.repo.fingerprint = Utils.calcFingerprint(localCert);
+ LocalRepoManager lrm = LocalRepoManager.get(context);
+ lrm.setUriString(FDroidApp.repo.address);
+ lrm.writeIndexPage(Utils.getSharingUri(context, FDroidApp.repo).toString());
+
+ /*
+ * Once the IP address is known we need to generate a self
+ * signed certificate to use for HTTPS that has a CN field set
+ * to the ipAddressString. This must be run in the background
+ * because if this is the first time the singleton is run, it
+ * can take a while to instantiate.
+ */
+ if (Preferences.get().isLocalRepoHttpsEnabled())
+ localRepoKeyStore.setupHTTPSCertificate();
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -81,6 +95,7 @@ public class WifiStateChangeService extends Service {
Intent intent = new Intent(BROADCAST);
LocalBroadcastManager.getInstance(WifiStateChangeService.this).sendBroadcast(intent);
WifiStateChangeService.this.stopSelf();
+ FDroidApp.restartLocalRepoService();
}
}
diff --git a/src/org/fdroid/fdroid/views/LocalRepoActivity.java b/src/org/fdroid/fdroid/views/LocalRepoActivity.java
index b7d4e3f21..8bb5582aa 100644
--- a/src/org/fdroid/fdroid/views/LocalRepoActivity.java
+++ b/src/org/fdroid/fdroid/views/LocalRepoActivity.java
@@ -22,6 +22,7 @@ import android.view.*;
import android.widget.*;
import org.fdroid.fdroid.*;
+import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.localrepo.LocalRepoService;
import org.fdroid.fdroid.net.WifiStateChangeService;
@@ -65,7 +66,7 @@ public class LocalRepoActivity extends Activity {
LocalBroadcastManager.getInstance(this).registerReceiver(onLocalRepoChange,
new IntentFilter(LocalRepoService.STATE));
// if no local repo exists, create one with only FDroid in it
- if (!FDroidApp.localRepo.xmlIndex.exists())
+ if (!LocalRepoManager.get(this).xmlIndex.exists())
new UpdateAsyncTask(this, new String[] {
getPackageName(),
}).execute();
@@ -291,24 +292,25 @@ public class LocalRepoActivity extends Activity {
@Override
protected Void doInBackground(Void... params) {
try {
+ final LocalRepoManager lrm = LocalRepoManager.get(LocalRepoActivity.this);
publishProgress(getString(R.string.deleting_repo));
- FDroidApp.localRepo.deleteRepo();
+ lrm.deleteRepo();
for (String app : selectedApps) {
publishProgress(String.format(getString(R.string.adding_apks_format), app));
- FDroidApp.localRepo.addApp(getApplicationContext(), app);
+ lrm.addApp(getApplicationContext(), app);
}
- FDroidApp.localRepo.writeIndexPage(sharingUri.toString());
- publishProgress(getString(R.string.writing_index_xml));
- FDroidApp.localRepo.writeIndexXML();
+ lrm.writeIndexPage(sharingUri.toString());
+ publishProgress(getString(R.string.writing_index_jar));
+ lrm.writeIndexJar();
publishProgress(getString(R.string.linking_apks));
- FDroidApp.localRepo.copyApksToRepo();
+ lrm.copyApksToRepo();
publishProgress(getString(R.string.copying_icons));
// run the icon copy without progress, its not a blocker
new AsyncTask() {
@Override
protected Void doInBackground(Void... params) {
- FDroidApp.localRepo.copyIconsToRepo();
+ lrm.copyIconsToRepo();
return null;
}
}.execute();
diff --git a/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java b/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java
index ffe90fae9..2952be63a 100644
--- a/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java
+++ b/src/org/fdroid/fdroid/views/QrWizardDownloadActivity.java
@@ -5,7 +5,6 @@ import android.app.Activity;
import android.content.*;
import android.os.Build;
import android.os.Bundle;
-import android.preference.PreferenceManager;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.View;
@@ -13,9 +12,7 @@ import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
-import org.fdroid.fdroid.FDroidApp;
-import org.fdroid.fdroid.QrGenAsyncTask;
-import org.fdroid.fdroid.R;
+import org.fdroid.fdroid.*;
import org.fdroid.fdroid.net.WifiStateChangeService;
public class QrWizardDownloadActivity extends Activity {
@@ -62,9 +59,8 @@ public class QrWizardDownloadActivity extends Activity {
};
private void resetNetworkInfo() {
- final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String qrString = "";
- if (prefs.getBoolean("use_https", false))
+ if (Preferences.get().isLocalRepoHttpsEnabled())
qrString += "https";
else
qrString += "http";
diff --git a/src/org/fdroid/fdroid/views/fragments/RepoListFragment.java b/src/org/fdroid/fdroid/views/fragments/RepoListFragment.java
index d5b23c5ac..afd69cddf 100644
--- a/src/org/fdroid/fdroid/views/fragments/RepoListFragment.java
+++ b/src/org/fdroid/fdroid/views/fragments/RepoListFragment.java
@@ -200,8 +200,7 @@ public class RepoListFragment extends ListFragment
MenuItemCompat.SHOW_AS_ACTION_ALWAYS |
MenuItemCompat.SHOW_AS_ACTION_WITH_TEXT);
- if (Build.VERSION.SDK_INT >= 16)
- {
+ if (Build.VERSION.SDK_INT >= 16) {
menu.add(Menu.NONE, SCAN_FOR_REPOS, 1, R.string.menu_scan_repo).setIcon(
android.R.drawable.ic_menu_search);
}
@@ -271,8 +270,7 @@ public class RepoListFragment extends ListFragment
path = "/fdroid/repo";
String serviceUrl = protocol + serviceInfo.getInetAddresses()[0]
+ ":" + serviceInfo.getPort() + path;
- // TODO get fingerprint from TXT record
- showAddRepo(serviceUrl, "");
+ showAddRepo(serviceUrl, serviceInfo.getPropertyString("fingerprint"));
}
});
diff --git a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java
index 24b254cc6..785b9ac25 100644
--- a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java
+++ b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java
@@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
-import android.util.Log;
import android.view.ActionMode;
import android.view.View;
import android.widget.*;
@@ -37,6 +36,7 @@ import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.data.InstalledAppProvider;
import org.fdroid.fdroid.data.InstalledAppProvider.DataColumns;
+import org.fdroid.fdroid.localrepo.LocalRepoManager;
import org.fdroid.fdroid.views.SelectLocalAppsActivity;
import java.util.HashSet;
@@ -113,7 +113,7 @@ public class SelectLocalAppsFragment extends ListFragment
// build list of existing apps from what is on the file system
if (FDroidApp.selectedApps == null) {
FDroidApp.selectedApps = new HashSet();
- for (String filename : FDroidApp.localRepo.repoDir.list()) {
+ for (String filename : LocalRepoManager.get(selectLocalAppsActivity).repoDir.list()) {
if (filename.matches(".*\\.apk")) {
String packageName = filename.substring(0, filename.indexOf("_"));
FDroidApp.selectedApps.add(packageName);