Freenet

When free speech dies, we need a place to organize.

Freenet is a censorship resistant, distributed p2p-publishing platform.

Too technical? Let’s improve that: Freenet is the internet's last, best hope for Freedom. Join now:

freenetproject.org

It lets you anonymously share files, browse and publish “freesites”, chat on forums and even do microblogging, using a generic Web of Trust, shared by different plugins, to avoid spam. For really careful people it offers a “darknet” mode, where users only connect to their friends, with which it is very hard to detect that they are running freenet.

The overarching design goal of freenet is to make censorship as hard as technically possible. That’s the reason for providing anonymity (else you could be threatened with repercussions - as seen in the case of the wikileaks informer from the army in the USA), building it as a decentral network (else you could just shut down the central website, as people tried with wikileaks), providing safe pseudonyms and caching of the content on all participating nodes (else people could censor by spamming or overloading nodes) and even the darknet mode and enhancements in usability (else freenet could be stopped by just prosecuting everyone who uses it, or it would reach too few people to be able to counter censorship in the open web).

I don’t know anymore what triggered my use of freenet initially, but I know all too well what keeps me running it instead of other anonymizers:

I see my country (Germany) turning more and more into a police-state, starting with attacks on p2p, continuing with censorship of websites (where infrastructure created to block child porn is now used to block websites of climate activists)* and leading into directions I really don’t like.

And in case the right for freedom of speech dies, we need a place where we can organize to get it back and fight for the rights laid out in our constitution (the Grundgesetz).

When free speech dies, we need a place to organize.

And that’s what Freenet is to me.

A technical way to make sure we can always organize acting by section 20 of our constitution (german link): the right to oppose everyone who wants to abolish our constitutional order.

PS: New entries on my site are also available in freenet (via freereader: downloads RSS feeds and republishes them in freenet).

PPS: If you like this text, please redent/retweet the associated identi.ca/twitter notices so it spreads:

50€ for the Freenet Project - and against censorship

As I pledged1, I just donated to freenet 50€ of the money I got back because I cannot go to FilkCONtinental. Thanks go to Nemesis, a proud member of the “FiB: Filkers in Black” who will take my place at the Freusburg and fill these old walls with songs of stars and dreams - and happy laughter.

It’s a hard battle against censorship, and as I now had some money at hand, I decided to do my part (freenetproject.org/donate.html).


  1. The pledge can be seen in identi.ca and in a Sone post in freenet (including a comment thread; needs a running freenet node (install freenet in a few clicks) and the Sone plugin). 

A bitcoin-marketplace using Freenet?

A few days ago, xor, the developer of the Web of Trust in Freenet got in contact with the brain behind the planned Web of Trust for Openbazaar, and toad, the former maintainer of Freenet questioned whether we would actually want a marketplace using Freenet.

I took a a few days to ponder the question, and I think a marketplace using Freenet would be a good idea - for Freenet as well as for society.

Freenet is likely the most secure way for implementing a digital market, which means it can work safely for small sums, but not for large ones - except if you can launder huge amounts of digital money. As such it is liberating for small people, but not for syndicates. For example a drug cartel needs to be able to turn lots of money into clean cash to pay henchmen abroads. Since you can watch bitcoin more easily than cash and an anonymous network makes it much harder to use scare-tactics against competing sellers, moving the marketplace from the street to the internet weakens syndicates and other organized crime by removing part of their options for creating a monopoly by force.

If a bitcoin marketplace with some privacy for small-scale users should become a bigger problem than the benefit it brings by weakening organized crime, any state or other big player can easily force the majority of users to reveal their identities by using the inherent tracability of bitcoin transactions.

Also the best technologies in freenet were developed (or rather: got to widespread use), because it had to actually withstand attacks.

Freenet as marketplace with privacy for small people equivalent to cash-payments would also help improve its suitability for whistleblowers - see hiding in the forest: A better alternative.

For free speech this would also help, because different from other solutions, freenet has the required properties for that: a store with lifetime depending on the popularity of content, not the power of the publisher, which provides DoS-resistant hosting without the need to have a 24/7 server, stable and untraceable pseudonyms (ignoring fixable attack-vectors) and an optional friend-to-friend darknet.

In short: A decentralized ebay-killer would be cool and likely beneficial to Freenet and Free Speech without bringing actual benefit for organized crime.

Also this might be what is needed to bring widespread darknet adoption.

And last but not least, we would not be able to stop people from implementing a marketplace over freenet: Censorship resistance also means resistance against censorship by us.

Final note: Openbazaar is written in Python and Freenet has decent Python Bindings (though they are not beautiful everywhere), so it should not be too hard to use it for Openbazaar. A good start could be the WoT-code written for Infocalypse in last years GSoC: Web of Trust integration as well as private messaging.

AnhangGröße
freenet_logo.png16.72 KB
freenet-banner.png3.39 KB

A deterministic upper bound for the network load of the fully decentralized Freenet spam filter

Goal: Improve the decentralized spam filter in Freenet (WoT) to have deterministic network load, bounded to a low, constant number of subscriptions and fetches.

This article provides calculations which show that decentralized spam filtering with privacy through pseudonyms can scale to communication systems that connect all of humanity. It is also applicable to other systems than Freenet, see use in other systems.

Originally written as a comment to bug 3816. The bug report said "someone SHOULD do the math". I then did the math. Here I’m sharing the results.

Useful prior reading is Optimizing a distributed spam filter for Freenet.

This proposal has two parts:

  1. Ensuring an upper bound on the network cost, and
  2. Limiting the cost due to checking stale IDs.

Slang

  • ID, "identity" or "pseudonym" is a user account. You can have multiple.
  • OwnID is one of your own identities, a pseudonym you control.
  • Trust is a link from one ID (a) to another ID (b). It has a numerical value.
    • Positive values mean that (a) considers (b) to be a constructive contributor.
    • Negative values mean that (a) thinks that (b) is trying to disrupt communication.
  • Key is an identifier you can use as part of a link to download data. Every ID has one key.
  • Editions are the versions of keys. They are increased by one every time a key is updated.
  • Fetch means to download some data from some key for some edition.
  • Subscription is a lightweight method to get informed if a key was updated to a new edition.
  • Edition hints are part of an ID. They show for each trusted ID (b) which edition of it was last seen by the trusting ID (a).
  • The rank of an ID describes the number of steps needed to get from your OwnID to that ID when following trust paths.

Variables

  • N the number of identities the OwnID gave positive trust. Can be assumed to be bounded to 150 active IDs (as by Dunbar’s number).⁰
  • M a small constant for additional subscriptions, i.e. 10.
  • F a small constant for additional fetches per update, i.e. 10.

⁰: https://en.wikipedia.org/wiki/Dunbar's_number - comment by bertm: that assumes all statements of "OwnID trusts ID to not be a spammer" to be equivalent to "OwnID has a stable social relationship with ID". I'm not quite sure of that equivalence. That said, for purposes of analysis, we can well assume it to be bounded by O(1).

Limit network load with a constant upper bound

Process

Subscribe to all rank 1 IDs (which have direct trust from your OwnID). These are the primary subscriptions. There are N primary subscriptions.

All the other IDs are split into two lists: rank2 (secondary IDs) and rank3+ (three or more steps to reach them). Only a subset of those get subscriptions, and the subset is regularly changed:

  • Subscribe to the M rank2 IDs which were most recently updated. These have the highest probability of being updated again. The respective list must be updated whenever a rank2 ID is fetched successfully (the ordering might change).
  • Subscribe to the M rank3+ IDs which were most recently updated. The respective list must be updated whenever a rank3+ ID is fetched successfully (the ordering might change).
  • Subscribe to M rank2 IDs chosen at random (secondary subscriptions). When a secondary or random subscription yields an update, replace it with another ID of rank2, chosen at random.
  • Subscribe to M IDs of rank 3 or higher chosen at random (random subscriptions). When a random subscription yields an update, replace it with another rank3+ ID, chosen at random.

Also replace one of the randomly chosen rank2 and rank3+ subscription every hour. This ensures that WoT will always eventually see every update.

If any subscription yields an update, download its key and process all edition hints. Queue these as fetches in separate queues for rank1 (primary), rank2 (secondary), and rank3+ (random), and process them independently.

At every update of a subscription (rank1, rank2, or rank3+), choose F fetches from the respective edition hint fetch queue at random and process them. This bounds the network load to ((N × F) + (4M × F)) × update frequency.

These fetches and subscriptions must be deduplicated: If we already have a subscription, there’s no use in starting a fetch, since the update will already have been seen.

Calculating the upper bound of the cost

To estimate an upper bound for the fetch frequency, we can use the twitter frequency, which is about 5 tweets per day on average and 10 to 50 for people with many followers¹ (those are more likely to be rank1 IDs of others).

There are two possible extremes: Very hierarchic trust structure and egalitarian trust structure. Reality is likely a power-law structure.

  • In a hierarchic trust structure, we can assume that rank1 or rank2 IDs (trustee subscriptions) are all people with many followers, so we use 22 updates per day (as by ¹).
  • In an egalitarian trust structure we can assume 5 updates per day (as by ¹).

For high frequency subscriptions (most recently updated) we can assume 4 updates per hour for 16 hours per day, so 64 updates per day.⁰ For random subscriptions we can assume 5 updates per day (as by ¹).

¹: http://blog.hubspot.com/blog/tabid/6307/bid/4594/Is-22-Tweets-Per-Day-the-Optimum.aspx ← on the first google page, not robust, but should be good enough for this usecase.

((N × F) + (M × F)) × trustee update frequency + 2M × F × high update frequency + 2M × F × random update frequency.

For a very hierarchic WoT (primaries are very active) this gives the upper bound:

= (150 × 10 × 22) + (10 × 10 × 22) + (10 × 10 × 64) + (2 × 10 × 10 × 5) + (10 × 10 × 64)
= (1500 × 22) + (100 × 22) + (100 × 64) + (100 × 5) + (100 × 64)
= 33000 + 2200 + 6400 + 500 + 6400 # primary triggered + random rank2 + active rank2 + random rank3+ + active rank3+
= 48500 fetches per day
~ 34 fetches per minute.

For an egalitarian trust structure (primaries have average activity) this gives the upper bound:

= (150 × 10 × 5) + (10 × 10 × 5) + (10 × 10 × 64) + (10 × 10 × 5) + (10 × 10 × 64)
= (1500 × 5) + (100 × 5) + (100 × 64) + (100 × 5) + (100 × 64)
= 7500 + 500 + 6400 + 500 + 6400 # primary triggered + random rank2 + active rank2 + random rank3+ + active rank3+
= 21300 fetches per day
~ 15 fetches per minute.

This gives a plausible upper bound of the network load per day from this scheme, assuming a very centralized WoT. The upper bound for a very hierarchic trust structure is dominated by the primary subscriptions. The upper bound for an egalitarian trust structure is dominated by the primary subscriptions and the high frequency subscriptions.

The rank2 subscriptions and the random subscriptions together make up about 5% of the network load. They are needed to guarantee that the WoT always eventually converges to a globally consistent view.

One fetch for an ID transfers about 1KiB data. For a hierarchic WoT (one fetch per two seconds) this results in a maximum bandwidth consumption on a given node of 1KiB/s × hops. This is about 5KiB/s for the average of 5 hops — slightly higher than our minimum bandwidth. For an egalitarian WoT this results in a maximum bandwidth consumption on a given node of 0.5KiB/s × hops. This is about 2.5KiB/s for the average of 5 hops — 60% of our minimum bandwidth. The real bandwidth requirement should be lower, because IDs are cached very well.

The average total number of subscriptions to active IDs should be bounded to 190.

⁰: The cost of active IDs might be overestimated here, because WoT has an upper bound of one update per hour. In this case the cost of this algorithm would be reduced by about 30% for the egalitarian structure and by about 10% for the hierarchic structure.

prune subscriptions to stale IDs to improve the rank2+ update detection delay to (less than) O(N), with N the known active IDs

The process to check IDs with rank >= 2 can be improved from essentially checking them at random (with the real risk of missing IDs — there is no guarantee to ever check them all, not even networkwide), to having each active ID check all IDs in O(N) (with N the number of of IDs).

Process

When removing a random subscription to an ID with rank2 or higher, with 50% probability add the ID+currentversion to a blocklist which avoids processing this same ID with this or a lower version again and prune it from the WoT.¹

When receiving a version hint from another ID with a higher version than the one which is blocked, the ID is removed from the blocklist.

The total cost in memory is on the order of the number of old IDs already checked, bounded to O(N), the number of Identities.

¹: Pruning the ID from WoT is not strictly necessary on the short term. However on the long term (a decade and millions of users), we must remove information.

Expected effect

Assume that 9k of the 10k IDs in WoT are stale (a reasonable assumption, because only about 300 IDs are inserted from an up to date version of WoT right now).

When replacing one random rank2 and one random rank3+ subscription per hour, that yields about 16k subscription replacements per year, or (in a form which simplifies the math) about two replacements per ID in the WoT.

Looking at only a single ID:

For the first replacement there is a 90% probability that the ID in question is stale, and a 50% probability that it will be put on the blocklist if it is stale, which yields a combined 45% probability that the number of stale IDs decreases by one. In other words, it takes on average 2.2 steps to remove the first stale ID from the IDs to check.

As a rough estimate, for 10 IDs it would take 15 steps to prune out 5 of the 9 stale IDs. Scaling this up should give an estimation of the time required for 9k IDs. So after about 15k steps (one year) half the stale IDs should be on the blocklist.

Looking at the whole network

For a given stale ID, after one year there is roughly a 50% chance that it is on the blocklist of a given active ID. But the probability that it is on the blocklist of every active ID is just about 0.5k, with k the number of active IDs. So when there is an update to this previously stale ID, it is almost certain that some ID will see it and remove it from the blocklists of most other IDs within O(N) steps by providing an edition hint (this will accelerate as more stale IDs are blocked).

Rediscovering inactive IDs when they return

I am sure that there is a beautiful formula to calculate exactly the proportion of subscriptions to stale IDs we’ll have with this algorithm when it entered a steady state, and the average discovery time for a previously stale ID to be seen networkwide again when it starts updating again. To show that this algorithm should work, we only need a much simpler answer, though:

How long will it take an ID which was inactive for 10 years to be seen networkwide again (if its direct trusters are all inactive, else the primary subscriptions would detect and spread its update within minutes)?

After 10 years, the ID will be on the blocklist of 99.9% of the IDs. In a network with 10k active IDs, that means that only about 10 IDs did not block it yet¹. Every year there is a 50% probability for each of the IDs that the update will be seen.

Therefore detection of the update to an ID which was inactive for 10 years and whose direct trusters are all inactive will take about 10 weeks. Then the update should spread rapidly via edition hints.

¹: There is a 7% probability that 15 or more IDs could still see it and a 1.2% probability that less than 5 IDs still see it. The probability that only a single ID did not block it yet is just 0.005%. In other words: If 99% of IDs would become inactive and then active again after 10 years, approximately one will need about two years to be seen and most will be detected again within 10 weeks. Therefore this scheme is robust against long-term inactivity.

Summary

This algorithm can give the distributed spam filter in Freenet a constant upper bound in cost without limiting interaction.

A vision for a social Freenet with WoT, FreeTalk and Sone

I let my thought wander a bit around the question how a social Freenet (2.0 ;) ) could look from the view of a newcomer.

I imagine myself installing freenet. The first thing to come up after starting it is the node page. (italic Text in brackets is a comment. The links need a Freenet running on 127.0.0.1 to work)


“Welcome to Freenet, where no one can tell you’re reading”

“Freenet tries hard to project your privacy. Therefore we created a pseudonymous ID for you. Its name is Gandi Schmidt. Visit the [your IDs site] to see a legend we prepared for you. You can use this legend as fictional background for your ID, if you are really serious about staying anonymous.”

(The name should be generated randomly for each ID. A starting point for that could be a list of scientists from around the world compiled from the wikipedia (link needs freenet). The same should be true for the legend, though it is harder to generate. The basic information should be a quote (people remember that), a job and sex, the country the ID comes from (maybe correlated with the name) and a hobby.)

“During the next few restarts, Freenet will ask you to solve various captchas to prove that you are indeed human. Once enough other nodes successfully confirmed that you are human, you will gain write access to the forums and microblogging. This might take a few hours to a few days.”

(as soon as the ID has sufficient trust, automatically activate posting to FreeTalk, Sone and others. Access is delayed to ensure that when people talk they can get answers)

“Note that other nodes don’t know who you are. They don’t know your IP, nor your real identity. The only thing they know is that you exist, that you can solve captchas and how to send you a message.”

“You can create additional IDs at any time and give them any name and legend you choose by adding it on the WebOfTrust-page. Each new ID has to verify for itself that it’s human, though. If you carefully keep them seperate, others can only find out with a lot of effort that your IDs are related. Mind your writing style. In doubt, keep your sentences short. To make it easier for you to stay anonymous, you can autogenerate Name and Legend at random.”

“While your humanity is being confirmed, you can find a wealth of content on the following indexes, some published anonymously, some not. If you want to publish your own anonymous site, see Upload a Freesite. The list of indexes uses dynamic bookmarks. You get notified whenever a bookmarked site (like the indexes below) gets updated.”

“Note: If you download content from freenet, it is being cached by other nodes. Therefore popular content is faster than rare content and you cannot overload nodes by requesting their data over and over again.”

“You are currently using medium security in the range from low to high.”

“In this security level, seperated IDs are no perfect protection of your anonymity, though, since other members might not be able to see what you do in Freenet, but they can know that you use freenet in the first place, and corporations or governments with medium sized infrastructure can launch attacks which might make it possible to trace your contributions and accesses. If you want to disappear completely from the normal web and keep your freenet usage hidden, as well as make it very hard to trace your contributions, to be able to really exercise your right of free speech without fearing repercussions, you can use Freenet as Darknet — the more secure but less newcomer friendly way to use freenet; the current mode is Opennet.”

“To enter the Darknet, you add people you know and trust personally as your darknet friends. As soon as you have enough trusted friends, you can increase the security level to high and freenet will only connect to your trusted friends, making you disappear from the regular internet. The only way to tell that you are using freenet will then be to force your ISP to monitor all traffic coming from your computer.”

“And once transport plugins are integrated, steganography will come into reach and allow masking your traffic as regular internet usage, making it very hard to distinguish freenet from encrypted internet-telephony. If you want to help making this a reality in the near future, please consider contributing or donating to freenet.”

“Welcome to the pseudonymous web where no one can know who you are, but only that you are always using the same ID — if you do so.”

“To show this welcome message again, you can at any time click on Intro in the links.”


What do you think? Would this be a nice way to integrate WoT, FreeTalk, Sone and general user education in a welcome message, while adding more incentive to keep the node running?

PS: Also posted in the Freenet Bugtracker, in Freetalk and in Sone – the last two links need a running Freenet to work.

PPS: This vision is not yet a reality, but all the necessary infrastructure is already in place and working in Freenet. You can already do everything described in here, just without the nice guide and the level of integration (for example activating plugins once you have proven your humanity, which equals enough trust by others to be actually seen).

Anonymous code collaboration with Mercurial and Freenet

Anonymous DVCS in the Darknet.

There is a new Mercurial extension for interaction with Freenet called "infocalypse" (which should keep working after the information apocalypse).

It offers "fn-push" and "fn-pull" as an optimized way to store code in freenet: bundles are inserted and pulled one after the other. An index tells infocalypse in which order to pull the bundles. It makes using Mercurial in freenet far more efficient and convenient.

Real Life Infocalypse
easy setup of infocalypse (script)
distributed, anonymous development

Also you can use it to publish collaborative anonymous websites like the freefaq and Technophob.

And it is a perfect fit for the workflow automatic trusted group of committers.

Otherwise it offers the same features as FreenetHG.


The rest of the article is concerned with the older FreenetHG extension. If you need to choose between the two, use Infocalypse: It’s concept for sharing over Freenet is more robust.


Using FreenetHG you can collaborate anonymously without having to give everyone direct write access to your code.

To work with others, you simply setup a local repository for your own work and use FreenetHG to upload your code automatically into Freenet under your private ID. Others can then access your code with the corresponding public ID, do their changes locally and publish them in their own anonymous repository.

You then pull changes you like into your repository and publish them again under your key.

FreenetHG uses freenet which offers the concept of pseudonymity to make anonymous communication more secure and Mercurial to allow for efficient distributed collaboration.

With pseudonymity you can't find out whom you're talking to, but you know that it is the same person, and with distibuted collaboration you don't need to let people write to your code directly, since every code repository is a full clone of the main repository.

Even if the main repository should go down, every contributor can still work completely unhindered, and if someone else breaks things in his repository, you can simply decide not to pull the changes from him.

What you need

To use FreenetHG you obviously need a running freenet node and a local Mercurial installation. Also you need the FreenetHG plugin for Mercurial and PyFCP which provides Python bindings for Freenet.

  • get FreenetHG (the link needs a running freenet node on 127.0.0.1)
  • alternatively just do

    hg clone static-http://127.0.0.1:8888/USK@fQGiK~CfI8zO4cuNyhPRLqYZ5TyGUme8lMiRnS9TCaU,E3S1MLoeeeEM45fDLdVV~n8PCr9pt6GMq0tuH4dRP7c,AQACAAE/freenethg/1/

Setup a simple anonymous workflow

To guide you through the steps, let's assume we want to create the anonymous repository "AnoFoo".

After you got all dependencies, you need to activate the FreenetHG plugin in your ~/.hgrc file

[extensions]
freenethg = path/to/FreenetHG.py

You can get the FreenetHG.py from the freenethg website or from the Mercurial repository you cloned.

Now you setup your anofoo Mercurial repository:

hg init AnoFoo

As a next step we create some sections in the .hg/hgrc file in the repository:

[ui]

[freenethg]

[hooks]

Now we enter the repository and use the setup wizard

cd AnoFoo
hg fcp-setupwitz

The setup wizard asks us for your username to use for this repository (to avoid accidently breaking our anonymity), the address to our freenet instance and for the path to our repository on freenet.

The default answers should fit. The only one where we have to set something else is the project name. There we enter AnoFoo.

Since we don't yet have a freenet URI for the repository, we just answer '.' to let FreenetHG generate one for us. That's also the default answer.

The commit hook makes sure that we don't commit with another but the selected username.

Also the wizard will print a line like the following:

Request uri is: USK@xlZb9yJbGaKO1onzwawDvt5aWXd9tLZRoSoE17cjXoE,zFqFxAk15H-NvVnxo69oEDFNyU9uNViyNN5ANtgJdbU,AQACAAE/freenethg_test/1/

This is the line others can use to clone your project and pull from it.

And with this we finished setting up our anonymous collaboration repository.

When we commit, every commit will directly be uploaded into Freenet.

So now we can pass the freenet Request uri to others who can clone our repository and setup their own repositories in freenet. When they add something interesting, we then pull the data from their Request uri and merge their code with ours.

Setup a more convenient anonymous workflow

This workflow is already useful, but it's a bit inconvenient to have to wait after each commit until your changes have been uploaded. So we'll now change this basic workflow a bit to be able to work more conveniently.

First step: clone our repositories to a backup location:

hg clone AnoFoo BackFoo

Second step: change our .hg/hgrc to only update when we push to the backup repository, and add the default-push path to the backup repository:

[paths]
default-push = ../BackFoo

[hooks]                                                               
pretxncommit = python:freenethg.username_checker                      
outgoing = python:freenethg.updatestatic_hook                           

[ui]
username = anonymuse

[freenethg]
commitusername = anonymuse
inserturi = USK@VERY_LONG_PRIVATE_KEY/AnoFoo/1/

Changes: We now have a default-push path, and we changed the "commit" hook to an "outgoing" hook which is evoked everytime changes leave this repository. It will also be evoked when someone pulls from this repo, but not when we clone it locally.

Now our commits roll as fast as we're used to from other Mercurial repositories and freenethg will make sure we don't use the wrong username.

When we want to anonymously publish the repository we then simply use

hg push

This will push the changes to the backup and then upload it to your anonymous repository.

And now we finished setting up our reopsitory and can begin using an anonymous and almost infinitely scaleable workflow which only requires our freenet installation to be running when we push the code online.

One last touch: If an upload should chance to fail, you can always repeat it manually with

hg fcp-uploadstatic

Time to go

...out there and do some anonymous coding (Maybe with the workflow automatic trusted group of committers).

Happy hacking!

And if this post caught your interest or you want to say anything else about it, please write a comment.

Also please have a look at and vote for the wish to add a way to contribute anonymously to freenet, to make it secure against attacks on developers.

And last but not least: vote for this article on digg and on yigg.

Answers to “I can't use Freenet”

Short answers to questions from a message in the anonymous Freenet Message System:

Ultra-short answer: Go to https://freenetproject.org/pages/download.html and run the installer. It’s fast and easy.

Now onward to the message:

psst@GdwO… wrote :

ArneBab@-jtT… wrote : Yes. And that’s one of the reasons why we need Freenet: to wrestle back control over our communication channel.

Good luck getting people to use it though.

Yes, that’s something we need to fix. And there’s a lot we can do for that. It’s just a lot of boring work.

Let’s go through your points and see which we could fix:

I can't use Freenet. It's illegal! It isn't? How do you know?

It’s created by a registered tax-exempt charity1, how can it be illegal?

I don't want people to think I'm some kind of paranoid nutjob.

Maybe we should add some quotes from the Guardian on the frontpage, and maybe also quote the CNN news about Freenet as a counterpoint?

»You don't need to be talking to a terror suspect to have your communications data analysed by the NSA. The agency is allowed to travel "three hops" from its targets — who could be people who talk to people who talk to people who talk to you. Facebook, where the typical user has 190 friends, shows how three degrees of separation gets you to a network bigger than the population of Colorado. How many people are three "hops" from you?« — The Guardian in NSA files decoded, 2013.

»There is now no shield from forced exposure. . . The foundation of Groklaw is over. . . the Internet is over« – Groklaw, Forced Exposure (2013-08-20)

»This is the most visible line in the sand for people: Can they see my dick?« — »When your junk was passed by Gmail (to a foreign server), the NSA caught a copy of that.« — John Oliver and Edward Snowden in Last Week Tonight: Government Surveillance, 2015, quoted by engadget in Snowden shows John Oliver how the NSA can see your dick pics.

»there is no central server and no one knows who's using it so it can not be shut down … where there is a message it is likely to find a medium.« — CNN about Freenet, 2005-12-19.

Why don't you grow up, and just accept that you have to be ruled by authority? It's just the way the world works!

Democracy without free press is meaningless. Let’s quote some presidents on this.

»The liberty of the press is essential to the security of freedom in a state: it ought not, therefore, to be restrained in this commonwealth.« — John Adams, 1780, second president of the USA.

»When people talk of the Freedom of Writing, Speaking, or thinking, I cannot choose but laugh. No such thing ever existed. No such thing now exists; but I hope it will exist. But it must be hundreds of years after you and I shall write and speak no more.« — John Adams Letter to Thomas Jefferson (15 July 1817)

»No experiment can be more interesting than that we are now trying, and which we trust will end in establishing the fact, that man may be governed by reason and truth. Our first object should therefore be, to leave open to him all the avenues to truth. The most effectual hitherto found, is the freedom of the press.« — Thomas Jefferson, third president of the USA, in a letter to Judge John Tyler (June 28, 1804)

»Our liberty depends on the freedom of the press, and that cannot be limited without being lost.« — Thomas Jefferson, letter to Dr. James Currie (28 January 1786) Lipscomb & Bergh 18:ii.

»What makes it possible for a totalitarian or any other dictatorship to rule is that people are not informed; how can you have an opinion if you are not informed?« — Hannah Arendt, 1974

»And that is why our press was protected by the First Amendment — the only business in America specifically protected by the Constitution — … to inform, to arouse, to reflect, to state our dangers and our opportunities, to indicate our crises and our choices, to lead, mold, educate and sometimes even anger public opinion.« — John F. Kennedy, 35th president of the united state, Address before the American Newspaper Publishers Association (27 April 1961)

»Without general elections, without freedom of the press, freedom of speech, freedom of assembly, without the free battle of opinions, life in every public institution withers away, becomes a caricature of itself, and bureaucracy rises as the only deciding factor.« — Rosa Luxemburg, Reported in Paul Froelich, Die Russische Revolution (1940).

»A popular Government without popular information, or the means of acquiring it, is but a Prologue to a Farce or a Tragedy, or perhaps both.« — James Madison, fourth president of the USA, in a letter to W.T. Barry (1822-08-04).

»A critical, independent and investigative press is the lifeblood of any democracy.« — Nelson Mandela on freedom of expression, At the international press institute congress (14 February 1994).

»we believe that when governments censor or control information, that ultimately that undermines not only the society, but it leads to eventual encroachments on individual rights as well.« — Barack Obama, 44th president of the USA, in Rangoon, Burma on November 14, 2014

»If in other lands the press and books and literature of all kinds are censored, we must redouble our efforts here to keep them free.« — Franklin D. Roosevelt, 32nd president of the USA, Address to the National Education Association (30 June 1938).

»The liberty of the press is no greater and no less than the liberty of every subject of the Queen.« — Lord Russell of Killowen, Reg. v. Gray (1900), L. R. 2 Q. B. D. 40.

… and many more by Wikiquote: Freedom of the press.

There's no need for Freenet, because nothing is wrong, otherwise my daily commute in my gas guzzler and my TV would be bad, and I like those!

You don’t have to change your life to use Freenet. You do harm yourself quite a bit if you let others control your communication, though. They might make you think your life is bad.

Get a life, you neckbeard.

Let’s play some games on Freenet. We need more fun and life here, that’s true.

Why are you being so distrustful and negative? What are you hiding?

Did you see what they did to Edward Snowden?

If I use it, then I'm helping terrorists blow us up!

If you let terrorists listen in on your communication, you help them scout out their targets!

It's slow!

Let’s not advertise sending movies. Chat over Freenet is nice (FLIP/FLIRCP).

I have to install two programs?

Need to recover flircp and enable it by default. Also advertise node-to-node textmessages (friend-to-friend talk).

Same for Sharesite and Darknet Chat.

I'm not good with computers!

Freenet is easier to install than Starcraft!

im confuse can i install without thinking loll??? I don't care enough to bother.

Yes you can. Most times it actually works.

My computer says it's a dangerous virus!

Need to get fred whitelisted in more anti-virus databases… the new C# based installer should help.

I'm not a hacker!

I don’t break into computers either. And I don’t want others to publish what I tell you in private.

Is there an app for my iPhone?

There is something for your Android: - https://f-droid.org/repository/browse/?fdid=co.loubo.icicle

Can't you just send me the files on Skype?

Sure, but I won’t send anything I wouldn’t also send to the local newspaper. Microsoft has been shown to actually try to use login links sent over skype.

I don't have time for this I have to go to work.

Just try again a few weeks or months later.


Short term solutions (stuff which should take less than 6 months to deploy):

Website

  • put more prominently on front page that Freenet Project Inc. is a registered charity.
  • quote the guardian or so about the importance of secure communication.
  • quote a US president and the UN secretary on the importance of free speech for democracy.
  • quote Edward Snowden.
  • quote someone on the importance of secure communication to fight terrorists.
  • make the download page look easy. Maybe a big button instead of a text-link?
  • link the icicle app on the webpage. With an image.
  • promote the use of node-to-node messages in friend-to-friend mode.
  • ask people every few months to try to invite their friends again. Hey, how about sending another note to your friends today?

Using Freenet

  • get more positive, friendly content on Freenet.
  • play fun games over Freenet.

Freenet development

  • recover flircp. Make flircp and Darknet Chat official. Activated by default.
  • polish the user interface. A lot.

Wrapup

Go to https://freenetproject.org/pages/download.html and run the installer. Send your friends there, too. It’s fast and easy. And gives you a confidential communication channel.

Originally published on random_babcom: my in-Freenet single-page blog.


  1. The Freenet Project Inc is a 501(c)(3) non-profit organization, with the mission "to assist in developing and disseminating technological solutions to further the open and democratic distribution of information". It is registered under EIN 95-4864038. 

Background of Freenet Routing and the probes project (GSoC 2012)

The probes project is a google summer of code project of Steve Dougherty intended to optimize the network structure of freenet. Here I will give the background of his project very briefly:

The Small World Structure

Freenet organizes nodes by giving them locations - like coordinates. The nodes know some others and can send data only to those, to which they are connected directly. If your node wants to contact someone it does not know directly, it sends a message to one of the nodes it knows and asks that one to forward the message. The decision whom to ask to forward the message is part of the routing.

And the routing algorithm in Freenet assumes a small world network: Your node knows many people who are close to you and a few who are far away. Imagine that as knowing many people in your home town and few in other towns. There is mathematical proof, that the routing is very efficient and scales to billions of users - if it really operates on a small world network.

So each freenet node tries to organize its connections in such a way, that it is connected to many nodes close by and some from far away.⁽¹⁾ The structure of the local connections of your own node can be characterized by the link length distribution: “How many short and how many long connections do you have?”

Probes and their Promise

The probes project from Steve is to analyze the structure of the network and the structure of the local connections of nodes in an anonymous way to improve the self-organization algorithm in freenet. The reason is that if the structure of the network is no small world network, the routing algorithm becomes much less efficient.

That in turn means that if you want to get some data on the network, that data has to travel over far more intermediate nodes, because freenet cannot determine the shortest route. And if the data has to travel over more nodes, it consumes more bandwidth and takes longer to reach you. In the worst case it could happen that freenet does not find the data at all.

To estimate the effect of that, you can look at the bar chart The Seeker linked to:

chart

Low is an ideal structure with 16 connections per node, Conforming is the measured structure with about 17 connections per node (a cluster with 12, one with ~25). Ideally we would want Normal with 26 connections per node and an ideal structure. High is 86 connections. The simulated network sizes are 6000 nodes (Small), 18 000 (Normal, as measured), 36 000 (Large). Fewer hops is better.

It shows how many steps a request has to take to find some content. “Conforming” is the actually measured structure. “low”, “normal” and “high” shows the number of connections per node in an optimal network: 16, 26 and 86. The actually measured mean number of connections in freenet is similar to “low”, so that’s the bar with which we need to compare the “confirming” bar to see the effect of the suboptimal structure. And that effect is staggering: By default a request needs about two times as many steps in the real world than it would need in an optimally structured network.

Practically: If freenet would manage to get closer to the optimal structure, it could double its speed and cut the reaction times by factor 2. Without changing anything else - and also without changing the local bandwidth consumption: You would simply get your content much faster.

If we would manage to increase the mean number of connections to about 26 (that’s what a modern DSL connection can manage without too many ill effects), we could double the speed and half the reaction times again (but that requires more bandwidth in the nodes who currently have a low number of connections: Many have only about 12 connections, many have about 25 or so, few have something in between).

Essentially that means we could gain factor 2 to factor 4 in speed and reaction times. And better scaleability (compare the normal and the large network).


Note ⁽¹⁾: Network Optimization using Only Local Knowledge

To achieve a good local connection-structure, the node can use different strategies for Opennet and Darknet (this section is mostly guessed, take it with a grain of salt. I did not read the corresponding code).

In Opennet it can look if it finds nodes which would improve its local structure. If it finds one, it can replaces the local connection, which distorts its local structure the most, with the new connection.

In Darknet on the other hand, where it can only connect to the folks it already knows, it looks for locations of nodes it hears about. It then checks if its local connection would be better if it had that other nodes location. In that case, it asks the other node if it would agree to swap its location with it (without changing any real connections: It only changes the notion where it lives. As if you would swap the flat with someone else but without changing who your friends are. Afterwards both the other one and you live closer to your respective friends).

In short: In Opennet, Freenet changes to whom it is connected in order to achieve a small world structure: It selects its friends based on where it lives. In Darknet it swaps its location with stranges to live be closer to its friends.

AnhangGröße
freenet-probes-size-degree-chart.png13.94 KB

Bootstrapping the Freenet WoT with GnuPG - and GnuPG with Freenet

Intro

When you enter the freenet Web of Trust, you first need to get some trust from people by solving captchas. And even when people trust you somehow, you have no way to prove your identity in an automatic way, so you can’t create identities which freenet can label as trusted without manual intervention from your side.

Proposal

To change this, we can use the Web of Trust used in GnuPG to infer trust relationships between freenet WoT IDs.

Practically that means:

  • Write a message: “I am the WoT ID USK@” (replace with the public key of your WoT ID).
  • Sign that message with a GnuPG key you want to connect to the ID. The signature proves, that you control the GnuPG key.
  • Upload the signed message to your WoT key: USK@/bootstrap/0/gnupg.asc. To make this upload, you need the private key of the ID, so the upload proves, that you control the WoT ID.

Now other people can download the file from you, and when they trust the GnuPG key, they can transfer their trust to the freenet WoT-ID.

Automatic

Ideally all this should be mostly automatic:

  • click a link in the freenet interface and select the WoT ID to have freenet create the file and run your local GnuPG program.
  • Then select your GnuPG key in the GnuPG program and enter your password.
  • Finally check the information to be inserted and press a button to start the upload.

As soon as you have a GnuPG key connected with your WoT ID, freenet should scout all other WoT IDs for gnupg keys and check if the local GnuPG key you assigned to your WoT ID trusts the other key. If yes, give automatic trust (real person → likely no spammer).

Anonymously

To make the connection one-way (bootstrap the WoT from GnuPG, but not expose the key), you might be able to encrypt the message to all people who signed your GnuPG key. Then these can recognize you, but others cannot.

This will lose you the indirect trust in the GnuPG web-of-trust, though.


I hope this bootstrap-WoT draft sounded interesting :)

Happy hacking!

Building the darknet one ref at a time

Freenet Logo: Follow the RabbitBuilding the darknet one ref at a time. That’s what we have to do. If you invite three people⁰ to Freenet and help those of your friends with similar interests to connect¹², and when the people you invited then do the same, we get exponential growth.

⁰: To invite a friend into Freenet, you can send an email like this:
    Let us talk over Freenet, so I can speak freely again.

¹: Helping your friends to connect works as follows:

  1. ask: First ask your friends whether they want to connect to others. Just go to the friends page ( http://127.0.0.1:8888/friends/ ), tick the checkbox next to each of the friends you want to ask and click the drop-down list at the bottom named -- Select action --. Select Send N2NTM to selected peers³ and click Go. A text field opens with which you can send a message to all the peers you selected. I typically ask something like "Hi, do you want to connect via darknet to fellow pirate party members?" (replace "pirate party members" by whatever unites the group of people you’re asking).
  2. noderefs: Go to the friends page in advanced mode ( http://127.0.0.1:8888/friends/?fproxyAdvancedMode=2 ). There you find a link named noderef next to each name. Just download the noderefs of the people who want to connect.
  3. introduction file: Then copy them into a text file and add a short description of each person before the persons noderef.
  4. upload: Now upload that text file. I use freenetupload from pyFreenet for that, but regular insert via the browser ( http://127.0.0.1:8888/insertfile/ ) works as well. When the upload finishes, you’ll find the link on the uploads page ( http://127.0.0.1:8888/uploads/ - see the column key).
  5. message: Go to the friends page again (I’m lazy and use simple mode: http://127.0.0.1:8888/friends/?fproxyAdvancedMode=1 ), tick the checkbox next to each of the friends you want to help connect and click the drop-down list at the bottom named -- Select action --. Select Send N2NTM to selected peers and click Go. A text field opens with which you can send a message to all the peers you selected.
  6. write and send: Write something like "The following link includes the noderefs of people you might want to connect to. Just copy the noderef (from 'identity' to 'End') into the text field on http://127.0.0.1:8888/addfriend/ if you want to connect. If both of you do that, your freenet nodes will connect". Copy the link to the uploaded introduction text file into the text field (below your text) and click Send message.

²: Only connect those with similar interests (who might in the real world meet in a club or at work or who are related by blood or association). This is needed for efficient routing in Freenet.

When free speech dies, we need a place to organize. Let’s build that place.

³: A N2NTM is a Node-To-Node-Text-Message: A confidential message sent between people whose Freenet nodes are connected as friends.

Thanks for this text goes to ts.

De-Orchestrating Freenet with the QUEEN program

So Poul-Henning Kamp thought this just a thought experiment …

In Fosdem2014 Poul-Henning Kamp talked about a hypothetical “Project ORCHESTRA” by the NSA with the goal of disrupting internet security: Information, Slides, Video (with some gems not in the slides).

One of the ideas he mentioned was the QUEEN program: Psy-Ops for Nerds.

I’ve been a contributor to the Freenet Project for several years. And in that time, I experienced quite a few of these hypothetical tactics first-hand.

This is the list of good matches: Disruptive actions which managed to keep Freenet from moving onwards, often for several months. It’s quite horrifying how many there are. Things which badly de-orchestrated Freenet:

  • Steer discussions to/from hot spots (“it can’t be that hard to exchange a text file!” ⇒ noderef exchange fails all the time, which is the core of darknet!)
  • Disrupt consensus building: Horribly long discussions which cause the resolution to be forgotten due to a fringe issue.
  • “Secrecy without authentication is pointless”.
  • “It gives a false sense of security” (if you talor [these kind of things] carefully, they speak to people's political leanings: If it’s not perfect: “No, that wouldn’t do it”. This stopped many implementations, till finally Bombe got too fed up and started the simple and working microblogging tool Sone)
  • “you shouldn’t do that! Do you really know what you are doing? Do you have a PhD in that? The more buttons you press, the more warnings you get” ← this is “filter failed”: No, I don’t understand this, “get me out of that!” ⇒ Freenet downloads fail when the filter failed.
  • Getting people to not do things by misdirecting their attention on it. Just check the Freenet Bugtracker for unresolved simple bugs with completely fleshed out solutions that weren’t realized.
  • FUD: I could be supporting bad content! (just like you do if your provider has a transparent proxy to reduce outgoing bandwidth - or with any VPN, Tor, i2p, .... Just today I read this: « you seriously think people will ever use freenet to post their family holiday photos, favourite recipes etc? … can you envisage ordinary people using freenet for stuff where they don't really have anything to hide? » — obvious answer: I do that, so naturally other people might do it, too.)
  • “Bikeshed” discussions: Sometimes just one single email from an anonymous person can derail a free software project for months!
  • Soak mental bandwidth with bogus crypto proposals: PSKs? (a new key-proposal which could make forums scale better but actually just soaked up half a year of the time of the main developer and wasn’t implemented - and in return, critical improvements for existing forums were delayed)
  • Witless volunteers (overlooking practical advantages due to paranoia, theoretical requirements which fail in the real world, overly pessimistic stance which scares away newcomers, voicing requirements for formal specification of protocols which are in flux).
  • Affect code direction (lot’s of the above - also ensuring that there is no direction, so it doesn’t really work well for anybody because it tries to have the perfect features for everybody before actually getting a reasonable user experience).
  • Code obfuscation (some of the stuff is pretty bad, lots of it looks like it was done in a hurry, because there was so much else to do).
  • Misleading documentation (or outdated or none…: There is plenty of Freenet 0.5 documentation while 0.7 is actually a very different beast)
  • Deceptive defaults (You have to setup your first pseudonym by hand, load two plugins manually and solve CAPTCHAS, before you are able to talk to people anonymously, darknet does not work out of the box, the connection speed when given no unit is interpreted as Bytes/s - I’m sure someone once voiced a reason for that)

Phew, quite a list…

I provided this because naming the problems is an important step towards resolving them. I am sure that we can fix most of this, but it’s important to realize that while many of the points I named are most probably homegrown, it is quite plausible that some of them were influenced from the outside. Freenet was always a pretty high profile project in the crypto community, so it is an obvious target. We’d be pretty naive to think that we weren’t targeted.

And we have to keep this in mind when we communicate: We don’t only have to look out for bad code, but also for influences which make us take up toxic communication patterns which keep us from moving forward.

The most obvious fix is: Stay friendly, stick together, keep honest and greet every newcomer as a potential ally. And call out disrupting behaviour early on: If someone insults new folks or takes up huge amounts of discussion time by rehashing old discussions instead of talking about the way forward - in a way which actually leads to going forward - then say that this is your impression. Still stay friendly: Most of the time that’s not intentional. And people can be affected by outside influences like someone attacking them in other channels, so it would be important to help them recover and not to push them away because their behaviour became toxic for some time (as long as the time investment for that is not overarching).

Overall it’s about keeping the community together despite the knowledge that some of us might actually be aggressors or influenced from the outside to disrupt our work.

Distributed censorship-resistant Wikipedia

Thanks to doublec, there are now distributed censorship-resistant Wikipedia mirrors in Freenet: Distributed Wikipedia Mirrors in Freenet

The current largest mirror is the Simple English Wikipedia (the obvious choice to fight censorship worldwide: it is readable with basic english skills).

With this mirror, information from Wikipedia can be accessed in high-censorship countries:

freenet:USK@m79AuzYDr-PLZ9kVaRhrgza45joVCrQmU9Er7ikdeRI,1mtRcpsTNBiIHOtPRLiJKDb1Al4sJn4ulKcZC5qHrFQ,AQACAAE/simple-wikipedia/0/

To access the site, install Freenet from https://freenetproject.org (or get the installer from someone). If you run it on the default port, you can access the mirror anonymously via the following link:

Censorship-resistant Simple English Wikipedia

To test this without installing Freenet, see

https://freenet.cd.pn/USK@m79AuzYDr-PLZ9kVaRhrgza45joVCrQmU9Er7ikdeRI,1mtRcpsTNBiIHOtPRLiJKDb1Al4sJn4ulKcZC5qHrFQ,AQACAAE/simple-wikipedia/0/
(this one is not anonymous!)

Effortless password protected sharing of files via Freenet

TL;DR: Inserting a file into Freenet using the key KSK@<password> creates an invisible, password protected file which is available over Freenet.

Often you want to exchange some content only with people who know a given password and make it accessible to everyone in your little group but invisible to the outside world.

Until yesterday I thought that problem slightly complex, because everyone in your group needs a given encryption program, and you need a way to share the file without exposing the fact that you are sharing it.

Then I learned two handy facts about Freenet:

  • Content is invisible to all but those with the key
    <ArneBab> evanbd: If I insert a tiny file without telling anyone the key, can they get the content in some way?
    <evanbd> ArneBab: No.

  • You generate a key from a password by using a KSK-key
    <toad_> dogon: KSK@<any string of text> -> generate an SSK private key from the hash of the text
    <toad_> dogon: if you know the string, you can both insert and retrieve it

In other words:

Just inserting a file into Freenet using the key KSK@<password> creates an invisible, password protected file which is shared over Freenet.

The file is readable and writeable by everyone who knows the password (within limits1), but invisible to everyone else.

To upload a file as KSK, just go to the filesharing tab, click “upload a file”, switch to advanced mode and enter the KSK key.

Or simply click here (requires freenet to be running on your computer with default settings).

It’s strange to think that I only learned this after more than 7 years of using Freenet. How many more nuggets might be hidden there, just waiting for someone to find them and document them in a style which normal users understand?

Freenet is a distributed datastore which can find and transfer data efficiently on restricted routes (search for meshnet scaling to see why that type of routing is really hard), and it uses a WebOfTrust for real-life spam-resistance without the need for a central authority (look at your mailbox to see how hard that is, even with big money).

How many more complex problems might it already have solved as byproduct of the search for censorship resistance?

So, what’s still to be said? Well, if Freenet sounds interesting: Join in!


  1. A KSK is writeable with the limit, that you cannot replace the file if people still have it in their stores: You have to wait till it has been displaced or be aware that now two states for the file exist: One with your content and one with the old. Better just define a series of KSKs: Add a number to the KSK and if you want to write, simply insert the next one. 

Exact Math to the rescue - with Guile Scheme

I needed to calculate the probability that for every freenet user there are at least 70 others in a distance of at most 0.01. That needs binomial coefficients with n and k on the order of 4000. My old Python script failed me with an OverflowError: integer division result too large for a float. So I turned to Guile Scheme and exact math.

1 The challenge

I need the probability that within 4000 random numbers between 0 and 1, at least 70 are below 0.02.

Then I need the probability that within 4000 random numbers, at most 5 find less than 70 others to which the distance is at most 0.02.

Or more exactly: I need to find the right maximum length to replace the 0.02.

2 The old script

I had a Python-script lying around which I once wrote for estimating the probability that a roleplaying group will have enough people to play in a given gaming night.

It’s called spielfaehig.py (german for “able to play”).

It just does this:

from math import factorial
fac = factorial
def nük(n, k): 
   if k > n: return 0
   return fac(n) / (fac(k)*fac(n-k))

def binom(p, n, k): 
   return nük(n, k) * p** k * (1-p)**(n-k)

def spielfähig(p, n, min_spieler): 
   try: 
      return sum([binom(p, n, k) for k in range(min_spieler, n+1)])
   except ValueError: return 1.0

Now when I run this with p=0.02, n=4000 and minspieler=70, it returns

OverflowError: integer division result too large for a float

The reason is simple: There are some intermediate numbers which are much larger than what a float can represent.

3 Solution with Guile

To fix this, I rewrote the script in Guile Scheme:

#!/usr/bin/env guile-2.0
!#

(define-module (spielfaehig)
  #:export (spielfähig))
(use-modules (srfi srfi-1)) ; for iota with count and start

(define (factorial n)
  (if (zero? n) 1 
      (* n (factorial (1- n)))))

(define (nük n k)
  (if (> k n) 0
      (/ (factorial n) 
         (factorial k) 
         (factorial (- n k)))))

(define (binom p n k)
  (* (nük n k) 
     (expt p k) 
     (expt (- 1 p) (- n k))))

(define (spielfähig p n min_spieler) 
  (apply + 
         (map (lambda (k) (binom p n k)) 
              (iota (1+ (- n min_spieler)) min_spieler))))

To use this with exact math, I just need to call it with p as exact number:

(use-modules (spielfaehig))
(spielfähig #e.03 4000 70)
;           ^ note the #e - this means to use an exact representation
;                           of the number

; To make Guile show a float instead of some huge division, just
; convert the number to an inexact representation before showing it.
(format #t "~A\n" (exact->inexact (spielfähig #e.03 4000 70)))

And that’s it. Automagic hassle-free exact math is at my fingertips.

It just works and uses less then 200 MiB of memory - even though the intermediate factorials return huge numbers. And huge means huge. It effortlessly handles numbers with a size on the order of 108000. That is 10 to the power of 8000 - a number with 8000 digits.

4 The Answer

42! :)

The real answer is 0.0125: That’s the maximum length we need to choose for short links to get more than a 95% probability that in a network of 4000 nodes there are at most 5 nodes for which there are less than 70 peers with a distance of at most the maximum length.

If we can assume 5000 nodes, then 0.01 is enough. And since this is the number we directly got from an analysis of our link length distribution, it is the better choice, though it will mean that people with huge bandwidth cannot always max out their 100 connections.

5 Conclusion

Most of the time, floats are OK. But there are the times when you simply need exact math.

In these situations Guile Scheme is a lifesaver.

Dear GNU Hackers, thank you for this masterpiece!

And if you were crazy enough to read till here, Happy Hacking to you!

AnhangGröße
2014-07-21-Mo-exact-math-to-the-rescue-guile-scheme.org4.41 KB

Exploring the probability of successfully retrieving a file in freenet, given different redundancies and chunk lifetimes

In this text I want to explore the behaviour of the degrading yet redundant anonymous file storage in Freenet. It only applies to files which were not subsequently retrieved.

Every time you retrieve a file, it gets healed which effectively resets its timer as far as these calculations here are concerned. Due to this, popular files can and do live for years in freenet.

1 Static situation

Firstoff we can calculate the retrievability of a given file with different redundancy levels, given fixed chunk retrieval probabilities.

Files in Freenet are cut into segments which are again cut into up to 256 chunks each. With the current redundancy of 100%, only half the chunks of each segment have to be retrieved to get the whole file. I call that redundancy “2x”, because it inserts data 2x the size of the file (actually that’s just what I used in the code and I don’t want to force readers - or myself - to make mental jumps while switching from prose to code).

We know from the tests done by digger3, that after 31 days about 50% of the chunks are still retrievable, and after 30 days about 30%. Let’s look how that affects our retrieval probabilities.

# encoding: utf-8
from spielfaehig import spielfähig
from collections import defaultdict
data = []
res = []
for chunknumber in range(5, 105, 5):...
byred = defaultdict(list)
for num, prob, red, retrieval in data:...
csv = "; num prob retrieval"
for red in byred:...

# now plot the files

plotcmd = """
set term png
set width 15
set xlabel "chunk probability"
set ylabel "retrieval probability"
set output freenet-prob-redundancy-2.png
plot "2.csv" using 2:3 select ($1 == 5) title "5 chunks", "" using 2:3 select ($1 == 10) title "10 chunks", "" using 2:3 select ($1 == 30) title "30 chunks", "" using 2:3 select ($1 == 100) title "100 chunks"
set output freenet-prob-redundancy-3.png
plot "3.csv" using 2:3 select ($1 == 5) title "5 chunks", "" using 2:3 select ($1 == 10) title "10 chunks", "" using 2:3 select ($1 == 30) title "30 chunks", "" using 2:3 select ($1 == 100) title "100 chunks"
set output freenet-prob-redundancy-4.png
plot "4.csv" using 2:3 select ($1 == 5) title "5 chunks", "" using 2:3 select ($1 == 10) title "10 chunks", "" using 2:3 select ($1 == 30) title "30 chunks", "" using 2:3 select ($1 == 100) title "100 chunks"
"""
with open("plot.pyx", "w") as f:...

from subprocess import Popen
Popen(["pyxplot", "plot.pyx"])

So what does this tell us?

./freenet-prob-redundancy-2.png

Retrieval probability of a given file in a static case. redundancy 100% (2)

redundancy 200% (3)

Retrieval probability of a given file in a static case. redundancy 200% (3)

redundancy 300% (4)

Retrieval probability of a given file in a static case. redundancy 300% (4)

This looks quite good. After all, we can push the lifetime as high as we want by just increasing redundancy.

Sadly it is also utterly wrong :) Let’s try to get closer to the real situation.

2 Dynamic Situation: The redundancy affects the replacement rate of chunks

To find a better approximation of the effects of increasing the redundancy, we have to stop looking at freenet as a fixed store and have to start seeing it as a process. More exactly: We have to look at the replacement rate.

2.1 Math

A look on the stats from digger3 shows us, that after 4 weeks 50% of the chunks are gone. Let’s call this the dropout rate. The dropout rate consists of churn and chunk replacement:

dropout = churn + replacement

Since after one day the dropout rate is about 10%, I’ll assume that the churn is lower than 10%. So for the following parts, I’ll just ignore the churn (naturally this is wrong, but since the churn is not affected by redundancy, I just take it as constant factor. It should reduce the negative impacts of increasing redundancy). So we will only look at replacement of blocks.

Replacement consists of new inserts and healing of old files.

replacement = insert + healing

If we increase the redundancy from 2 to 3, the insert and healing rate should both increase by 50%, so the replacement rate should increase by 50%, too. The healing rate might increase a bit more, because healing can now restore 66% of the file as long as at least 33% are available. I’ll ignore that, too, for the time being (which is wrong again. We will need to keep this in mind when we look at the result).

redundancy 2 → 3 ⇒ replacement rate × 1.5

Increasing the replacement rate by 50% should decrease the lifetime of chunks by 1/1.5, or:

chunk lifetime × 2/3

So we will be at the 50% limit not after 4 weeks, but after 10 days. But on the other hand, redundancy 3 only needs 33% chunk probability, which has 2× the lifetime of 50% chunk probability. So the file lifetime should change by 2×2/3 = 4/3:

file lifetime × 4/3 = file lifetime +33%

Now doesn’t that look good?

As you can imagine, this pretty picture hides a clear drawback: The total storage capacity of Freenet gets reduced by 33%, too, because now every file requires 1.5× as much space as before.

2.2 Caveats (whoever invented that name? :) )

We ignored churn, so the chunk lifetime reduction should be a bit less than the estimated 33%%. That’s good and life is beautiful, right? :)

NO. We also ignored the increase in the healing rate. This should be higher, because every retrieved file can now insert more of itself in the healing process. If we had no new inserts, I would go as far as saying that the healing-rate might actually double with the increased redundancy. So in a network completely filled network without new data, the effects of the higher redundancy and the higher replacement rate would exactly cancel. But the higher redundancy would be able to store less files. Since we are constantly pushing new data into the network (for example via discussions in Sone), this should not be the case.

2.3 Dead space

Aside from hiding some bad effects, this simple model also hides a nice effect: A decreased amount of dead space.

Firstoff, lets define it:

2.4 What is dead space?

Dead space is the part of the storage space which cannot be used for retrieving files. With any redundancy, that dead space is just about the size of the original file without redundancy multiplier. So for redundancy 2, the storage space occupied by the file is dead, when less than 50% are available. With redundancy 3, it is dead when less than 33% are available.

2.5 Effect

That dead space is replaced like any other space, but it is never healed. So the higher replacement rate means that dead space is recovered more quickly. So, while a network with higher redundancy can store less files overall, those files which can no longer be retrieved take up less space. I won’t add the math for that, here, though (because I did not do that yet).

2.6 Closing

So, as closing remark, we can say that increasing the redundancy will likely increase the lifetime of files. It will also reduce the overall storage space in Freenet, though. I think it would be worthwhile.

It might also be possible to give probability estimates in the GUI which show how likely it is that we can retrieve a given file after a few percent were downloaded: If more than 1/redundancy chunks succeed, the probability to get the file is high. if close to 1/redundancy succeed, the file will be slow, because we might have to wait for nodes which went online and will come back at some point. Essentially we will have to hope for churn. If much less than 1/redundancy of the chunks succeed, we can stop trying to get the file.

Just use the code in here for that :)

3 Background and deeper look

Why redundancy after all redundancy 1: 1 chunk fails ⇒ file fails. redundancy 2: 50% redundancy 3: 33%

3.1 No redundancy

Let’s start with redundancy 1. If one chunk fails, the whole file fails.

Compared to freenet today the replacement rate would be halved, because each file takes up only half the current space. So the 50% dead chunks rate would be reached after 8 weeks instead of after 4 weeks. And 90% would be after 2 days instead of after 1 day. We can guess that 99% would be after a few hours.

Let’s take a file with 100 chunks as example. That’s 100× 32 kiB, or about 3 Megabyte. After a few hours the chance will be very high that it will have lost one chunk and will be irretrievable. Freenet will still have 99% of the chunks, but they will be wasted space, because the file cannot be recovered anymore. The average lifetime of a file will just be a few hours.

With 99% probability of retrieving a chunk, the probability of retrieving a file will be only about 37%.

from spielfaehig import spielfähig
return spielfähig(0.99, 100, 100)
→ 0.366032341273

To achieve 90% retrievability of the file, we need a chunk availability of 99,9%! The file is essentially dead directly after the insert finishes.

from spielfaehig import spielfähig
return spielfähig(0.999, 100, 100)
→ 0.904792147114

3.2 1% redundancy

Now, lets add one redundant chunk. Almost nothing will have changed for inserting and replacing, but now the probability of retrieving the file when the chunks have 99% availability is 73%!

from spielfaehig import spielfähig
return spielfähig(0.99, 101, 100)
→ 0.732064682546

The replacement rate is increased by 1%, as is the storage space.

To achieve 90% retrievability, we actually need a chunk availability of 99,5%. So we might have 90% retrievability one hour after the insert.

from spielfaehig import spielfähig
return spielfähig(0.995, 101, 100)
→ 0.908655654736

Let’s check for 50%: We need a chunk probability of about 98,4%

from spielfaehig import spielfähig
return spielfähig(0.984, 101, 100)
→ 0.518183035909

The mean lifetime of a file changed from about zero to a few hours.

3.3 50% redundancy

Now, let’s take a big step: redundancy 1.5. Now we need 71,2% block retrievability to have a 90% chance of retrieving one file.

from spielfaehig import spielfähig
return spielfähig(0.712, 150, 100)
→ 0.904577767501

for 50% retrievability we need 66,3% chunk availability.

from spielfaehig import spielfähig
return spielfähig(0.663, 150, 100)
→ 0.500313163333

66% would be reached in the current network after about 20 days (between 2 weeks and 4 weeks), and in a zero redundancy network after 40 days. fetch-pull-stats

At the same time, though, the chunk replacement rate increased by 50%, so the mean chunk lifetime decreased by factor 2/3. So the lifetime of a file would be 4 weeks.

3.4 Generalize this

So, now we have calculations for redundancy 1, 1.5, 2 and 3. Let’s see if we can find a general (if approximate) rule for redundancy.

From the fetch-pull-graph from digger3 we see empirically, that between one week and 18 weeks each doubling of the lifetime corresponds to a reduction of the chunk retrieval probability of 15% to 20%.

Also we know that 50% probability corresponds to 4 weeks lifetime.

And we know that redundancy x has a minimum required chunk probability of 1/x.

With this, we can model the required chunk lifetime as a function of redundancy:

chunk lifetime = 4 * 2**((0.5-1/x)/0.2)

with x as redundancy. Note: this function is purely empirical and approximate.

Having the chunk lifetime, we can now model the lifetime of a file as a function of its redundancy:

file lifetime = (2/x) * 4 * (2**((0.5-1/x)/0.2))

We can now use this function to find an optimum of the redundancy if we are only concerned about file lifetime. Naturally we could get the trusty wxmaxima and get the derivative of it to find the maximum. But that is not installed right now, and my skills in getting the derivatives by hand are a bit rusty (note: install running). So we just do it graphically. The function is not perfectly exact anyway, so the errors introduced by the graphic solution should not be too big compared to the errors in the model.

Note however, that this model is only valid in the range between 20% and 90% chunk retrieval probability, because the approximation for the chunk lifetime does not hold anymore for values above that. Due to this, redundancy values close to or below 1 won’t be correct.

Also keep in mind that it does not include the effect due to the higher rate of removing dead space - which is space that belongs to files which cannot be recovered anymore. This should mitigate the higher storage requirement of higher redundancy.

# encoding: utf-8
plotcmd = """
set term png
set width 15
set xlabel "redundancy"
set ylabel "lifetime [weeks]"
set output "freenet-prob-function.png"
set xrange [0:10]
plot (2/x) * 4 * (2**((0.5-1/x)/0.2))
"""
with open("plot.pyx", "w") as f:...

from subprocess import Popen
Popen(["pyxplot", "plot.pyx"])

4 Summary: Merit and outlook

Now, what do we make of this?

Firstoff: If the equations are correct, an increase in redundancy would improve the lifetime of files by a maximum of almost a week. Going further reduces the lifetime, because the increased replacement of old data outpaces the improvement due to the higher redundancy.

Also higher redundancy needs a higher storage capacity, which reduces the overall capacity of freenet. This should be partially offset by the faster purging of dead storage space.

The results support an increase in redundancy from 2 to 3, but not to 4.

Well, and aren’t statistics great? :)

Additional notes: This exploration ignores:

  • healing creates less insert traffic than new inserts by only inserting failed segments, and it makes files which get accessed regularly live much longer,
  • inter-segment redundancy improves the retrieving of files, so they can cope with a retrievability of 50% of any chunks of the file, even if the distribution might be skewed for a single segment,
  • Non-uniformity of the network which makes it hard to model effects with global-style math like this,
  • Seperate stores for SSK and CHK keys, which improve the availability of small websites and
  • Usability and security impact of increased insert times (might be reduced by only inserting 2/3rd of the file data and letting healing do the rest when the first downloader gets the file)

Due to that, the findings can only provides clues for improvements, but cannot perfectly predict the best path of action. Thanks to evanb for pointing them out!

If you are interested in other applications of the same theory, you might enjoy my text Statistical constraints for the design of roleplaying games (RPGs) and campaigns (german original: Statistische Zwänge beim Rollenspiel- und Kampagnendesign). The script spielfaehig.py I used for the calculations was written for a forum discussion which evolved into that text :)

This text was written and checked in emacs org-mode and exported to HTML via `org-export-as-html-to-buffer`. The process integrated research and documentation. In hindsight, that was a pretty awesome experience, especially the inline script evaluation. I also attached the org-mode file for your leisure :)

AnhangGröße
freenet-prob-redundancy-2.png67.05 KB
freenet-prob-redundancy-3.png65.67 KB
freenet-prob-redundancy-4.png63.43 KB
freenet-success-probability.org14.84 KB
freenet-prob-function.png20.5 KB
fetch_dates_graph-2012-03-16.png17.25 KB
spielfaehig.py.txt1.15 KB

Freenet / Hyphanet: The forgotten cypherpunk paradise

PDF

PDF (to print)

Org (source)

Text (for email)

A long time ago in a chatroom far away, select groups of crypto-anarchists gathered to discuss the death of privacy since the NSA could spy on all communications with ease. Among those who proposed technical solutions was a student who later published the widely regarded first paper on Freenet: A decentralized anonymous datastore which was meant to be a cypherpunk paradise: true censorship resistance, no central authority and long lifetime only for information which people were actually interested in.

Many years passed, two towers fell, the empire expanded its hunt for rebels all over the globe, and now, as the empire’s grip has become so horrid that even the most loyal servants of the emperors turn against them and expose their dark secrets to the masses, Freenet is still moving forward. Lost to the eye of the public, Freenet shaped and reshaped itself - all the while maintaining its focus to provide true freedom of the press in the internet.

A new old hope

Once only a way to anonymously publish one-shot websites that other members of the group could see, Freenet now provides its users with most services found in the normal internet, yet safe from the prying eyes of the empire. Its users communicate with each other using email which hides metadata, micro-blogging with real anonymity, forums on a wide number of topics - from politics to drug-experiences - and websites with update-notifications (howto) and streaming media (howto) whose topics span from music and anime over religion and programming to life without a state, spaceflight and news feeds.

All these possibilities emerge from its decentralized datastore and the tools built on top of a practically immutable data structure, and all its goals emerge from providing real freedom of the press. Decentralization is required to avoid providing a central place for censorship. Anonymity is needed to protect people against censorship by threat of subsequent punishment, prominently used in China where it is only illegal to write something against the state if too many people should happen to read it. Private communication is needed to allow whistleblowers to contact journalists and also to discuss articles before publication, invisible access to information makes it hard to censor articles by making everyone a suspect who reads one of those articles, as practiced by the NSA which puts everyone on the watchlist who accesses freenetproject.org or the Linux Journal (reported by german public TV program Panorama). And all this has to be convenient enough that journalists can actually use it during their quite stressful daily work. As side effect it provides true online freedom, because if something is safe enough for a whistleblower, it is likely safe enough for most other communication, too.

These goals pushed Freenet development into areas which other groups only touched much later - or not at all. And except for convenience, which is much harder to get right in a privacy-sensitive context than it seems, Freenet nowadays manages to fulfill these goals very well.

The empire strikes the web

The cloud was “invented” and found to be unsafe, yet Freenet already provided its users with a safe cloud. Email was found to spill all your secrets, while Freenet already provided its users with privacy preserving emails. Disaster control became all the rage after hurricane Katrina and researchers scrambled to find solutions for communicating on restricted routes, and Freenet already provided a globally connectable darknet on friend-to-friend connections. Blogs drowned in spam comments and most caved in and switched to centralized commenting solutions, which made the fabled blogosphere into little more than a PR outlet for Facebook, but Freenet already provided spam resistance via an actually working web of trust - after seeing the non-spam-resistant forum system Frost burn when some trolls realized that true anonymity also means complete freedom to use spam-bots. Censorship and total surveillance of user behavior on Facebook were exposed, G+ required users to use their real names and Twitter got blocked in many repressive regimes, whereas Freenet already provided hackers with convenient, decentralized, anonymous micro-blogging. Now websites are cracked by the minute and constant attacks made it a chore for private webmasters simply to stay available, though Freenet already offers attack-resistant hosting which stays online as long as people are interested in the content.

All these developments happened in a private microcosmos, where new and strange ideas could form and hatch, an incubator where reality could be rethought and rewritten to reestablish privacy in the internet. The internet was hit hard, and Freenet evolved to provide a refuge for those who could use it.

The return of privacy

What started as the idea of a student was driven forward by about a dozen free-time coders and one paid developer for more than a decade - funded by donations from countless individuals - and turned into a true forgotten cryptopunk paradise: actual working solutions to seemingly impossible problems, highly detailed documentation streams in a vast nothingness to be explored only by the initiated (where RTFS is a common answer: Read The Friendly Source), all this with plans and discussions about saving the world mixed in.

The practical capabilities of Freenet should be known to every cryptopunk - but a combination of mediocre user experience, bad communication and worse PR (and maybe something more sinister, if Poul-Henning Kamp should prove to be farsighted about project Orchestra) brought us to a world where a new, fancy, half finished, partially thought through, cash-cow searching project comes around and instead of being asked “how’s that different from Freenet?”, the next time I talk to a random crypto-loving stranger about Freenet I am asked “how is Freenet different from X which just made the news?” (the answer which fits every single time is: “Even if X should work, it would provide only half of Freenet, and missing essential features - friend-to-friend darknet, access dependent content lifetime, decentralized spam resistance, stable pseudonyms, protection against forced exposure, hosting without a server”).

Now, after many years of work have culminated in a big step forward, it is time for Freenet to re-emerge from hiding and take its place as one of the few privacy tools actually proven to work - and as the single tool with the most ambitious goal: Reestablishing freedom of the press and freedom of speech in the internet.

Freenet re-awakens: Join in

If you do not have the time for large scale contribution, a good way to support freenet is to run and use it - and ask your friends to join in, ideally over darknet.

Freenet Logo: Follow the RabbitFreenet Logo: Follow the RabbitInstall Freenet

More information about the movement which spawned Freenet can be found in Wikipedia under Cypherpunk.

If you can program, there are lots of low hanging fruit: small tasks which allow reaping the fruits of existing solutions to hard problems. Or, if you want to harness Freenet for your own tools, have a look at the Freenet Communication Primitives.

My recent work on freenet includes 4 hours of hacking the Python-based site uploader in pyFreenet which sped up the load time of its sites by up to a factor of 4. If you want to join, come to #freenet @ freenode to chat, discuss with us in the freenet devl mailing list and check the github-project.

Freenet Logo: Follow the Rabbit Welcome to Freenet, where no one can watch you read. → freenetproject.org

Creative Commons License

I hereby release this article under the CC attribution License: You can use the text however you like as long as you name me (Arne Babenhauserheide) and link here ( draketo.de/english/freenet/forgotten-cryptopunk-paradise or draketo.de/node/656 ).

A huge thank you goes to Lacrocivious who helped me improve this text a lot! A second thank you goes to the other Freenet users with whom I discussed the article via Darknet-messages, when we were still thinking about submitting it to Wired and therefore needed to keep it confidential.

AnhangGröße
2014-08-24-So-freenet-forgotten-cryptopunk-paradise.pdf85.01 KB
freenet-forgotten-cryptopunk-paradise-mail.txt8.4 KB
freenet-forgotten-cryptopunk-paradise-pdf-thumb.png8.51 KB
2014-08-24-So-freenet-forgotten-cryptopunk-paradise.org7.93 KB
freenet_logo.png2.26 KB

Freenet Communication Primitives: Part 1, Files and Sites

Basic building blocks for communication in Freenet.

This is a guide to using Freenet as backend for communication solutions - suitable for anything from filesharing over chat up to decentrally hosted game content like level-data. It uses the Python interface to Freenet for its examples.

TheTim from Tim Moore, licensed under cc by
TheTim
from Tim Moore,
License: cc by.

This guide consists of several installments: Part 1 (this text) is about exchanging data, Part 2 is about confidential communication and finding people and services without drowning in spam and Part 3 ties it all together by harnessing existing plugins which already include all the hard work which distinguishes a quick hack from a real-world system. Happy Hacking and welcome to Freenet, the forgotten cypherpunk paradise where no one can watch you read!

1 Introduction

The immutable datastore in Freenet provides the basic structures for implementing distributed, pseudonymous, spam-resistant communication protocols. But until now there was no practically usable documentation how to use them. Every new developer had to find out about them by asking, speculating and second guessing the friendly source (also known as SGTFS).

We will implement the answers using pyFreenet. Get it from http://github.com/freenet/pyFreenet

We will not go into special cases. For these have a look at the API-documentation of fcp.node.FCPNode().

1.1 Install pyFreenet

To follow the code examples in this article, install Python 2 with setuptools and then run

easy_install --user --egg pyFreenet==0.4.0

2 Sharing a File: The CHK (content hash key)

The first and simplest task is sharing a file. You all know how this works in torrents and file hosters: You generate a link and give that link to someone else.

To create that link, you have to know the exact content of the file beforehand.

import fcp
n = fcp.node.FCPNode()
key = n.put(data="Hello Friend!")
print key
n.shutdown()

Just share this key, and others can retrieve it. Use http://127.0.0.1:8888/ as prefix, and they can even click it - if they run Freenet on their local computer or have an SSH forward for port 8888.

The code above only returns once the file finished uploading. The Freenet Client Protocol (that’s what fcp stands for) however is asynchronous. When you pass async=True to n.put() or n.get(), you get a job object which gives you the result via job.wait().

To generate the key without actually uploading the file, use chkonly=True as argument to n.put().

Let’s test retrieving a file:

import fcp
n = fcp.node.FCPNode()
key = n.put(data="Hello Friend!")
mime, data, meta = n.get(key)
print data
n.shutdown()

This code anonymously uploads an invisible file into Freenet which can only be retrieved with the right key. Then it downloads the file from Freenet using the key and shows the data.

That the put and the get request happen from the same node is a mere implementation detail: They could be fired by total strangers on different sides of the globe and would still work the same. Even the performance would be similar.

Note: fcp.node.FCPNode() opens a connection to the Freenet node. You can have multiple of these connections at the same time, all tracking their own requests without interfering with each other. Just remember to call n.shutdown() on each of them to avoid getting ugly backtraces.

So that’s it. We can upload and download files, completely decentrally, anonymously and confidentially.

There’s just one caveat: We have to exchange the key. And to generate that key, we have to know the content of the file.

Let’s fix that.

3 Public/Private key publishing: The SSK (signed subspace key)

Our goal is to create a key where we can upload a file in the future. We can generate this key and tell someone else: Watch this space.

So we will generate a key, start to download from the key and insert the file to the key afterwards.

import fcp
n = fcp.node.FCPNode()
# we generate a key with the additional filename hello.
public, private = n.genkey(name="hello")
job = n.get(public, async=True)
n.put(uri=private, data="Hello Friend!")
mime, data, meta = job.wait()
print data
n.shutdown()

These 8 lines of code create a key which you could give to a friend. Your friend will start the download and when you get hold of that secret hello-file, you upload it and your friend gets it.

Hint: If you want to test whether the key you give is actually used, you can check the result of n.put(). It returns the key with which the data can be retrieved.

Using the .txt suffix makes Freenet use the mimetype text/plain. Without extension it will use application/octet-stream.

If you start downloading before you upload as we do here, you can trigger a delay of about half an hour due to overload protections (the mechanism is called “recently failed”).

Note that you can only write to a given key-filename combination once. If you try to write to it again, you’ll get conflicts – your second upload will in most cases just not work. You might recognize this from immutable datastructures (without the conflict stuff). Freenet is the immutable, distributed, public/private key database you’ve been phantasizing about when you had a few glasses too many during that long night. So best polish your functional programming skills. You’re going to use them on the level of practical communication.

3.1 short roundtrip time (speed hacks)

A SSK is a special type of key, and similar to inodes in a filesystem it can carry data. But if used in the default way, it will forward to a CHK: The file is salted and then inserted to a CHK which depends on the content and then some, ensuring that the key cannot be predicted from the data (this helps avoid some attacks against your anonymity).

When we want a fast round trip time, we can cut that. The condition is that your data plus filename is less than 1KiB after compression, the amount of data a SSK can hold. And we have to get rid of the metadata. And that means: With pyFreenet use the application/octet-stream mime type, because that’s the default one, so it is left out on upload. If you use raw access to FCP, omit Metadata.ContentType or set it to "". And insert single files (we did not yet cover uploading folders: You can do that, but they will forward to a CHK).

import fcp
n = fcp.node.FCPNode()
# we generate a key with the additional filename hello.
public, private = n.genkey(name="hello.txt")
job = n.get(public, async=True, realtime=True, priority=0)
n.put(uri=private, data="Hello Friend!", mimetype="application/octet-stream", realtime=True, priority=0)
mime, data, meta = job.wait()
print public
print data
n.shutdown()

To check whether we managed to avoid the metadata, we can use the KeyUtils plugin to analyze the key.

If it is right, when putting the key into the text field on the http://127.0.0.1:8888/KeyUtils/ site, you’ll see something like this:

0000000: 4865 6C6C 6F20 4672 6965 6E64 21
         Hello Friend!

Also we want to use realtime mode (optimized for the webbrowser: reacting quickly but with low throughput) with a high priority.

Let’s look at the round trip time we achieve:

import time
import fcp
n = fcp.node.FCPNode()
# we generate two keys with the additional filename hello.
public1, private1 = n.genkey(name="hello1.txt")
public2, private2 = n.genkey(name="hello2.txt")
starttime = time.time()
job1 = n.get(public1, async=True, realtime=True, priority=1)
job2 = n.get(public2, async=True, realtime=True, priority=1)
n.put(uri=private1, data="Hello Friend!",
      mimetype="application/octet-stream",
      realtime=True, priority=1)
mime, data1, meta = job1.wait()
n.put(uri=private2, data="Hello Back!",
      mimetype="application/octet-stream",
      realtime=True, priority=1)
mime, data2, meta = job2.wait()
rtt = time.time() - starttime
n.shutdown()
print public1
print public2
print data1
print data2
print "RTT (seconds):", rtt

When I run this code, I get less than 80 seconds round trip time. Remember that we’re uploading two files anonymously into a decentralized network, discover them and then download them, and all that in serial. Less than a minute to detect an upload to known key.

90s is not instantaneous, but when looking at usual posting frequencies in IRC and other chat, it’s completely sufficient to implement a chat system. And in fact it’s how FLIP is implemented: IRC over Freenet.

Compare this to the performance when we do not use the short round trip time trick of avoiding the Metadata and using the realtime queue:

import time
import fcp
n = fcp.node.FCPNode()
# we generate two keys with the additional filename hello.
public1, private1 = n.genkey(name="hello1.txt")
public2, private2 = n.genkey(name="hello2.txt")
starttime = time.time()
job1 = n.get(public1, async=True)
job2 = n.get(public2, async=True)
n.put(uri=private1, data="Hello Friend!")
mime, data1, meta = job1.wait()
n.put(uri=private2, data="Hello Back!")
mime, data2, meta = job2.wait()
rtt = time.time() - starttime
n.shutdown()
print public1
print public2
print data1
print data2
print "RTT (seconds):", rtt

With 300 seconds (5 minutes), that’s more than 3x slower. So you see, if you have small messages and you care about latency, you want to do the latency hacks.

4 Upload Websites: SSK as directory

So now we can upload single files, but the links look a lot like what we see on websites: http://127.0.0.1:8888/folder/file. So can we just mirror a website? The answer is: Yes, definitely!

import fcp
n = fcp.node.FCPNode()
# We create a key with a directory name
public, private = n.genkey() # no filename: we need different ones
index = n.put(uri=private + "index.html",
      data='''<html>
  <head>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>First Site!</title></head>
  <body>Hello World!</body></html>''')
n.put(uri=private + "style.css", 
      data='body {color: red}\n')
print index
n.shutdown()

Now we can navigate to the key in the freenet web interface and look at our freshly uploaded website! The text is colored red, so it uses the stylesheet. We have files in Freenet which can reference each other by relative links.

4.1 Multiple directories below an SSK

So now we can create simple websites on an SSK. But here’s a catch: key/hello/hello.txt simply returns key/hello. What if we want multiple folders?

For this purpose, Freenet provides manifests instead of single files. Manifests are tarballs which include several files which are then downloaded together and which can include references to external files - named redirects. They can be uploaded as folders into the key. And in addition to these, there are quite a few other tricks. Most of them are used in freesitemgr which uses fcp/sitemgr.py.

But we want to learn how to do it ourselves, so let’s do a more primitive version manually via n.putdir():

import os
import tempfile

import fcp
n = fcp.node.FCPNode()
# we create a key again, but this time with a name: The folder of the
# site: We will upload it as a container.
public, private = n.genkey()
# now we create a directory
tempdir = tempfile.mkdtemp(prefix="freesite-")
with open(os.path.join(tempdir, "index.html"), "w") as f:
    f.write('''<html>
    <head>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>First Site!</title></head>
    <body>Hello World!</body></html>''')

with open(os.path.join(tempdir, "style.css"), "w") as f:
    f.write('body {color: red}\n')

uri = n.putdir(uri=private, dir=tempdir, name="hello", 
               filebyfile=True, allatonce=True, globalqueue=True)
print uri
n.shutdown()

That’s it. We just uploaded a folder into Freenet.

But now that it’s there, how do we upload a better version? As already said, files in Freenet are immutable. So what’s the best solution if we can’t update the data, but only upload new files? The obvious solution would be to just number the site.

And this is how it was done in the days of old. People uploaded hello-1, hello-2, hello-3 and so forth, and in hello-1 they linked to an image under hello-2. When visitors of hello-1 saw that the image loaded, they knew that there was a new version.

When more and more people adopted that, Freenet added core support: USKs, the updatable subspace keys.

We will come to that in the next part of this series: Service Discovery and Communication.

AnhangGröße
thetim-tim_moore-flickr-cc_by-2471774514_8c9ed2a7e5_o-276x259.jpg19.79 KB

Freenet Communication Primitives: Part 2, Service Discovery and Communication

Basic building blocks for communication in Freenet.

This is a guide to using Freenet as backend for communication solutions - suitable for anything from filesharing over chat up to decentrally hosted game content like level-data. It uses the Python interface to Freenet for its examples.

Mirror, Freenet Project, Arne Babenhauserheide, GPL
Mirror,
Freenet Project,
License: GPL.

This guide consists of several installments: Part 1 is about exchanging data, Part 2 is about confidential communication and finding people and services without drowning in spam and Part 3 ties it all together by harnessing existing plugins which already include all the hard work which distinguishes a quick hack from a real-world system (this is currently a work in progress, implemented in babcom_cli which provides real-world usable functionality).

Note: You need the current release of pyFreenet for the examples in this article (0.3.2). Get it from PyPI:

# with setuptools
easy_install --user --egg pyFreenet==0.4.0
# or pip
pip install --user --egg pyFreenet==0.4.0

This is part 2: Service Discovery and Communication. It shows how to find new people, build secure communication channels and create community forums. Back when I contributed to Gnutella, this was the holy grail of many p2p researchers (I still remember the service discovery papers). Here we’ll build it in 300 lines of Python.

Welcome to Freenet, where no one can watch you read!

USK: The Updatable Subspace Key

USKs allow uploading increasing versions of a website into Freenet. Like numbered uploads from the previous article they simply add a number to site, but they automate upload and discovery of new versions in roughly constant time (using Date Hints and automatic checking for new versions), and they allow accessing a site as <key>/<name>/<minimal version>/ (never understimate the impact of convenience!).

With this, we only need a single link to provide an arbitrary number of files, and it is easy and fast to always get the most current version of a site. This is the ideal way to share a website in Freenet. Let’s do it practically.

import os
import tempfile

import fcp
n = fcp.node.FCPNode()
# we create a key again, but this time with a name: The folder of the
# site: We will upload it as a container.
public, private = n.genkey()
# now we create a directory
tempdir = tempfile.mkdtemp(prefix="freesite-")
with open(os.path.join(tempdir, "index.html"), "w") as f:
    f.write('''<html>
    <head>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>First Site!</title></head>
    <body>Hello World!</body></html>''')

with open(os.path.join(tempdir, "style.css"), "w") as f:
    f.write('body {color: red}\n')

uri = n.putdir(uri=private, dir=tempdir, name="hello",
               filebyfile=True, allatonce=True, globalqueue=True,
               usk=True)
print uri
n.shutdown()

But we still need to first share the public key, so we cannot just tell someone where to upload the files so we see them. Though if we were to share the private key, then someone else could upload there and we would see it in the public key. We could not be sure who uploaded there, but at least we would get the files. Maybe we could even derive both keys from a single value… and naturally we can. This is called a KSK (old description).

KSK: Upload a file to a password

KSKs allow uploading a file to a pre-determined password. The file will only be detectable for those who know the password, so we have effortless, invisible, password protected files.

import fcp
import uuid # avoid spamming the global namespace

n = fcp.node.FCPNode()
_uuid = str(uuid.uuid1())
key = "KSK@" + _uuid
n.put(uri=key, data="Hello World!",
      Global=True, persistence="forever",
      realtime=True, priority=1)
print key
print n.get(key)[1]
n.shutdown()

Note: We’re now writing a communication protocol, so we’ll always use realtime mode. Be aware, though, that realtime is rate limited. If you use it for large amounts of data, other nodes will slow down your requests to preserve quick reaction of the realtime queue for all (other) Freenet users.

Note: Global=True and

persistence="forever"

allows telling Freenet to upload some data and then shutting down the script. Use async=True and waituntilsent=True to just start the upload. When the function returns you can safely exit from the script and let Freenet upload the file in the background - if necessary it will even keep uploading over restarts. And yes, Capitcalized Global looks crazy. For pyFreenet that choice is sane (though not beautiful), because Global gets used directly as parameter in the Freenet Client Protocol (FCP). This is the case for many of the function arguments. In putdir() there’s a globalqueue parameter which also sets persistence. That should become part of the put() API, but isn’t yet. There are lots of places where the pyFreenet is sane, but not beautiful. It seems like that’s its secret how it could keep working from 2008 till 2014 with almost no maintenance

For our purposes the main feature of KSKs is that we can tell someone to upload to an arbitrary phrase and then download that.

If we add a number, we can even hand out a password to multiple people and tell them to just upload to the first unused version. This is called the KSK queue.

KSK queue: Share files by uploading to a password

The KSK queue used to be the mechanism of choice to find new posts in forums, until spammers proved that real anonymity means total freedom to spam: they burned down the Frost Forum System. But we’ll build this, since it provides a basic building block for the spam-resistant system used in Freenet today.

Let’s just do it in code (descriptions are in the comments):

import fcp
import uuid # avoid spamming the global namespace

n = fcp.node.FCPNode()
_uuid = str(uuid.uuid1())
print "Hey, this is the password:", _uuid
# someone else used it before us
for number in range(2):
    key = "KSK@" + _uuid + "-" + str(number)
    n.put(uri=key, data="Hello World!", 
          Global=True, persistence="forever",
          realtime=True, priority=1,
          timeout=360) # 6 minutes
# we test for a free slot
for number in range(4):
  key = "KSK@" + _uuid + "-" + str(number)
  try:
    n.get(key, 
          realtime=True, priority=1, 
          timeout=60)
  except fcp.node.FCPNodeTimeout:
    break
# and write there
n.put(uri=key, data="Hello World!",
      Global=True, persistence="forever",
      realtime=True, priority=1,
      timeout=360) # 6 minutes
print key
print n.get(key)[1]
n.shutdown()

Note that currently a colliding put – uploading where someone else uploaded before – simply stalls forever instead of failing. This is a bug in pyFreenet. We work around it by giving an explicit timeout.

But it’s clear how this can be spammed.

And it might already become obvious how this can be avoided.

KSK queue with CAPTCHA

Let’s assume I do not tell you a password. Instead I tell you where to find a riddle. The solution to that riddle is the password. Now only those who are able to solve riddles can upload there. And each riddle can be used only once. This restricts automated spamming, because it requires an activity of which we hope that only humans can do it reliably.

In the clearweb this is known as CAPTCHA. For the examples in this guide a plain text version is much easier.

import fcp
import uuid # avoid spamming the global namespace

n = fcp.node.FCPNode()
_uuid = str(uuid.uuid1())
_uuid2 = str(uuid.uuid1())
riddlekey = "KSK@" + _uuid
riddle =  """
What goes on four legs in the morning,                          
two legs at noon, and three legs in the                         
evening?
A <answer>
"""
# The ancient riddle of the sphinx
n.put(uri=riddlekey, data="""To reach me, answer this riddle.

%s

Upload your file to %s-<answer>
""" % (riddle, _uuid2),
      Global=True, persistence="forever",
      realtime=True, priority=1)

print n.get(riddlekey, realtime=True, priority=1)[1]
answer = "human"
print "answer:", answer
answerkey = "KSK@" + _uuid2 + "-%s" % answer

n.put(uri=answerkey, data="Hey, it's me!",
      Global=True, persistence="forever",
      realtime=True, priority=1)

print n.get(answerkey, realtime=True, priority=1)[1]
n.shutdown()

Now we have fully decentralized, spam-resistant, anonymous communication.

Let me repeat that: fully decentralized, spam-resistant, anonymous communication.

The need to solve a riddle everytime we want to write is not really convenient, but it provides the core of the feature we need. Everything we now add just makes this more convenient and makes it scale for many-to-many communication.

(originally I wanted to use the Hobbit riddles for this, but I switched to the sphinx riddle to avoid the swamp of multinational (and especially german) quoting restrictions)

Convenience: KSK queue with CAPTCHA via USK to reference a USK

The first step to improve this is getting rid of the requirement to solve a riddle every single time we write to a person. The second is to automatically update the list of riddles.

For the first, we simply upload a public USK key instead of the message. That gives a potentially constant stream of messages.

For the second, we upload the riddles to a USK instead of to a KSK. We pass out this USK instead of a password. Let’s realize this.

To make this easier, let’s use names. Alice wants to contact Bob. Bob gave her his USK. The answer-uuid we’ll call namespace.

import fcp
import uuid # avoid spamming the global namespace
import time # to check the timing

tstart = time.time()
def elapsed_time():
    return time.time() - tstart


n = fcp.node.FCPNode()

bob_public, bob_private = n.genkey(usk=True, name="riddles")
alice_to_bob_public, alice_to_bob_private = n.genkey(usk=True, name="messages")
namespace_bob = str(uuid.uuid1())
riddle =  """
What goes on four legs in the morning,                          
two legs at noon, and three legs in the                         
evening?
A <answer>
"""
print "prepared:", elapsed_time()
# Bob uploads the ancient riddle of the sphinx
put_riddle = n.put(uri=bob_private,
                   data="""To reach me, answer this riddle.

%s

Upload your key to %s-<answer>
""" % (riddle, namespace_bob),
                   Global=True, persistence="forever",
                   realtime=True, priority=1, async=True,
                   IgnoreUSKDatehints="true") # speed hack for USKs.

riddlekey = bob_public
print "riddlekey:", riddlekey
print "time:", elapsed_time()
# Bob shares the riddlekey. We're set up.

# Alice can insert the message before telling Bob about it.
put_first_message = n.put(uri=alice_to_bob_private,
                          data="Hey Bob, it's me, Alice!",
                          Global=True, persistence="forever",
                          realtime=True, priority=1, async=True,
                          IgnoreUSKDatehints="true")

print "riddle:", n.get(riddlekey, realtime=True, priority=1, followRedirect=True)[1]
print "time:", elapsed_time()

answer = "human"
print "answer:", answer
answerkey = "KSK@" + namespace_bob + "-%s" % answer
put_answer = n.put(uri=answerkey, data=alice_to_bob_public,
                   Global=True, persistence="forever",
                   realtime=True, priority=1, async=True)

print ":", elapsed_time()
# Bob gets the messagekey and uses it to retrieve the message from Alice

# Due to details in the insert process (i.e. ensuring that the file is
# accessible), the upload does not need to be completed for Bob to be
# able to get it. We just try to get it.
messagekey_alice_to_bob = n.get(answerkey, realtime=True, priority=1)[1]

print "message:", n.get(uri=messagekey_alice_to_bob, realtime=True, priority=1,
                        followRedirect=True, # get the new version
                        )[1]

print "time:", elapsed_time()
# that's it. Now Alice can upload further messages which Bob will see.

# Bob starts listening for a more recent message. Note that this does
# not guarantee that he will see all messages.
def next_usk_version(uri):
    elements = uri.split("/")
    elements[2] = str(abs(int(elements[2])) + 1)
    # USK@.../name/N+1/...
    return "/".join(elements)

next_message_from_alice = n.get(
    uri=next_usk_version(messagekey_alice_to_bob),
    realtime=True, priority=1, async=True,
    followRedirect=True) # get the new version

print "time:", elapsed_time()
# Alice uploads the next version.
put_second_message = n.put(uri=next_usk_version(alice_to_bob_private),
                           data="Me again!",
                           Global=True, persistence="forever",
                           realtime=True, priority=1,
                           IgnoreUSKDatehints="true",
                           async=True)

# Bob sees it.
print "second message:", next_message_from_alice.wait()[1]
print "time:", elapsed_time()

print "waiting for inserts to finish"
put_riddle.wait()
put_answer.wait()
put_first_message.wait()
put_second_message.wait()
print "time:", elapsed_time()

n.shutdown()

From start to end this takes less than 2 minutes minutes, and now Alice can send Bob messages with roughly one minute delay.

So now we set up a convenient communication channel. Since Alice already knows Bobs key, Bob could simply publish a bob-to-alice public key there, and if both publish GnuPG keys, these keys can be hidden from others: Upload not the plain key, but encrypt the key to Bob, and Bob could encrypt his bob-to-alice key using the GnuPG key from Alice. By regularly sending themselves new public keys, they could even establish perfect forward secrecy. I won’t implement that here, because when we get to the third part of this series, we will simply use the Freemail and Web of Trust plugin which already provide these features.

This gives us convenient, fully decentralized, spam-resistant, anonymous communication channels. Setting up a communication channel to a known person requires solving one riddle (in a real setting likely a CAPTCHA, or a password-prompt), and then the channel persists.

Note: To speed up these tests, I added another speed hack: IgnoreUSKDatehints. That turns off Date Hints, so discovering new versions will no longer be constant in the number of intermediate versions. For our messaging system that does not hurt, since we don’t have many intermediate messages we want to skip. For websites however, that could lead your visitors to see several old versions before they finally get the most current version. So be careful with this hack - just like you should with the other speed hacks.

But if we want to reach many people, we have to solve one riddle per person, which just doesn’t scale. To fix this, we can publish a list of all people we trust to be real people. Let’s do that.

Many-to-many: KSK->CAPTCHA->USK->USK which is linked in the original USK

To enable (public) many-to-many communication, we propagate the information that we believe that someone isn’t a spammer and add a blacklist to get rid of people who suddenly start to spam.

The big change with this scheme is that there is two-step authentication: Something expensive (solving a riddle) gets you seen by a few people, and if you then contribute constructively in a social context, they mark you as non-spammer and you get seen by more people.

The clever part about that scheme is that socializing is actually no cost to honest users (that’s why we use things like Sone or FMS), while it is a cost to attackers.

Let’s take Alice and Bob again, but add Carol. First Bob introduces himself to Alice, then Carol introduces herself to Alice. Thanks to propagating the riddle-information, Carol can directly write to Bob, without first solving a riddle. Scaling up that means that you only need to prove a single time that you are no spammer (or rather: not disruptive) if you want to enter a community.

To make it easier to follow, we will implement this with a bit of abstraction: People have a private key, can introduce themselves and publish lists of messages. Also they keep a public list of known people and a list of people they see as spammers who want to disrupt communication.

I got a bit carried away while implementing this, but please bear with me: It’ll work hard to make it this fun.

The finished program is available as alice_bob_carol.py. Just download and run it with python alice_bob_carol.py.

Let’s start with the minimal structure for any pyFreenet using program:

import fcp

n = fcp.node.FCPNode() # for debugging add verbosity=5

<<body>>

n.shutdown()

The body contains the definitions of a person with different actors, an update step (as simplification I use global stepwise updates) as well as the setup of the communication. Finally we need an event loop to run the system.

<<preparation>>

<<person>>

<<update>>

<<setup>>

<<event_loop>>

We start with some imports – and a bit of fun :)

import uuid
import random
try:
    import chatterbot # let's get a real conversation :)
    # https://github.com/guntherc/ChatterBot/wiki/Quick-Start
    # get with `pip install --user chatterbot`
    irc_loguri = "USK@Dtz9FjDPmOxiT54Wjt7JwMJKWaqSOS-UGw4miINEvtg,cuIx2THw7G7cVyh9PuvNiHa1e9BvNmmfTcbQ7llXh2Q,AQACAAE/irclogs/1337/"
    print "Getting the latest IRC log as base for the chatterbot"
    IRC_LOGLINES = n.get(uri=irc_loguri, realtime=True, priority=1, followRedirect=True)[1].splitlines()
    import re # what follows is an evil hack, but what the heck :)
    p = re.compile(r'<.*?>')
    q = re.compile(r'&.*?;')
    IRC_LOGLINES = [q.sub('', p.sub('', str(unicode(i.strip(), errors="ignore"))))
                    for i in IRC_LOGLINES]
    IRC_LOGLINES = [i[:-5] for i in IRC_LOGLINES # skip the time (last 5 letters)
                    if (i[:-5] and # skip empty
                        not "spam" in i # do not trigger spam-marking
                    )][7:] # skip header 
except ImportError:
    chatterbot = None

The real code begins with some helper functions – essentially data definition.

def get_usk_namespace(key, name, version=0):
    """Get a USK key with the given namespace (foldername)."""
    return "U" + key[1:] + name + "/" + str(version) + "/"

def extract_raw_from_usk(key):
    """Get an SSK key as used to identify a person from an arbitrary USK."""
    return "S" + (key[1:]+"/").split("/")[0] + "/"

def deserialize_keylist(keys_data):
    """Parse a known file to get a list of keys. Reverse: serialize_keylist."""
    return [i for i in keys_data.split("\n") if i]

def serialize_keylist(keys_list):
    """Serialize the known keys into a text file. Reverse: parse_known."""
    return "\n".join(keys_list)

Now we can define a person. The person is the primary actor. To keep everything contained, I use a class with some helper functions.

class Person(object):
    def __init__(self, myname, mymessage):
        self.name = myname
        self.message = mymessage
        self.introduced = False
        self.public_key, self.private_key = n.genkey()
        print self.name, "uses key", self.public_key
        # we need a list of versions for the different keys
        self.versions = {}
        for name in ["messages", "riddles", "known", "spammers"]:
            self.versions[name] = -1 # does not exist yet
        # and sets of answers, watched riddle-answer keys, known people and spammers.
        # We use sets for these, because we only need membership-tests and iteration.
        # The answers contain KSKs, the others the raw SSK of the person.
        # watched contains all persons whose messages we read.
        self.lists = {}
        for name in ["answers", "watched", "known", "spammers", "knowntocheck"]:
            self.lists[name] = set()
        # running requests per name, used for making all persons update asynchronously
        self.jobs = {}
        # and just for fun: get real conversations. Needs chatterbot and IRC_LOGLINES.
        # this is a bit slow to start, but fun. 
        try:
            self.chatbot = chatterbot.ChatBot(self.name)
            self.chatbot.train(IRC_LOGLINES)
        except:
            self.chatbot = None


    def public_usk(self, name, version=0):
        """Get the public usk of type name."""
        return get_usk_namespace(self.public_key, name, version)
    def private_usk(self, name, version=0):
        """Get the private usk of type name."""
        return get_usk_namespace(self.private_key, name, version)

    def put(self, key, data):
        """Insert the data asynchronously to the key. This is just a helper to
avoid typing the realtime arguments over and over again.

        :returns: a job object. To get the public key, use job.wait(60)."""
        return n.put(uri=key, data=data, async=True,
                     Global=True, persistence="forever",
                     realtime=True, priority=1,
                     IgnoreUSKDatehints="true")

    def get(self, key):
        """Retrieve the data asynchronously to the key. This is just a helper to
avoid typing the realtime arguments over and over again.

        :returns: a job object. To get the public key, use job.wait(60)."""
        return n.get(uri=key, async=True,
                     realtime=True, priority=1,
                     IgnoreUSKDatehints="true",
                     followRedirect=True)

    def introduce_to_start(self, other_public_key):
        """Introduce self to the other by solving a riddle and uploading the messages USK."""
        riddlekey = get_usk_namespace(other_public_key, "riddles", "-1") # -1 means the latest version
        try:
            self.jobs["getriddle"].append(self.get(riddlekey))
        except KeyError:
            self.jobs["getriddle"] = [self.get(riddlekey)]

    def introduce_start(self):
        """Select a person and start a job to get a riddle."""
        known = list(self.lists["known"])
        if known: # introduce to a random person to minimize
                  # the chance of collisions
            k = random.choice(known)
            self.introduce_to_start(k)

    def introduce_process(self):
        """Get and process the riddle data."""
        for job in self.jobs.get("getriddle", [])[:]:
            if job.isComplete():
                try:
                    riddle = job.wait()[1]
                except Exception as e: # try again next time
                    print self.name, "getting the riddle from", job.uri, "failed with", e
                    return
                self.jobs["getriddle"].remove(job)
                answerkey = self.solve_riddle(riddle)
                messagekey = self.public_usk("messages")
                try:
                    self.jobs["answerriddle"].append(self.put(answerkey, messagekey))
                except KeyError:
                    self.jobs["answerriddle"] = [self.put(answerkey, messagekey)]

    def introduce_finalize(self):
        """Check whether the riddle answer was inserted successfully."""
        for job in self.jobs.get("answerriddle", [])[:]:
            if job.isComplete():
                try:
                    job.wait()
                    self.jobs["answerriddle"].remove(job)
                    self.introduced = True
                except Exception as e: # try again next time
                    print self.name, "inserting the riddle-answer failed with", e
                    return

    def new_riddle(self):
        """Create and upload a new riddle."""
        answerkey = "KSK@" + str(uuid.uuid1()) + "-answered"
        self.lists["answers"].add(answerkey)
        self.versions["riddles"] += 1
        next_riddle_key = self.private_usk("riddles", self.versions["riddles"])
        self.put(next_riddle_key, answerkey)


    def solve_riddle(self, riddle):
        """Get the key for the given riddle. In this example we make it easy:
The riddle is the key. For a real system, this needs user interaction.
        """
        return riddle

    def update_info(self):
        for name in ["known", "spammers"]:
            data = serialize_keylist(self.lists[name])
            self.versions[name] += 1
            key = self.private_usk(name, version=self.versions[name])
            self.put(key, data)

    def publish(self, data):
        self.versions["messages"] += 1
        messagekey = self.private_usk("messages", version=self.versions["messages"])
        print self.name, "published a message:", data
        self.put(messagekey, data)

    def check_network_start(self):
        """start all network checks."""
        # first cancel all running jobs which will be replaced here.
        for name in ["answers", "watched", "known", "knowntocheck", "spammers"]:
            for job in self.jobs.get(name, []):
                job.cancel()
        # start jobs for checking answers, for checking all known people and for checking all messagelists for new messages.
        for name in ["answers"]:
            self.jobs[name] = [self.get(i) for i in self.lists[name]]
        for name in ["watched"]:
            self.jobs["messages"] = [self.get(get_usk_namespace(i, "messages")) for i in self.lists[name]]
        self.jobs["spammers"] = []
        for name in ["known", "knowntocheck"]:
            # find new nodes
            self.jobs[name] = [self.get(get_usk_namespace(i, "known")) for i in self.lists[name]]
            # register new nodes marked as spammers
            self.jobs["spammers"].extend([self.get(get_usk_namespace(i, "spammers")) for i in self.lists[name]])

    def process_network_results(self):
        """wait for completion of all network checks and process the results."""
        for kind, jobs in self.jobs.items():
            for job in jobs:
                if not kind in ["getriddle", "answerriddle"]:
                    try:
                        res = job.wait(60)[1]
                        self.handle(res, kind, job)
                    except:
                        continue

    def handle(self, result, kind, job):
        """Handle a successful job of type kind."""
        # travel the known nodes to find new ones
        if kind in ["known", "knowntocheck"]:
            for k in deserialize_keylist(result):
                if (not k in self.lists["spammers"] and
                    not k in self.lists["known"] and
                    not k == self.public_key):
                    self.lists["knowntocheck"].add(k)
                    self.lists["watched"].add(k)
                    print self.name, "found and started to watch", k
        # read introductions
        elif kind in ["answers"]:
            self.lists[kind].remove(job.uri) # no longer need to watch this riddle
            k = extract_raw_from_usk(result)
            if not k in self.lists["spammers"]:
                self.lists["watched"].add(k)
                print self.name, "discovered", k, "through a solved riddle"
        # remove found spammers
        elif kind in ["spammers"]:
            for k in deserialize_keylist(result):
                if not result in self.lists["known"]:
                    self.lists["watched"].remove(result)
        # check all messages for spam
        elif kind in ["messages"]:
            k = extract_raw_from_usk(job.uri)
            if not "spam" in result:
                if not k == self.public_key:
                    print self.name, "read a message:", result
                    self.chat(result) # just for fun :)
                    if not k in self.lists["known"]:
                        self.lists["known"].add(k)
                        self.update_info()
                        print self.name, "marked", k, "as known person"
            else:
                self.lists["watched"].remove(k)
                if not k in self.lists["spammers"]:
                    self.lists["spammers"].add(k)
                    self.update_info()
                    print self.name, "marked", k, "as spammer"


    def chat(self, message):
        if self.chatbot and not "spam" in self.message:
            msg = message[message.index(":")+1:-10].strip() # remove name and step
            self.message = self.name + ": " + self.chatbot.get_response(msg)

# some helper functions; the closest equivalent to structure definition
<<helper_functions>>

Note that nothing in here depends on running these from the same program. All communication between persons is done purely over Freenet. The only requirement is that there is a bootstrap key: One person known to all new users. This person could be anonymous, and even with this simple code there could be multiple bootstrap keys. In freenet we call these people “seeds”. They are the seeds from which the community grows. As soon as someone besides the seed adds a person as known, the seed is no longer needed to keep the communication going.

The spam detection implementation is pretty naive: It trusts people to mark others as spammers. In a real system, there will be disputes about what constitutes spam and the system needs to show who marks whom as spammer, so users can decide to stop trusting the spam notices from someone when they disagree. As example for a real-life system, the Web of Trust plugin uses trust ratings between -100 and 100 and calculates a score from the ratings of all trusted people to decide how much to trust people who are not rated explicitly by the user.

With this in place, we need the update system to be able to step through the simulation. We have a list of people who check keys of known other people.

We first start all checks for all people quasi-simultaneously and then check the results in serial to avoid long wait times from high latency. Freenet can check many keys simultaneously, but serial checking is slow.

people = []

def update(step):
    for p in people:
        if not p.introduced:
            p.introduce_start()
    for p in people:
        p.check_network_start()
    for p in people:
        if p.message:
            p.publish(p.name + ": " + p.message + "   (step=%s)" % step)
        p.new_riddle()
    for p in people:
        if not p.introduced:
            p.introduce_process()
    for p in people:
        p.process_network_results()
    for p in people:
        if not p.introduced:
            p.introduce_finalize()

So that’s the update tasks - not really rocket science thanks to the fleshed out Persons. Only two things remain: Setting up the scene and actually running it.

For setup: We have Alice, Bob and Carol. Lets also add Chuck who wants to prevent the others from communicating by flooding them with spam.

def gen_person(name):
    try:
        return Person(myname=name, mymessage=random.choice(IRC_LOGLINES))
    except:
        return Person(myname=name, mymessage="Hi, it's me!")

# start with alice
alice = gen_person("Alice")
people.append(alice)

# happy, friendly people
for name in ["Bob", "Carol"]:
    p = gen_person(name)
    people.append(p)

# and Chuck
p = Person(myname="Chuck", mymessage="spam")
people.append(p)

# All people know Alice (except for Alice).
for p in people:
    if p == alice:
        continue
    p.lists["known"].add(alice.public_key)
    p.lists["watched"].add(alice.public_key)

# upload the first version of the spammer and known lists
for p in people:
    p.update_info()

That’s it. The stage is set, let the trouble begin :)

We don’t need a while loop here, since we just want to know whether the system works. So the event loop is pretty simple: Just call the update function a few times.

for i in range(6):
    update(step=i)

That’s it. We have spam-resistant message-channels and community discussions. Now we could go on and implement more algorithms on this scheme, like the turn-based games specification (ever wanted to play against truly anonymous competitors?), Fritter (can you guess from its name what it is? :)), a truly privacy respecting dropbox or an anonymizing, censoriship resistant, self-hosting backend for a digital market like (the in 2023 long defunct) OpenBazaar.

But that would go far beyond the goal of this article – which is to give you, my readers, the tools to create the next big thing by harnessing the capabilities of Freenet.

These capabilities have been there for years, but hidden beneath non-existing and outdated documentation, misleading claims of being in alpha-stage even though Freenet has been used in what amounts to production for over a decade and, not to forget, the ever-recurring, ever-damning suggestion to SGTFS (second-guess the friendly source). As written in Forgotten Cypherpunk Paradise, Freenet already solved many problems which researchers only begin to tackle now, but there are reasons why it was almost forgotten. With this series I intend fix some of them and start moving Freenet documentation towards the utopian vision laid out in Teach, Don’t Tell. It’s up to you to decide whether I succeeded. If I did, it will show up as a tiny contribution to the utilities and works of art and vision you create.

Note that this is not fast (i.e. enough for blogging but not enough for chat). We can make it faster by going back to SSKs instead of USKs with their additional logic for finding the newest version in O(1), but for USK there are very cheap methods to get notified of new versions for large numbers of keys (subscribing) which are used by more advanced tools like the Web of Trust and the Sone plugin, so this would be an optimization we would have to revert later. With these methods, Sone reaches round trip times of 5-15 minutes despite using large uploads.

Also since this uses Freenet as backend, it scales up: If Alice, Bob, Carol und Chuck used different computers instead of running on my single node, their communication would actually be faster, and if they called in all their alphabet and unicode friends, the system would still run fast. We’re harvesting part of the payoff from using a fully distributed backend :)

And with that, this installment ends. You can now implement really cool stuff using Freenet. In the next article I’ll describe how to avoid doing this stuff myself by interfacing with existing plugins. Naturally I could have done that from the start, but then how could I have explained the Freenet communication primitives these plugins use? :)

If you don’t want to wait, have a look at how Infocalypse uses wot to implement github-like access with user/repo, interfaces with Freemail to realize truly anonymous pull-requests from the command line and builds on FMS to provide automated updates of a DVCS wiki over Freenet.

Happy Hacking!

PS: You might ask “What is missing?”. You might have a nagging feeling that something we do every day isn’t in there. And you’re right. It’s scalable search. Or rather: scalable, spam- and censorship-resistant search. Scalable search would be Gnutella. Spam-resistance would be Credence on the social graph (the people you communicate with). Censorship-resistant is unsolved – even Google fails there. But seeing that Facebook just overtook Google as the main source of traffic, we might not actually need fully global search. Together with the cheap and easy update notifications in Freenet (via USKs), a social recommendation and bookmark-sharing system should make scalable search over Freenet possible. And until then there’s always the decentralized YaCy search engine which has been shown to be capable of crawling Freenet. Also there are the Library and Spider plugins, but they need some love to work well. Also there are the Library and Spider plugins, but they need some love to work well.

PPS: You can download the final example as alice_bob_carol.py

Freenet Interview with Zilion

Zilion Web conducted an Interview about Freenet with me. Zilion asked interesting questions and I kind of went overboard in answering them. They include:

  • When did you become a freenet developer? Why?
  • Freenet has 18 years of continuous development, from here to there, how do you see your growth?
  • Frost vs. FMS, what is your choice and why?
  • What do you think about people who use Freenet just for illegal purposes? And what is your concept of freedom about that?
  • What to expect from the future in Freenet?
  • Can you tell us how Opennet and Darknet works, and its pros and cons?

To see the answers, just head over to the article:

Interview with Freenet Developer (ArneBab)
https://zilionweb.wordpress.com/2017/08/07/interview-with-freenet-developer-arnebab/

And do install Freenet and then connect confidentially to your friends to build the darknet one friend at a time.

Freenet anonymity: Best case and Worst case

As the i2p people say, anynomity is no boolean. Freenet allows you to take it a good deal further than i2p or tor, though. If you do it right.

  • Worst case: If all of Apple would want to find you, because you declared that you would post the videos of the new iDing - and already sent them your videos as teaser before starting to upload them from an Apple computer (and that just after they lost their beloved dictator), you might be in problems if you use Opennet. You are about as safe as with tor or i2p.

  • Best case: If a local politician would want to find you, after you uploaded proof that he takes bribes, and you uploaded the files to a new safe key (SSK) and used Freenet in Darknet-mode with connections only to friends who would rather die than let someone take over their computer, there’s no way in hell, you’d get found due to Freenet (the file data could betray you, or they could find you by other means, but Freenet won’t be your weak spot).

Naturally real life is somewhere in-between.

Things which improve anonymity a lot in the best case:

  • Don’t let others know the data you are going to upload before the upload finished (would allow some attacks).
  • Use only Darknet with trusted friends (Darknet means that you connect only to people you know personally. For that it is necessary to know other people who use Freenet).
  • Upload small files, so the time in which you are actively uploading is short.

Implied are:

  • Use an OS without trojans. So no Windows. (Note: Linux can be hacked, too, but it is far less likely to already have been compromised)
  • Use no Apple devices. You don’t control them yourself and can’t know what they have under the hood. (You are compromised from the time you buy them)
  • If you use Android, flash it yourself to give it an OS you control (Freenet is not yet available for Android. as of 2021, Freenet is available on Android via freenet-mobile/app).
  • Know your friends.

Important questions to ask:

  • Who would want to find you?
  • How much would they invest to find you?
  • Do they already try to monitor Freenet? (in that case uploading files with known content would be dangerous)
  • Do they already know you personally? If yes and if they might have already compromised your computer or internet connection, you can’t upload anything anonymously anywhere. In that case, never let stuff get onto your computer in the first place. Let someone else upload it, who is not monitored (yet).
  • Can they eavesdrop on your internet connection? Then they might guess that you use Freenet from the amount of encrypted communication you do and might want to bug your computer just in case you want to use Freenet against them some day. If you think they might have bugged your computer, the notes in the previous point apply.

See the Security Summary (mostly possible attacks) in the freenet wiki for details.

Freenet as backing store for sites on the clearnet (in use today)

Chris Double (bluishcoder) changed his main website to be served directly from Freenet:

Thanks to this, the same article is now available from my inproxy.

And, naturally, from Freenet:

USK@1ORdIvjL2H1bZblJcP8hu2LjjKtVB-rVzp8mLty~5N4,8hL85otZBbq0geDsSKkBK4sKESL2SrNVecFZz9NxGVQ,AQACAAE/bluishcoder/20/2015/09/14/using-freenet-for-static-websites.html

This makes the site secure against efforts to take it down, and even if the keys would get compromised, old editions would still be available as SSK.

Example: the article about using Freenet as backend in version 20 of the site

And not to forget: People can access it anonymously from Freenet.

Freenet for Journalists, funding proposal

This is a funding proposal I sent to Open Technology Fund to make Freenet suitable for Journalists and their sources. Sadly it got rejected, but maybe it helps future proposals.

Project name: Freenet for Journalists
Duration: 24 months
Amount: 800000
Contact name: Arne Babenhauserheide
Contact email: arne_bab -ät- web -punkt- de

Descriptors

  • Status: It's basically done. (Release)
  • Focus: Privacy enhancement
  • Objective(s): Advocacy, Technology development, Deploying technology, Training
  • Beneficiaries: General public, Sexual minorities, Activists, Journalists, Advocacy groups/NGOs, Technologists, Entrepreneurs
  • Addressed problems: Restrictive Internet filtering by technical methods (IP blocking, DNS filtering, TCP RST, DPI, etc.), Blocking, filtering, or modification of political, social, and/or religious content (including apps), Technical attacks against government critics, journalists, and/or human rights organizations (Cyberattacks), Physical intimidation, arrest, violence (including device seizure or destruction), and death for political or social reasons, Repressive surveillance or monitoring of communication, Policies, laws, or directives that increase surveillance, censorship, and punishment, Government practices that hold intermediaries (social networks or ISPs) liable for user content
  • Technology attributes: User interface/experience, Anonymity, Cryptography, Desktop client, Desktop App, Sensitive data, Networking
  • Region: Global

Project description

Freenet is the only tool to date which addresses all technical requirements for freedom of the press:

  • Confidential communication between sources and journalists while hiding that communication is taking place,
  • Keep journalists independent from large publishers (no need to secure a public server) and
  • Asynchronous usage for sources without exposing at any centralized place that Freenet is used.

However, despite providing the technical foundation for real freedom of the press, Freenet is much too hard to use. Solutions to its usability problems are known, but they need to be implemented, which requires considerable focused effort and coordination with journalists to ensure that the implemented solutions fit the requirements of journalists.

The Freenet for Journalists project is about this focused effort: Making the capabilities of Freenet usable for journalists and sources, so an employee at a military contractor who finds out about illegal activity no longer has to leave the country or rely on large media organizations before blowing the whistle (to stay safe from retribution of the employer).

Project how

Making Freenet easier to use for Journalists and whistleblowers requires technical work:

  • maintain journalist site seamlessly: Enhance the Freereader and Sharewiki plugins.
  • contact a journalist via the site easily: Increase the integration of the freemail plugin.
  • use a traceless persistent pseudonym (QR or written key), integrated seamlessly into the main interface.
  • one-click creation of a Freenet-stick for transient friend-to-friend connections: add connection over single-use tokens.
  • invisible connections (steganography): Finish and merge the pluggable transports branch.
  • grow the over android: Improve and expand the icicle app: http://loubo.co/icicle/
  • a minimal security review (we are in contact with security researchers).

Also it requires coordination with and training for journalists to ensure that the workflows we enable integrate well with their workflows.

To tackle this, we asked Asher Wolf, original organizer of the crypto parties, whether she would join the team as community coordinator and trainer if we get funding. She said she would join up (but we need to have funding first: she has a child to support). Also we will collaborate with Glyn Moody who has 30 years of experience in journalism.

To increase user adoption, this project will tackle the main issues we identified as limiting adoption:

  • mediocre user interface,
  • the friend-to-friend mode—one of the unique selling points of Freenet—isn’t actually enjoyable to use yet,
  • most useful features are not visible from the start and do not come pre-activated,
  • there is no working debian package.

We are confident that with a team of at least three developers and a community-coordinator and trainer, we can realize that within two years. Plans for this are already made and we have the people, all we need is sufficient funding so we can lay down our day jobs and focus on doing what we believe is needed to regain confidential communication in the digitalspace.

Project who

The project is for Journalists and their sources.

It will allow people who aren’t yet under targeted surveillance to contact journalists without exposing their identity. It does not matter whether the journalist is under targeted surveillance.

Freenet as leaking platform makes journalists independent from large infrastructure. Journalists often write for several publishers, but platforms like SecureDrop bind them to centralized communication. They are a single point of failure. The same is true for services using Tor to anonymize sources: Here the journalist must run a server which can withstand serious attacks.

In Freenet all nodes in the system collaborate to allow exchanging information confidentially and pseudonymously without making any node a central point of failure.

The core design principle of Freenet is providing Freedom of the Press, and all its features derive from that principle:

  • No censorship by threat: Pseudonymous publication with public/private key cryptography. And usage without leaving information that you use it at a known place: in the friend-to-friend mode Freenet only connects to people you know personally, while still providing a globally connected network in which you can access all content uploaded by all users. You can create a pseudonym and prove that all your articles are written by the same person.
  • No censorship by choking commmunication: Decentralized spam resistance (beyond mere captchas) and long lifetime for files which are actually accessed: Whether you are the Guardian or a local Indian journalist, your articles stay available as long as people read them.
  • No censorship by deleting information: If something has been uploaded into Freenet, it stays available as long as people access it regularly. All data is stored in encrypted chunks on the computers of its users. Those chunks can be reassembled using the public key, which is retrieved using the URL to the article someone wrote.

Project why

“There is now no shield from forced exposure…The foundation of Groklaw is over…the Internet is over” –Groklaw, Forced Exposure(2013-08-20)

The internet once broke the structural information control from the powerful and as such created the opportunity to strengthen democracy against existing concentrations of power. Total surveillance reverts this because it forces everyone to self-censor communication. There is no longer a way to communicate without exposing the physical identity to strong attackers. Even Tor users can be de-anonymized quickly, for example by breaking servers which provide the services.

Due to the pervasive infiltration of digital communication into day-to-day life, this affects analog communication more and more.

Other services like /TorChat/, /Signal/, /Globaleaks/ and /SecureDrop/ all require some degree of centralization and lack censorship-resistant anti-spam methods (Freenet already provides the latter, due to experiencing how anonymous communication breaks down when it lacks spam resistance). Additionally these other services contain vectors for censorship:

  • Signal relies on /centralized servers/.
  • Globaleaks and SecureDrop need to be run by an organization which can /keep dynamic websites secure on Tor/.
  • TorChat can be blocked for a journalist by /basic spamming/ — or by a targeted DoS attack.

Freenet on the other hand is designed for asynchronous communication (without requiring both participants to be online at the same time). It implements communication features on a decentralized anonymizing datastore built on a friend-to-friend structure. This avoids the problems inherent in other solutions.

Other information

All of Freenet is Free Software licensed under GPL-compatible licenses. You can find additional information onhttps://freenetproject.org

The financial administration is managed by Freenet Project Inc., a US-based 503(c) non-profit. The project is financed by donations, from other organizations and from regular users. This proposal is sent on behalf of the community. The funding plan is cleared not only with other developers but also with the users.

This proposal is written for 800.000$ because many experienced Freenet developers are based in Europe and we cannot predict the exchange rate between Euro and Dollar, so we need to leave some room to ensure that we can pay the salaries if the Euro should become stronger.

For somewhat confidential inquiries, contact press@freenetproject.org (these will not be posted in a public place).

You can contact us publicly by sending an email to devl@freenetproject.org or by joining the IRC channel #freenet @irc.freenode.net

My GnuPG/PGP key (for arne_bab -ät- web -punkt- de) is available from http://draketo.de/inhalt/ich/pubkey.txt with the fingerprint 6B05 41F0 94FF 2163 6FBA 2433 3307 469B FE96C404

Freenet currently is at a point where the technical backend is working well and provides features not found in any other program, while the user interface suffers from a large number of annoyances. Different from new projects which have been emerging in the past years, Freenet does not need uncertain research or large reshaping to be suitable for a situation of ubiquious surveillance. What it needs are improvements in workflows and integration. These are tasks which can be done without facing much uncertainty, but they need focused effort.

To ensure sustainability we will keep development infrastructure distributed: Freenet must not be dependent upon infrastructure we use for this project. Freenet will continue after the project ends, so the features developed during the project will stay available.

Freenet protects your DickPic!

Afraid that the NSA could steal your DickPic? Freenet to the rescue!

Freenet protects your DickPic!
(mirror via Freenet)

Don’t know what this is about?

Watch Edward Snowden reveal DickPic, the latest, most massive surveillance program from the NSA:

Thanks to John Oliver for one of the most awesome acts of journalism I’ve seen!

FAQ

Anonymous@lFG3mGbGf0b8nE6j8RC0i5ZgWEhsQXDG3ghkYIa-1wQ wrote :
I thought Freenet wasn’t able to protect against the NSA?

The link “Connect to your friends” shows how to connect via darknet and communicate via darknet N2N messages (node-to-node messages). From my understanding, these are currently one of the most secure communication methods we can get, because they hide our personal communication beneath Freenet traffic.

They aren’t suited to communicating anonymously (because we can only talk with our friends), but they are well suited to communicating confidentially.

PS: The image is licensed under GPL, copyright: the freenet team (for the rabbit) and Arne Babenhauserheide. It uses the source images Zuchineee (thanks to Arthurcravan prrrr!) and National Security Agency from the public domain. See the sources below. … but you know what: Just share it anyway you like. I’m sure the author of the rabbit agrees, and I for sure do ☺

PPS: Yes, I had lots of fun creating this ;-)

PPPS: For some reason, the image disappeared from my server. I did not take it down. Yes, that worries me. What you see above is served from an in-proxy into Freenet. Should that go down, too, you can still use Freenet to access the image or setup your own in-proxy to allow others to see it.

AnhangGröße
freenet-protects-your-dickpic-vs-nsa.gif659.81 KB
freenet-protects-your-dickpic-vs-nsa.png126.31 KB
freenet-protects-your-dickpic-vs-nsa.xcf2.54 MB

Freenet release 1476 brings convenient, privacy-preserving publishing

With build 1476, the Freenet Project introduces convenient privacy-preserving publishing by shipping the latest release of Sharesite, a tool for managing multiple single-page web sites within Freenet. Additional changes include better security against malicious image files, usability improvements and optimization.

Freenet Logo (bunny)

The Freenet Project team announced the newest version of its censorship prevention suite on March 8th 2017. This release provides easy, privacy-preserving publishing in the darknet without the need for a server. By loading the Sharesite plugin, users can publish multiple simple websites with just a few clicks. These sites get stored decentrally within Freenet so they stay available after the user goes offline. Like all other content in Freenet they can then be accessed anonymously and users can opt-in to receive a notification in the Freenet web interface when a website they watch gets updated.

When accessing content Freenet provides many precautions against accidental de-anonymization. One of these features is protection against media files which could spill the users address or exploit security problems in browsers. This release tightens these protections for the common gif image files by detecting and removing potentially dangerous data in these files, for example comments which could be interpreted as instructions for the browser.

The new release is available for Windows, OS X, and GNU/Linux. It can be downloaded for free from https://freenetproject.org.

About Freenet:

Freenet is free open source software and has been under constant development in the Freenet Project since 2000. The mission of Freenet is to realize the technical aspect of censorship resistance. Its unique set of features includes a decentralized, global friend-to-friend publishing structure (the darknet mode), access dependent content lifetime, decentralized spam resistance, stable pseudonyms, and hosting without a server.

Contact information:

Multimedia:

Additional information:

2017-03-08-freenet-sites

2017-03-08-freenet-connections-0-4-4

2017-03-08-freenet-sharesite-0-4-4_1

2017-03-08-freenet-sharesite-0-4-4_2

2017-03-08-freenet-sharesite-0-4-4_3

I finally got the Freenet junit testsuite to run on Gentoo

Blindfolded Dog1

For years I developed Freenet partially blindfolded, because I could not get the tests to actually run on my Gentoo box.

As of today, that’s finally over: The testsuite runs successfully. My setup is still unclean, but it finally works. No more asking other contributors to run the tests for me.

To reproduce:

  1. Install Freenet and its dependencies via Gentoo: emerge freenet
  2. Install bouncycastle 1.54: emerge =dev-java/bcprov-1.54
  3. Symlink all ant-stuff into ~/.ant/lib: mkdir -p ~/.ant/lib; cd ~/.ant/lib; for i in $(find /usr/share/ant*/lib/ -name '*jar' | xargs); ln -s $i; done
  4. Get the fred repository (freenet reference daemon) from https://github.com/freenet/fred
  5. Put a file named override.properties with the following content into the fred folder:
lib.contrib.get = true
lib.dir = /usr/share
lib.jars = bcprov-1.54/lib/bcprov.jar
bc.jar = lib/bcprov.jar
libtest.dir = /usr/share
# to really ensure that ant finds junit: mkdir -p ~/.ant/lib; cd ~/.ant/lib; for i in $(find /usr/share/ant*/lib/ -name '*jar' | xargs); ln -s $i; done
# all the ant-* libs are found via cd /usr/share; find ant*/lib/ -name '*jar' | xargs
libtest.jars = freenet/lib/ant.jar hamcrest-core-1.3/lib/hamcrest-core.jar junit/lib/junit.jar junit-4/lib/junit.jar ant-antlr/lib/ant-antlr.jar ant-apache-bcel/lib/ant-apache-bcel.jar ant-apache-bsf/lib/ant-apache-bsf.jar ant-apache-log4j/lib/ant-apache-log4j.jar ant-apache-oro/lib/ant-apache-oro.jar ant-apache-regexp/lib/ant-apache-regexp.jar ant-apache-resolver/lib/ant-apache-resolver.jar ant-apache-xalan2/lib/ant-apache-xalan2.jar ant-commons-logging/lib/ant-commons-logging.jar ant-commons-net/lib/ant-commons-net.jar ant-contrib/lib/ant-contrib.jar ant-core/lib/ant-bootstrap.jar ant-core/lib/ant.jar ant-core/lib/ant-launcher.jar ant-eclipse-ecj-4.4/lib/ant-eclipse-ecj.jar ant-javamail/lib/ant-javamail.jar ant-jdepend/lib/ant-jdepend.jar ant-jsch/lib/ant-jsch.jar ant-junit/lib/ant-junit.jar ant/lib/ant-junit.jar ant/lib/ant-jsch.jar ant/lib/ant-apache-resolver.jar ant/lib/ant-commons-net.jar ant/lib/ant-javamail.jar ant/lib/ant-bootstrap.jar ant/lib/ant-swing.jar ant/lib/ant-apache-regexp.jar ant/lib/ant.jar ant/lib/ant-launcher.jar ant/lib/ant-jdepend.jar ant/lib/ant-apache-bcel.jar ant/lib/ant-nodeps.jar ant/lib/ant-trax.jar ant/lib/ant-apache-bsf.jar ant/lib/ant-apache-xalan2.jar ant/lib/ant-antlr.jar ant/lib/ant-commons-logging.jar ant/lib/ant-apache-log4j.jar ant/lib/ant-apache-oro.jar antlr-3/lib/antlr-tool.jar antlr-3/lib/antlr-runtime.jar antlr/lib/antlr.jar ant-nodeps/lib/ant-nodeps.jar ant-swing/lib/ant-swing.jar ant-trax/lib/ant-trax.jar

(Putting all the jars into the libtest is certainly overkill. Maybe I’ll trim this down at some point. But right now I’m happy that this finally works, so I’m going to celebrate it a bit and defer the cleanup for later ☺)

Happy Hacking!

PS: And here’s a complete build log:

ant clean >/dev/null; ant
Buildfile: /home/arne/fred-work/build.xml

init:
    [mkdir] Created dir: /home/arne/fred-work/build/main
    [mkdir] Created dir: /home/arne/fred-work/dist
    [mkdir] Created dir: /home/arne/fred-work/build/test
    [mkdir] Created dir: /home/arne/fred-work/run

env:

ensure-ext:

libdep-bc:

ensure-bc:

env-gjs:

ensure-gjs:

dep:

check-version-file:

build-version-file:
     [copy] Copying 1 file to /home/arne/fred-work/build/main/freenet/node
     [echo] Updated build version to @unknown@ in build/main/freenet/node/Version.java

build:
    [javac] Compiling 1080 source files to /home/arne/fred-work/build/main
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientGetWorkerThread.java:29: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ContainerInserter.java:37: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/async/InsertCompressor.java:24: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/async/SingleFileFetcher.java:51: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/async/SingleFileStreamGenerator.java:16: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/filter/CSSTokenizerFilter.java:23: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/filter/CSSReadFilter.java:23: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/filter/PNGFilter.java:25: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/fcp/AddPeer.java:29: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/fcp/FCPPluginClientMessage.java:13: warning: [deprecation] PluginTalker in freenet.pluginmanager has been deprecated
    [javac] import freenet.pluginmanager.PluginTalker;
    [javac]                             ^
    [javac] /home/arne/fred-work/src/freenet/clients/fcp/FilterMessage.java:22: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/http/QueueToadlet.java:89: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/http/ConnectionsToadlet.java:51: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/http/HTTPRequestImpl.java:39: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/clients/http/WelcomeToadlet.java:38: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/config/WrapperConfig.java:18: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/crypt/JceLoader.java:16: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/crypt/SHA256.java:50: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/crypt/SSL.java:44: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/crypt/Yarrow.java:31: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/l10n/ISO639_3.java:13: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/node/simulator/LongTermMHKTest.java:35: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/node/simulator/LongTermManySingleBlocksTest.java:39: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/pluginmanager/PluginDownLoaderOfficialHTTPS.java:25: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/Bzip2Compressor.java:19: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/DecompressorThreadManager.java:24: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/GzipCompressor.java:14: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/NewLZMACompressor.java:20: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/OldLZMACompressor.java:19: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/plugins/helpers1/AbstractFCPHandler.java:10: warning: [deprecation] PluginReplySender in freenet.pluginmanager has been deprecated
    [javac] import freenet.pluginmanager.PluginReplySender;
    [javac]                             ^
    [javac] /home/arne/fred-work/src/freenet/tools/CleanupTranslations.java:16: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/client/ArchiveContext.java:18: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]  * WARNING: Changing non-transient members on classes that are Serializable can result in 
    [javac]                                                                           ^
    [javac] /home/arne/fred-work/src/freenet/support/Logger.java:88: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                         Closer.close(br);
    [javac]                         ^
    [javac] /home/arne/fred-work/src/freenet/support/Logger.java:101: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                     Closer.close(is);
    [javac]                     ^
    [javac] /home/arne/fred-work/src/freenet/client/FailureCodeTracker.java:24: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]  * WARNING: Changing non-transient members on classes that are Serializable can result in 
    [javac]                                           ^
    [javac] /home/arne/fred-work/src/freenet/client/async/TooManyFilesInsertException.java:5: warning: [serial] serializable class TooManyFilesInsertException has no definition of serialVersionUID
    [javac] public class TooManyFilesInsertException extends Exception {
    [javac]        ^
    [javac] /home/arne/fred-work/src/freenet/support/SimpleFieldSet.java:962: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                         Closer.close(br);
    [javac]                         ^
    [javac] /home/arne/fred-work/src/freenet/support/SimpleFieldSet.java:963: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                         Closer.close(isr);
    [javac]                         ^
    [javac] /home/arne/fred-work/src/freenet/support/SimpleFieldSet.java:964: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                         Closer.close(bis);
    [javac]                         ^
    [javac] /home/arne/fred-work/src/freenet/support/io/StorageFormatException.java:6: warning: [serial] serializable class StorageFormatException has no definition of serialVersionUID
    [javac] public class StorageFormatException extends Exception {
    [javac]        ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientContext.java:35: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.TempBucketFactory;
    [javac]                    ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientContext.java:35: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.TempBucketFactory;
    [javac]                     ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientContext.java:48: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]     private transient ClientRequestScheduler sskFetchSchedulerRT;
    [javac]                                                   ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientContext.java:218: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             }, NativeThread.NORM_PRIORITY);
    [javac]                            ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientContext.java:245: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             }, NativeThread.NORM_PRIORITY);
    [javac]                            ^
    [javac] /home/arne/fred-work/src/freenet/support/io/ResumeFailedException.java:3: warning: [serial] serializable class ResumeFailedException has no definition of serialVersionUID
    [javac] public class ResumeFailedException extends Exception {
    [javac]        ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientRequestScheduler.java:55: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]     private final RequestStarter starter;
    [javac]                            ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientRequestScheduler.java:49: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]     private final OfferedKeysList offeredKeys;
    [javac]                ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientRequestScheduler.java:157: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                 getter.internalError(e, this, clientContext, persistent);
    [javac]                  ^
    [javac] /home/arne/fred-work/src/freenet/node/useralerts/UserAlertManager.java:34: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]     private long lastUpdated;
    [javac]                    ^
    [javac] /home/arne/fred-work/src/freenet/node/useralerts/UserAlertManager.java:84: warning: [deprecation] queue(FCPMessage) in FCPConnectionOutputHandler has been deprecated
    [javac]                     subscriber.outputHandler.queue(alert.getFCPMessage());
    [javac]                                             ^
    [javac] /home/arne/fred-work/src/freenet/node/useralerts/UserAlertManager.java:382: warning: [deprecation] queue(FCPMessage) in FCPConnectionOutputHandler has been deprecated
    [javac]                         subscriber.outputHandler.queue(alert.getFCPMessage());
    [javac]                                                 ^
    [javac] /home/arne/fred-work/src/freenet/client/ArchiveManager.java:337: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                             Closer.close(is);
    [javac]                             ^
    [javac] /home/arne/fred-work/src/freenet/client/ArchiveManager.java:364: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(is);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/ArchiveManager.java:449: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(tarIS);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/support/io/TempBucketFactory.java:149: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                             Closer.close(is);
    [javac]                             ^
    [javac] /home/arne/fred-work/src/freenet/support/io/TempBucketFactory.java:354: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                     Closer.close(currentIS);
    [javac]                     ^
    [javac] /home/arne/fred-work/src/freenet/support/io/TempBucketFactory.java:419: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                     Closer.close(currentIS);
    [javac]                     ^
    [javac] /home/arne/fred-work/src/freenet/support/io/TempBucketFactory.java:452: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                 Closer.close(os);
    [javac]                 ^
    [javac] /home/arne/fred-work/src/freenet/client/async/USKManager.java:65: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]     /** Latest SSK slot known to be by the author by blanked-edition-number USK */
    [javac]                            ^
    [javac] /home/arne/fred-work/src/freenet/client/async/USKManager.java:35: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]  * Tracks the latest version of every known USK.
    [javac]                          ^
    [javac] /home/arne/fred-work/src/freenet/support/compress/RealCompressor.java:115: warning: [deprecation] MIN_PRIORITY in NativeThread has been deprecated
    [javac]             return new NativeThread(r, "Compressor thread", NativeThread.MIN_PRIORITY, true);
    [javac]                                                                         ^
    [javac] /home/arne/fred-work/src/freenet/client/async/DatastoreChecker.java:81: warning: [rawtypes] found raw type: ArrayDeque
    [javac]         queue = new ArrayDeque[priorities];
    [javac]                     ^
    [javac]   missing type arguments for generic class ArrayDeque<E>
    [javac]   where E is a type-variable:
    [javac]     E extends Object declared in class ArrayDeque
    [javac] /home/arne/fred-work/src/freenet/client/async/DatastoreChecker.java:211: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]                 }, NativeThread.NORM_PRIORITY);
    [javac]                                ^
    [javac] /home/arne/fred-work/src/freenet/client/async/DatastoreChecker.java:230: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         return NativeThread.NORM_PRIORITY;
    [javac]                            ^
    [javac] /home/arne/fred-work/src/freenet/support/MemoryLimitedJobRunner.java:35: warning: [rawtypes] found raw type: ArrayDeque
    [javac]         this.jobs = new ArrayDeque[priorities];
    [javac]                         ^
    [javac]   missing type arguments for generic class ArrayDeque<E>
    [javac]   where E is a type-variable:
    [javac]     E extends Object declared in class ArrayDeque
    [javac] /home/arne/fred-work/src/freenet/clients/fcp/ClientRequest.java:390: warning: [deprecation] HIGH_PRIORITY in NativeThread has been deprecated
    [javac]         }, NativeThread.HIGH_PRIORITY);
    [javac]                        ^
    [javac] /home/arne/fred-work/src/freenet/clients/fcp/ClientRequest.java:396: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]                     return NativeThread.NORM_PRIORITY;
    [javac]                                        ^
    [javac] /home/arne/fred-work/src/freenet/client/Metadata.java:1237: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(dos);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/Metadata.java:1238: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(cos);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/Metadata.java:1699: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(dos);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/InsertContext.java:300: warning: [dep-ann] deprecated item is not annotated with @Deprecated
    [javac]     public void onResume() {
    [javac]                 ^
    [javac] /home/arne/fred-work/src/freenet/client/async/PersistentJobRunnerImpl.java:32: warning: [deprecation] HIGH_PRIORITY in NativeThread has been deprecated
    [javac]     static final int WRITE_AT_PRIORITY = NativeThread.HIGH_PRIORITY-1;
    [javac]                                                      ^
    [javac] /home/arne/fred-work/src/freenet/client/async/PersistentJobRunnerImpl.java:103: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             queueInternal(job, NativeThread.NORM_PRIORITY);
    [javac]                                            ^
    [javac] /home/arne/fred-work/src/freenet/client/async/PersistentJobRunnerImpl.java:113: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             queue(job, NativeThread.NORM_PRIORITY);
    [javac]                                    ^
    [javac] /home/arne/fred-work/src/freenet/client/async/PersistenceDisabledException.java:3: warning: [serial] serializable class PersistenceDisabledException has no definition of serialVersionUID
    [javac] public class PersistenceDisabledException extends Exception {
    [javac]        ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientGetter.java:395: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(dataInput);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientGetter.java:396: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(dataOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/client/async/ClientGetter.java:397: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(output);
    [javac]             ^
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:35: warning: [unchecked] unchecked cast
    [javac]         grabClients = (T[]) new Object[0];
    [javac]                             ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:36: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]         grabArrays = new RemoveRandomWithObject[0];
    [javac]                          ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:36: warning: [unchecked] unchecked conversion
    [javac]         grabArrays = new RemoveRandomWithObject[0];
    [javac]                      ^
    [javac]   required: RemoveRandomWithObject<T>[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:69: warning: [unchecked] unchecked cast
    [javac]         else return (C) grabArrays[idx];
    [javac]                                   ^
    [javac]   required: C
    [javac]   found:    RemoveRandomWithObject<T>
    [javac]   where T,C are type-variables:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:233: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                        ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:233: warning: [unchecked] unchecked cast
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                    ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:234: warning: [unchecked] unchecked cast
    [javac]                 grabClients = (T[]) new Object[0];
    [javac]                                     ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:238: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[1-x] };
    [javac]                                        ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:238: warning: [unchecked] unchecked cast
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[1-x] };
    [javac]                                    ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:239: warning: [unchecked] unchecked cast
    [javac]                 grabClients = (T[]) new Object[] { grabClients[1-x] };
    [javac]                                     ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:270: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[1-x] };
    [javac]                                        ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:270: warning: [unchecked] unchecked cast
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[1-x] };
    [javac]                                    ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:271: warning: [unchecked] unchecked cast
    [javac]                 grabClients = (T[]) new Object[] { grabClients[1-x] };
    [javac]                                     ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:291: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                        ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:291: warning: [unchecked] unchecked cast
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                    ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:292: warning: [unchecked] unchecked cast
    [javac]                 grabClients = (T[]) new Object[0];
    [javac]                                     ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:295: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[x] }; // don't use RGA, it may be nulled out
    [javac]                                        ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:295: warning: [unchecked] unchecked cast
    [javac]                 grabArrays = (C[]) new RemoveRandomWithObject[] { grabArrays[x] }; // don't use RGA, it may be nulled out
    [javac]                                    ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:296: warning: [unchecked] unchecked cast
    [javac]                 grabClients = (T[]) new Object[] { grabClients[x] };
    [javac]                                     ^
    [javac]   required: T[]
    [javac]   found:    Object[]
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:324: warning: [rawtypes] found raw type: RemoveRandomWithObject
    [javac]             grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                    ^
    [javac]   missing type arguments for generic class RemoveRandomWithObject<T>
    [javac]   where T is a type-variable:
    [javac]     T extends Object declared in interface RemoveRandomWithObject
    [javac] /home/arne/fred-work/src/freenet/support/SectoredRandomGrabArray.java:324: warning: [unchecked] unchecked cast
    [javac]             grabArrays = (C[]) new RemoveRandomWithObject[0];
    [javac]                                ^
    [javac]   required: C[]
    [javac]   found:    RemoveRandomWithObject[]
    [javac]   where C,T are type-variables:
    [javac]     C extends RemoveRandomWithObject<T> declared in class SectoredRandomGrabArray
    [javac]     T extends Object declared in class SectoredRandomGrabArray
    [javac] Note: Some input files additionally use or override a deprecated API.
    [javac] Note: Some input files additionally use unchecked or unsafe operations.
    [javac] 100 warnings
     [copy] Copying 393 files to /home/arne/fred-work/build/main/freenet/clients/http/staticfiles
     [copy] Copying 19 files to /home/arne/fred-work/build/main/freenet/l10n
     [copy] Copying 1 file to /home/arne/fred-work/build/main

unit-build:

env:

libdep-junit:

env:

libdep-hamcrest:
    [javac] Compiling 135 source files to /home/arne/fred-work/build/test
    [javac] warning: [path] bad path element "/usr/share/ant-core/lib/xalan.jar": no such file or directory
    [javac] warning: [path] bad path element "/usr/share/junit-4/lib/../../hamcrest-core/lib/hamcrest-core.jar": no such file or directory
    [javac] /home/arne/fred-work/test/freenet/client/CodeTest.java:3: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac] import junit.framework.Assert;
    [javac]                       ^
    [javac] /home/arne/fred-work/test/freenet/client/OnionFECCodecTest.java:8: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac] import junit.framework.Assert;
    [javac]                       ^
    [javac] /home/arne/fred-work/test/freenet/crypt/ciphers/RijndaelTest.java:25: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:3: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac] import junit.framework.Assert;
    [javac]                       ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/Bzip2CompressorTest.java:17: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/GzipCompressorTest.java:30: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/NewLzmaCompressorTest.java:16: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac] import freenet.support.io.Closer;
    [javac]                          ^
    [javac] /home/arne/fred-work/test/freenet/client/CodeTest.java:43: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]             Assert.assertEquals(src[i], repair[i]);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/client/async/SplitFileInserterStorageTest.java:664: warning: [deprecation] fill(RandomAccessBuffer,Random,long,long) in BucketTools has been deprecated
    [javac]         BucketTools.fill(thing, random, 0, size);
    [javac]                    ^
    [javac] /home/arne/fred-work/test/freenet/client/async/ClientRequestSelectorTest.java:227: warning: [deprecation] fill(RandomAccessBuffer,Random,long,long) in BucketTools has been deprecated
    [javac]         BucketTools.fill(thing, random, 0, size);
    [javac]                    ^
    [javac] /home/arne/fred-work/test/freenet/client/async/ClientRequestSelectorTest.java:231: warning: [serial] serializable class ClientRequestSelectorTest.NullSendableInsert has no definition of serialVersionUID
    [javac]     class NullSendableInsert extends SendableInsert {
    [javac]     ^
    [javac] /home/arne/fred-work/test/freenet/client/async/PersistentJobRunnerImplTest.java:162: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         jobRunner.queue(w, NativeThread.NORM_PRIORITY);
    [javac]                                        ^
    [javac] /home/arne/fred-work/test/freenet/client/async/PersistentJobRunnerImplTest.java:189: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         }, NativeThread.NORM_PRIORITY);
    [javac]                        ^
    [javac] /home/arne/fred-work/test/freenet/client/async/SplitFileFetcherStorageTest.java:571: warning: [deprecation] fill(Bucket,Random,long) in BucketTools has been deprecated
    [javac]         BucketTools.fill(b, random, size);
    [javac]                    ^
    [javac] /home/arne/fred-work/test/freenet/crypt/AEADStreamsTest.java:24: warning: [deprecation] fill(Bucket,Random,long) in BucketTools has been deprecated
    [javac]             BucketTools.fill(input, random, 65536);
    [javac]                        ^
    [javac] /home/arne/fred-work/test/freenet/crypt/AEADStreamsTest.java:35: warning: [deprecation] fill(Bucket,Random,long) in BucketTools has been deprecated
    [javac]             BucketTools.fill(input, random, 65536);
    [javac]                        ^
    [javac] /home/arne/fred-work/test/freenet/crypt/AEADStreamsTest.java:45: warning: [deprecation] fill(Bucket,Random,long) in BucketTools has been deprecated
    [javac]         BucketTools.fill(input, random, 512*1024);
    [javac]                    ^
    [javac] /home/arne/fred-work/test/freenet/crypt/PCFBModeTest.java:61: warning: [deprecation] create(BlockCipher) in PCFBMode has been deprecated
    [javac]         PCFBMode ctr = PCFBMode.create(cipher);
    [javac]                                ^
    [javac] /home/arne/fred-work/test/freenet/crypt/PCFBModeTest.java:82: warning: [deprecation] create(BlockCipher) in PCFBMode has been deprecated
    [javac]             PCFBMode ctr = PCFBMode.create(cipher);
    [javac]                                    ^
    [javac] /home/arne/fred-work/test/freenet/crypt/PCFBModeTest.java:120: warning: [deprecation] create(BlockCipher) in PCFBMode has been deprecated
    [javac]             PCFBMode ctr = PCFBMode.create(cipher);
    [javac]                                    ^
    [javac] /home/arne/fred-work/test/freenet/crypt/PCFBModeTest.java:127: warning: [deprecation] create(BlockCipher) in PCFBMode has been deprecated
    [javac]             ctr = PCFBMode.create(cipher);
    [javac]                           ^
    [javac] /home/arne/fred-work/test/freenet/crypt/PCFBModeTest.java:137: warning: [deprecation] create(BlockCipher) in PCFBMode has been deprecated
    [javac]             ctr = PCFBMode.create(cipher);
    [javac]                           ^
    [javac] /home/arne/fred-work/test/freenet/crypt/ciphers/RijndaelTest.java:2010: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]                 Closer.close(is);
    [javac]                 ^
    [javac] /home/arne/fred-work/test/freenet/store/caching/SleepingFreenetStore.java:11: warning: [dep-ann] deprecated item is not annotated with @Deprecated
    [javac] public class SleepingFreenetStore<T extends StorableBlock> extends ProxyFreenetStore<T> {
    [javac]        ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:9: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertTrue(JVMVersion.isTooOld("1.6.0_32"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:10: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertTrue(JVMVersion.isTooOld("1.6"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:11: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertTrue(JVMVersion.isTooOld("1.5"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:15: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertFalse(JVMVersion.isTooOld("1.7.0_65"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:16: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertFalse(JVMVersion.isTooOld("1.7"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:17: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertFalse(JVMVersion.isTooOld("1.8.0_9"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:18: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertFalse(JVMVersion.isTooOld("1.10"));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/JVMVersionTest.java:22: warning: [deprecation] Assert in junit.framework has been deprecated
    [javac]         Assert.assertFalse(JVMVersion.isTooOld(null));
    [javac]         ^
    [javac] /home/arne/fred-work/test/freenet/support/ListUtilsTest.java:100: warning: [serial] serializable class NotRandomAlwaysTop has no definition of serialVersionUID
    [javac]     static class NotRandomAlwaysTop extends Random {
    [javac]            ^
    [javac] /home/arne/fred-work/test/freenet/support/ListUtilsTest.java:107: warning: [serial] serializable class NotRandomAlwaysZero has no definition of serialVersionUID
    [javac]     static class NotRandomAlwaysZero extends Random {
    [javac]            ^
    [javac] /home/arne/fred-work/test/freenet/support/MemoryLimitedJobRunnerTest.java:28: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             return NativeThread.NORM_PRIORITY;
    [javac]                                ^
    [javac] /home/arne/fred-work/test/freenet/support/MemoryLimitedJobRunnerTest.java:210: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]             return NativeThread.NORM_PRIORITY;
    [javac]                                ^
    [javac] /home/arne/fred-work/test/freenet/support/PrioritizedSerialExecutorTest.java:54: warning: [deprecation] MAX_PRIORITY in NativeThread has been deprecated
    [javac]         exec = new PrioritizedSerialExecutor(NativeThread.MAX_PRIORITY, 10, 5, true);
    [javac]                                                          ^
    [javac] /home/arne/fred-work/test/freenet/support/SerialExecutorTest.java:10: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         SerialExecutor exec = new SerialExecutor(NativeThread.NORM_PRIORITY);
    [javac]                                                              ^
    [javac] /home/arne/fred-work/test/freenet/support/SerialExecutorTest.java:30: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]                 return NativeThread.NORM_PRIORITY;
    [javac]                                    ^
    [javac] /home/arne/fred-work/test/freenet/support/SimpleFieldSetTest.java:739: warning: [cast] redundant cast to String
    [javac]             assertTrue(isAKey(SAMPLE_STRING_PAIRS, "", (String)itr.next()));
    [javac]                                                        ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/Bzip2CompressorTest.java:142: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorInput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/Bzip2CompressorTest.java:143: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/Bzip2CompressorTest.java:162: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorInput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/Bzip2CompressorTest.java:163: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/GzipCompressorTest.java:150: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorInput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/GzipCompressorTest.java:151: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/GzipCompressorTest.java:169: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorInput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/GzipCompressorTest.java:170: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/NewLzmaCompressorTest.java:159: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorInput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/compress/NewLzmaCompressorTest.java:160: warning: [deprecation] Closer in freenet.support.io has been deprecated
    [javac]             Closer.close(decompressorOutput);
    [javac]             ^
    [javac] /home/arne/fred-work/test/freenet/support/io/TempBucketFactoryRAFBase.java:35: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]     private Executor exec = new SerialExecutor(NativeThread.NORM_PRIORITY);
    [javac]                                                            ^
    [javac] /home/arne/fred-work/test/freenet/support/io/TempBucketFactoryRAFBase.java:323: warning: [cast] redundant cast to TempBucketFactory.TempBucket
    [javac]             return ((TempFileBucket)(((TempBucket) bucket).getUnderlying())).getFile();
    [javac]                                       ^
    [javac] /home/arne/fred-work/test/freenet/support/io/TempBucketTest.java:38: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         private Executor exec = new SerialExecutor(NativeThread.NORM_PRIORITY);
    [javac]                                                                ^
    [javac] /home/arne/fred-work/test/freenet/support/io/TempBucketTest.java:160: warning: [deprecation] NORM_PRIORITY in NativeThread has been deprecated
    [javac]         private Executor exec = new SerialExecutor(NativeThread.NORM_PRIORITY);
    [javac]                                                                ^
    [javac] 56 warnings
     [copy] Copying 84 files to /home/arne/fred-work/build/test/freenet/client/filter/png
     [copy] Copying 15 files to /home/arne/fred-work/build/test/freenet/client/filter/bmp
     [copy] Copying 12 files to /home/arne/fred-work/build/test/freenet/crypt/ciphers/rijndael-gladman-test-data
     [copy] Copying 3 files to /home/arne/fred-work/build/test/freenet/l10n

unit:
    [junit] WARNING: multiple versions of ant detected in path for junit 
    [junit]          jar:file:/usr/share/ant-core/lib/ant.jar!/org/apache/tools/ant/Project.class
    [junit]      and jar:file:/home/arne/.ant/lib/ant.jar!/org/apache/tools/ant/Project.class
    [junit] Running freenet.client.CodeTest
    [junit] Testsuite: freenet.client.CodeTest
    [junit] Attempting to deploy Native FEC for linux-x86_64
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7,797 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7,797 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to deploy Native FEC for linux-x86_64
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSimpleRev took 3,249 sec
    [junit] Testcase: testBenchmark took 0,007 sec
    [junit] Testcase: testShifted took 3,643 sec
    [junit] Testcase: testSimple took 0,325 sec
    [junit] Running freenet.client.DefaultMIMETypesTest
    [junit] Testsuite: freenet.client.DefaultMIMETypesTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,024 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,024 sec
    [junit] 
    [junit] Testcase: testParams took 0,147 sec
    [junit] Testcase: testFullList took 0,269 sec
    [junit] Running freenet.client.FailureCodeTrackerTest
    [junit] Testsuite: freenet.client.FailureCodeTrackerTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,555 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,555 sec
    [junit] 
    [junit] Testcase: testSize took 0,102 sec
    [junit] Running freenet.client.FetchContextTest
    [junit] Testsuite: freenet.client.FetchContextTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,586 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,586 sec
    [junit] 
    [junit] Testcase: testPersistence took 0,155 sec
    [junit] Running freenet.client.OnionFECCodecTest
    [junit] Testsuite: freenet.client.OnionFECCodecTest
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 41,276 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 41,276 sec
    [junit] 
    [junit] Testcase: testDecodeNoneDecoded took 2,784 sec
    [junit] Testcase: testDecodeRandomSubset took 30,79 sec
    [junit] Testcase: testDecodeThrowsOnNotPaddedLastBlock took 0,476 sec
    [junit] Testcase: testEncodeThrowsOnNotPaddedLastBlock took 0,027 sec
    [junit] Testcase: testManyDataFewCheck took 0,86 sec
    [junit] Testcase: testDecodeAlreadyDecoded took 0,937 sec
    [junit] Testcase: testManyCheckFewData took 0,763 sec
    [junit] Testcase: testRandomDataCheckCounts took 4,127 sec
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.client.async.ClientRequestSelectorTest
    [junit] Testsuite: freenet.client.async.ClientRequestSelectorTest
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi1841931918231409357lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12166485ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12280268ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,736 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,736 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12166485ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12280268ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSmallSplitfileChooseCompletion took 11,444 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.client.async.PersistentJobRunnerImplTest
    [junit] Testsuite: freenet.client.async.PersistentJobRunnerImplTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,59 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,59 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testWaitForCheckpoint took 0,052 sec
    [junit] Testcase: testDisabledCheckpointing took 0,014 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.client.async.SplitFileFetcherStorageTest
    [junit] Testsuite: freenet.client.async.SplitFileFetcherStorageTest
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi6316287223875696332lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12272226ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12251649ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Blocks: 1 2 5 7 8
    [junit] Blocks: 5 6 7 8
    [junit] Blocks: 0 2 4 5 6 7 8 11 13 15 16 17 18 19
    [junit] Blocks: 0 3 5 7 9 11 17
    [junit] Blocks: 1 4 8 9 10 11 14 15 16 17
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 193,881 sec
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 193,881 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12272226ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12251649ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Blocks: 1 2 5 7 8
    [junit] Blocks: 5 6 7 8
    [junit] Blocks: 0 2 4 5 6 7 8 11 13 15 16 17 18 19
    [junit] Blocks: 0 3 5 7 9 11 17
    [junit] Blocks: 1 4 8 9 10 11 14 15 16 17
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testPersistenceReloadThenChooseKey took 11,545 sec
    [junit] Testcase: testWriteReadSegmentKeys took 0,254 sec
    [junit] Testcase: testPersistenceReload took 0,096 sec
    [junit] Testcase: testChooseKeyThreeTries took 0,084 sec
    [junit] Testcase: testPersistenceReloadThenFetch took 0,219 sec
    [junit] Testcase: testPersistenceReloadBetweenChooseKey took 0,159 sec
    [junit] Testcase: testMultiSegment took 3,317 sec
    [junit] Testcase: testChooseKeyCooldown took 0,388 sec
    [junit] Testcase: testPersistenceReloadBetweenFetches took 0,266 sec
    [junit] Testcase: testSingleSegment took 176,969 sec
    [junit] Testcase: testChooseKeyOneTry took 0,093 sec
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Running freenet.client.async.SplitFileInserterStorageTest
    [junit] Testsuite: freenet.client.async.SplitFileInserterStorageTest
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi5142930070342381907lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 11976766ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12197192ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 226,95 sec
    [junit] Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 226,95 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 11976766ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12197192ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testPersistentSmallSplitfileNoLastBlockFailAfterResume took 10,493 sec
    [junit] Testcase: testCancelAltCrossSegment took 7,594 sec
    [junit] Testcase: testSmallSplitfileFailureFatalError took 0,179 sec
    [junit] Testcase: testSmallSplitfileConsecutiveRNFsHackFailure took 0,111 sec
    [junit] Testcase: testEncodeAfterShutdownCrossSegment took 0,003 sec
    [junit] Testcase: testPersistentSmallSplitfileNoLastBlockCompletionAfterResume took 0,492 sec
    [junit] Testcase: testPersistentSmallSplitfileWithLastBlockCompletionAfterResume took 0,311 sec
    [junit] Testcase: testSmallSplitfileChooseCooldown took 0,489 sec
    [junit] Testcase: testRoundTripOneBlockSegment took 18,965 sec
    [junit] Testcase: testSmallSplitfileFailureMaxRetries took 0,055 sec
    [junit] Testcase: testSmallSplitfileHasKeys took 0,054 sec
    [junit] Testcase: testSmallSplitfileCompletion took 0,091 sec
    [junit] Testcase: testRepeatedEncodeAfterShutdown took 33,799 sec
    [junit] Testcase: testRoundTripSimple took 73,584 sec
    [junit] Testcase: testResumeCrossSegment took 0,001 sec
    [junit] Testcase: testSmallSplitfileChooseCooldownNotRNF took 0,086 sec
    [junit] Testcase: testPersistentSmallSplitfileNoLastBlockCompletion took 0,114 sec
    [junit] Testcase: testSmallSplitfileChooseCompletion took 0,098 sec
    [junit] Testcase: testSmallSplitfileConsecutiveRNFsHack took 0,116 sec
    [junit] Testcase: testCancelAlt took 0,13 sec
    [junit] Testcase: testSmallSplitfileNoLastBlock took 0,053 sec
    [junit] Testcase: testRoundTripDataBlocksOnly took 78,865 sec
    [junit] Testcase: testCancel took 0,317 sec
    [junit] Testcase: testSmallSplitfileWithLastBlock took 0,107 sec
    [junit] Testcase: testRoundTripCrossSegment took 0 sec
    [junit] Testcase: testPersistentSmallSplitfileNoLastBlockChooseAfterResume took 0,361 sec
    [junit] Running freenet.client.filter.BMPFilterTest
    [junit] Testsuite: freenet.client.filter.BMPFilterTest
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,687 sec
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,687 sec
    [junit] 
    [junit] Testcase: testInvalidImageResolution took 0,983 sec
    [junit] Testcase: testImageSizeCalculationWithPadding took 0,08 sec
    [junit] Testcase: testValidImage took 0,016 sec
    [junit] Testcase: testInvalidNumberOfPlanes took 0,011 sec
    [junit] Testcase: testNotEnoughImageData took 0,006 sec
    [junit] Testcase: testInvalidBitDepth took 0,004 sec
    [junit] Testcase: testImageSizeCalculationWithoutPadding took 0,007 sec
    [junit] Testcase: testInvalidBitmapInfoHeaderSize took 0,008 sec
    [junit] Testcase: testIllegalStartWord took 0,004 sec
    [junit] Testcase: testInvalidOffset took 0,003 sec
    [junit] Testcase: testInvalidCompressionType took 0,004 sec
    [junit] Testcase: testTooShortImage took 0,004 sec
    [junit] Testcase: testNegativeImageWidth took 0,005 sec
    [junit] Testcase: testInvalidImageDataSize took 0,004 sec
    [junit] Running freenet.client.filter.CSSParserTest
    [junit] Testsuite: freenet.client.filter.CSSParserTest
    [junit] CSS3 test0 : h1:nth-of-type(odd) {} -> h1:nth-of-type(odd)
    [junit] CSS3 test1 : tr:nth-child(n+1) {} -> tr:nth-child(n+1)
    [junit] CSS3 test2 : tr:nth-child(+1) {} -> tr:nth-child(+1)
    [junit] CSS3 test3 : tr:nth-child(2n-1) {} -> tr:nth-child(2n-1)
    [junit] CSS3 test4 : tr:nth-child(-2n+1) {} -> tr:nth-child(-2n+1)
    [junit] CSS3 test5 : h1:nth-last-of-type(1) {} -> h1:nth-last-of-type(1)
    [junit] CSS3 test6 : tr:nth-child(1) {} -> tr:nth-child(1)
    [junit] CSS3 test7 : tr:nth-child(even) { background-color: yellow; } -> tr:nth-child(even) { background-color: yellow; }
    [junit] CSS3 test8 : tr:nth-child(n) {} -> tr:nth-child(n)
    [junit] CSS3 test9 : tr:nth-child(-n-1) {} -> tr:nth-child(-n-1)
    [junit] CSS3 test10 : tr:nth-child(-1) {} -> tr:nth-child(-1)
    [junit] CSS3 test11 : tr:nth-child(2n) {} -> tr:nth-child(2n)
    [junit] CSS3 test12 : tr:nth-child(-999999) {} -> tr:nth-child(-999999)
    [junit] CSS3 test13 : tr:nth-child(odd) { background-color: red; } -> tr:nth-child(odd) { background-color: red; }
    [junit] CSS3 test14 : tr:nth-child(10n) {} -> tr:nth-child(10n)
    [junit] CSS3 test15 : h1:nth-of-type(1) {} -> h1:nth-of-type(1)
    [junit] CSS3 test16 : tr:nth-last-child(even) {} -> tr:nth-last-child(even)
    [junit] CSS3 test17 : h1:nth-last-of-type(odd) {} -> h1:nth-last-of-type(odd)
    [junit] CSS3 test18 : tr:nth-child(n-1) {} -> tr:nth-child(n-1)
    [junit] CSS3 test19 : tr:nth-child(10) {} -> tr:nth-child(10)
    [junit] CSS3 test20 : tr:nth-last-child(1) {} -> tr:nth-last-child(1)
    [junit] CSS3 test21 : tr:nth-child(100) {} -> tr:nth-child(100)
    [junit] CSS3 test22 : tr:nth-last-child(odd) {} -> tr:nth-last-child(odd)
    [junit] CSS3 test23 : h1:nth-last-of-type(even) {} -> h1:nth-last-of-type(even)
    [junit] CSS3 test24 : tr:nth-child(-n+1) {} -> tr:nth-child(-n+1)
    [junit] CSS3 test25 : tr:nth-child(999999) {} -> tr:nth-child(999999)
    [junit] CSS3 test26 : tr:nth-child(-n) {} -> tr:nth-child(-n)
    [junit] CSS3 test27 : h1:nth-of-type(even) {} -> h1:nth-of-type(even)
    [junit] CSS3 test28 : tr:nth-child(-2n-1) {} -> tr:nth-child(-2n-1)
    [junit] CSS3 test29 : tr:nth-child(2n+1) {} -> tr:nth-child(2n+1)
    [junit] CSS3 test30 : tr:nth-child(n+10) {} -> tr:nth-child(n+10)
    [junit] CSS3 bad selector test 0
    [junit] CSS3 bad selector test 1
    [junit] CSS3 bad selector test 2
    [junit] CSS3 bad selector test 3
    [junit] CSS3 bad selector test 4
    [junit] CSS3 bad selector test 5
    [junit] CSS3 bad selector test 6
    [junit] CSS3 bad selector test 7
    [junit] CSS3 bad selector test 8
    [junit] CSS3 bad selector test 9
    [junit] CSS3 bad selector test 10
    [junit] CSS3 bad selector test 11
    [junit] CSS3 bad selector test 12
    [junit] CSS3 bad selector test 13
    [junit] CSS3 bad selector test 14
    [junit] CSS3 bad selector test 15
    [junit] CSS3 bad selector test 16
    [junit] CSS3 bad selector test 17
    [junit] CSS3 bad selector test 18
    [junit] CSS3 bad selector test 19
    [junit] CSS3 bad selector test 20
    [junit] CSS3 bad selector test 21
    [junit] CSS3 bad selector test 22
    [junit] CSS3 bad selector test 23
    [junit] CSS3 bad selector test 24
    [junit] CSS3 bad selector test 25
    [junit] CSS3 bad selector test 26
    [junit] CSS3 bad selector test 27
    [junit] CSS3 bad selector test 28
    [junit] CSS3 bad selector test 29
    [junit] Test 0 : div * p { color: blue;} -> div * p { color: blue;}
    [junit] Test 1 : p.marine.pastoral { color: green } -> p.marine.pastoral
    [junit] Test 2 : h1[foo="bar+bar"] {} -> h1[foo="bar+bar"]
    [junit] Test 3 : p:first-child em { font-weight : bold } -> p:first-child em { font-weight: bold }
    [junit] Test 4 : a:focus:hover { background: white;} -> a:focus:hover { background: white;}
    [junit] Test 5 : span[class=example] { color: blue; } -> span[class=example] { color: blue; }
    [junit] Test 6 : div ol>li p { color: green;} -> div ol>li p { color: green;}
    [junit] Test 7 : h1[foo="bar bar"] {} -> h1[foo="bar bar"]
    [junit] Test 8 : .warning {} -> .warning {}
    [junit] Test 9 : h1#chapter1 {} -> h1#chapter1 {}
    [junit] Test 10 : a.external:visited { color: blue } -> 
    [junit] Test 11 : div > p:FIRST-CHILD { text-indent: 0 } -> div>p:FIRST-CHILD { text-indent: 0 }
    [junit] Test 12 : h1[foo] h2 > p + b { color: green;} -> h1[foo] h2>p+b { color: green;}
    [junit] Test 13 : h1[foo] {} -> h1[foo]
    [junit] Test 14 : * > a:first-child {} -> *>a:first-child {}
    [junit] Test 15 : div p *[href] { color: blue;} -> div p *[href] { color: blue;}
    [junit] Test 16 : h1[foo="\"test\""] {} -> h1[foo="\"test\""] {}
    [junit] Test 17 : h1[foo="hello\202 "] {} -> h1[foo="hello\202 "] {}
    [junit] Test 18 : h1:first-child {} -> h1:first-child
    [junit] Test 19 : h1[foo="bar"] {} -> h1[foo="bar"]
    [junit] Test 20 : a:focus:hover { background: white } -> a:focus:hover { background: white }
    [junit] Test 21 : h1[foo] h2 > p + b:before { color: green;} -> h1[foo] h2>p+b:before { color: green;}
    [junit] Test 22 : #myid {} -> #myid {}
    [junit] Test 23 : h1[foo=bar] {} -> h1[foo=bar] {}
    [junit] Test 24 : td { border-right: hidden; border-bottom: hidden } -> td { border-right: hidden; border-bottom: hidden }
    [junit] Test 25 : h1[foo~="bar"] {} -> h1[foo~="bar"]
    [junit] Test 26 : :link { color: red } -> :link { color: red }
    [junit] Test 27 : span[hello="Cleveland"][goodbye="Columbus"] { color: blue; } -> span[hello="Cleveland"][goodbye="Columbus"] { color: blue; }
    [junit] Test 28 : [lang=fr] {} -> [lang=fr] {}
    [junit] Test 29 : h1[foo|="en"] {} -> h1[foo|="en"]
    [junit] Test 30 : h1 + h2 { margin-top: -5mm } -> h1+h2 { margin-top: -5mm }
    [junit] Test 31 : p:first-letter { font-size: 3em; font-weight: normal } -> p:first-letter { font-size: 3em; font-weight: normal }
    [junit] Test 32 : h1.opener + h2 { margin-top: -5mm } -> h1.opener+h2 { margin-top: -5mm }
    [junit] Test 33 : table          { border-collapse: collapse; border: 5px solid yellow; } *#col1         { border: 3px solid black; } td             { border: 1px solid red; padding: 1em; } td.cell5       { border: 5px dashed blue; } td.cell6       { border: 5px solid green; } -> table { border-collapse: collapse; border: 5px solid yellow; } *#col1 { border: 3px solid black; } td { border: 1px solid red; padding: 1em; } td.cell5 { border: 5px dashed blue; } td.cell6 { border: 5px solid green; }
    [junit] Test 34 : div > p:first-child { text-indent: 0 } -> div>p:first-child { text-indent: 0 }
    [junit] Test 35 : p[example="public class foo\
    [junit] {\
    [junit]     private int x;\
    [junit] \
    [junit]     foo(int x) {\
    [junit]         this.x = x;\
    [junit]     }\
    [junit] \
    [junit] }"] { color: red } -> p[example="public class foo{    private int x;    foo(int x) {        this.x = x;    }}"] { color: red }
    [junit] Test 36 : h1:lang(fr) {} -> h1:lang(fr)
    [junit] Test 37 : div.foo {} -> div.foo
    [junit] Test 38 : h1>h2 {} -> h1>h2
    [junit] Test 39 : [foo|="en"] {} -> [foo|="en"]
    [junit] Test 40 : p:first-line { text-transform: uppercase;} -> p:first-line { text-transform: uppercase;}
    [junit] Test 41 : h1+h2 {} -> h1+h2
    [junit] Test 42 : h1 em { color: blue;} -> h1 em { color: blue;}
    [junit] Test 43 : body > P { line-height: 1.3 } -> body>P { line-height: 1.3 }
    [junit] Test 44 : h1[foo="bar\" bar"] {} -> h1[foo="bar\" bar"]
    [junit] Test 45 : * {} -> *
    [junit] Bad selector test 0
    [junit] Bad selector test 1
    [junit] Bad selector test 2
    [junit] Bad selector test 3
    [junit] Bad selector test 4
    [junit] Bad selector test 5
    [junit] Bad selector test 6
    [junit] Bad selector test 7
    [junit] Bad selector test 8
    [junit] Bad selector test 9
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,167 sec
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,167 sec
    [junit] ------------- Standard Error -----------------
    [junit] CSS3 test0 : h1:nth-of-type(odd) {} -> h1:nth-of-type(odd)
    [junit] CSS3 test1 : tr:nth-child(n+1) {} -> tr:nth-child(n+1)
    [junit] CSS3 test2 : tr:nth-child(+1) {} -> tr:nth-child(+1)
    [junit] CSS3 test3 : tr:nth-child(2n-1) {} -> tr:nth-child(2n-1)
    [junit] CSS3 test4 : tr:nth-child(-2n+1) {} -> tr:nth-child(-2n+1)
    [junit] CSS3 test5 : h1:nth-last-of-type(1) {} -> h1:nth-last-of-type(1)
    [junit] CSS3 test6 : tr:nth-child(1) {} -> tr:nth-child(1)
    [junit] CSS3 test7 : tr:nth-child(even) { background-color: yellow; } -> tr:nth-child(even) { background-color: yellow; }
    [junit] CSS3 test8 : tr:nth-child(n) {} -> tr:nth-child(n)
    [junit] CSS3 test9 : tr:nth-child(-n-1) {} -> tr:nth-child(-n-1)
    [junit] CSS3 test10 : tr:nth-child(-1) {} -> tr:nth-child(-1)
    [junit] CSS3 test11 : tr:nth-child(2n) {} -> tr:nth-child(2n)
    [junit] CSS3 test12 : tr:nth-child(-999999) {} -> tr:nth-child(-999999)
    [junit] CSS3 test13 : tr:nth-child(odd) { background-color: red; } -> tr:nth-child(odd) { background-color: red; }
    [junit] CSS3 test14 : tr:nth-child(10n) {} -> tr:nth-child(10n)
    [junit] CSS3 test15 : h1:nth-of-type(1) {} -> h1:nth-of-type(1)
    [junit] CSS3 test16 : tr:nth-last-child(even) {} -> tr:nth-last-child(even)
    [junit] CSS3 test17 : h1:nth-last-of-type(odd) {} -> h1:nth-last-of-type(odd)
    [junit] CSS3 test18 : tr:nth-child(n-1) {} -> tr:nth-child(n-1)
    [junit] CSS3 test19 : tr:nth-child(10) {} -> tr:nth-child(10)
    [junit] CSS3 test20 : tr:nth-last-child(1) {} -> tr:nth-last-child(1)
    [junit] CSS3 test21 : tr:nth-child(100) {} -> tr:nth-child(100)
    [junit] CSS3 test22 : tr:nth-last-child(odd) {} -> tr:nth-last-child(odd)
    [junit] CSS3 test23 : h1:nth-last-of-type(even) {} -> h1:nth-last-of-type(even)
    [junit] CSS3 test24 : tr:nth-child(-n+1) {} -> tr:nth-child(-n+1)
    [junit] CSS3 test25 : tr:nth-child(999999) {} -> tr:nth-child(999999)
    [junit] CSS3 test26 : tr:nth-child(-n) {} -> tr:nth-child(-n)
    [junit] CSS3 test27 : h1:nth-of-type(even) {} -> h1:nth-of-type(even)
    [junit] CSS3 test28 : tr:nth-child(-2n-1) {} -> tr:nth-child(-2n-1)
    [junit] CSS3 test29 : tr:nth-child(2n+1) {} -> tr:nth-child(2n+1)
    [junit] CSS3 test30 : tr:nth-child(n+10) {} -> tr:nth-child(n+10)
    [junit] CSS3 bad selector test 0
    [junit] CSS3 bad selector test 1
    [junit] CSS3 bad selector test 2
    [junit] CSS3 bad selector test 3
    [junit] CSS3 bad selector test 4
    [junit] CSS3 bad selector test 5
    [junit] CSS3 bad selector test 6
    [junit] CSS3 bad selector test 7
    [junit] CSS3 bad selector test 8
    [junit] CSS3 bad selector test 9
    [junit] CSS3 bad selector test 10
    [junit] CSS3 bad selector test 11
    [junit] CSS3 bad selector test 12
    [junit] CSS3 bad selector test 13
    [junit] CSS3 bad selector test 14
    [junit] CSS3 bad selector test 15
    [junit] CSS3 bad selector test 16
    [junit] CSS3 bad selector test 17
    [junit] CSS3 bad selector test 18
    [junit] CSS3 bad selector test 19
    [junit] CSS3 bad selector test 20
    [junit] CSS3 bad selector test 21
    [junit] CSS3 bad selector test 22
    [junit] CSS3 bad selector test 23
    [junit] CSS3 bad selector test 24
    [junit] CSS3 bad selector test 25
    [junit] CSS3 bad selector test 26
    [junit] CSS3 bad selector test 27
    [junit] CSS3 bad selector test 28
    [junit] CSS3 bad selector test 29
    [junit] Test 0 : div * p { color: blue;} -> div * p { color: blue;}
    [junit] Test 1 : p.marine.pastoral { color: green } -> p.marine.pastoral
    [junit] Test 2 : h1[foo="bar+bar"] {} -> h1[foo="bar+bar"]
    [junit] Test 3 : p:first-child em { font-weight : bold } -> p:first-child em { font-weight: bold }
    [junit] Test 4 : a:focus:hover { background: white;} -> a:focus:hover { background: white;}
    [junit] Test 5 : span[class=example] { color: blue; } -> span[class=example] { color: blue; }
    [junit] Test 6 : div ol>li p { color: green;} -> div ol>li p { color: green;}
    [junit] Test 7 : h1[foo="bar bar"] {} -> h1[foo="bar bar"]
    [junit] Test 8 : .warning {} -> .warning {}
    [junit] Test 9 : h1#chapter1 {} -> h1#chapter1 {}
    [junit] Test 10 : a.external:visited { color: blue } -> 
    [junit] Test 11 : div > p:FIRST-CHILD { text-indent: 0 } -> div>p:FIRST-CHILD { text-indent: 0 }
    [junit] Test 12 : h1[foo] h2 > p + b { color: green;} -> h1[foo] h2>p+b { color: green;}
    [junit] Test 13 : h1[foo] {} -> h1[foo]
    [junit] Test 14 : * > a:first-child {} -> *>a:first-child {}
    [junit] Test 15 : div p *[href] { color: blue;} -> div p *[href] { color: blue;}
    [junit] Test 16 : h1[foo="\"test\""] {} -> h1[foo="\"test\""] {}
    [junit] Test 17 : h1[foo="hello\202 "] {} -> h1[foo="hello\202 "] {}
    [junit] Test 18 : h1:first-child {} -> h1:first-child
    [junit] Test 19 : h1[foo="bar"] {} -> h1[foo="bar"]
    [junit] Test 20 : a:focus:hover { background: white } -> a:focus:hover { background: white }
    [junit] Test 21 : h1[foo] h2 > p + b:before { color: green;} -> h1[foo] h2>p+b:before { color: green;}
    [junit] Test 22 : #myid {} -> #myid {}
    [junit] Test 23 : h1[foo=bar] {} -> h1[foo=bar] {}
    [junit] Test 24 : td { border-right: hidden; border-bottom: hidden } -> td { border-right: hidden; border-bottom: hidden }
    [junit] Test 25 : h1[foo~="bar"] {} -> h1[foo~="bar"]
    [junit] Test 26 : :link { color: red } -> :link { color: red }
    [junit] Test 27 : span[hello="Cleveland"][goodbye="Columbus"] { color: blue; } -> span[hello="Cleveland"][goodbye="Columbus"] { color: blue; }
    [junit] Test 28 : [lang=fr] {} -> [lang=fr] {}
    [junit] Test 29 : h1[foo|="en"] {} -> h1[foo|="en"]
    [junit] Test 30 : h1 + h2 { margin-top: -5mm } -> h1+h2 { margin-top: -5mm }
    [junit] Test 31 : p:first-letter { font-size: 3em; font-weight: normal } -> p:first-letter { font-size: 3em; font-weight: normal }
    [junit] Test 32 : h1.opener + h2 { margin-top: -5mm } -> h1.opener+h2 { margin-top: -5mm }
    [junit] Test 33 : table          { border-collapse: collapse; border: 5px solid yellow; } *#col1         { border: 3px solid black; } td             { border: 1px solid red; padding: 1em; } td.cell5       { border: 5px dashed blue; } td.cell6       { border: 5px solid green; } -> table { border-collapse: collapse; border: 5px solid yellow; } *#col1 { border: 3px solid black; } td { border: 1px solid red; padding: 1em; } td.cell5 { border: 5px dashed blue; } td.cell6 { border: 5px solid green; }
    [junit] Test 34 : div > p:first-child { text-indent: 0 } -> div>p:first-child { text-indent: 0 }
    [junit] Test 35 : p[example="public class foo\
    [junit] {\
    [junit]     private int x;\
    [junit] \
    [junit]     foo(int x) {\
    [junit]         this.x = x;\
    [junit]     }\
    [junit] \
    [junit] }"] { color: red } -> p[example="public class foo{    private int x;    foo(int x) {        this.x = x;    }}"] { color: red }
    [junit] Test 36 : h1:lang(fr) {} -> h1:lang(fr)
    [junit] Test 37 : div.foo {} -> div.foo
    [junit] Test 38 : h1>h2 {} -> h1>h2
    [junit] Test 39 : [foo|="en"] {} -> [foo|="en"]
    [junit] Test 40 : p:first-line { text-transform: uppercase;} -> p:first-line { text-transform: uppercase;}
    [junit] Test 41 : h1+h2 {} -> h1+h2
    [junit] Test 42 : h1 em { color: blue;} -> h1 em { color: blue;}
    [junit] Test 43 : body > P { line-height: 1.3 } -> body>P { line-height: 1.3 }
    [junit] Test 44 : h1[foo="bar\" bar"] {} -> h1[foo="bar\" bar"]
    [junit] Test 45 : * {} -> *
    [junit] Bad selector test 0
    [junit] Bad selector test 1
    [junit] Bad selector test 2
    [junit] Bad selector test 3
    [junit] Bad selector test 4
    [junit] Bad selector test 5
    [junit] Bad selector test 6
    [junit] Bad selector test 7
    [junit] Bad selector test 8
    [junit] Bad selector test 9
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testCSS3Selector took 1,92 sec
    [junit] Testcase: testProperties took 4,308 sec
    [junit] Testcase: testMaybeCharset took 0,986 sec
    [junit] Testcase: testWhitespace took 0,194 sec
    [junit] Testcase: testCSS2Selector took 0,411 sec
    [junit] Testcase: testBackgroundURL took 0,252 sec
    [junit] Testcase: testTripleCommentStart took 0,201 sec
    [junit] Testcase: testCharset took 0,832 sec
    [junit] Testcase: testComment took 0,185 sec
    [junit] Testcase: testEscape took 0,183 sec
    [junit] Testcase: testImports took 0,446 sec
    [junit] Testcase: testCSS1Selector took 0,196 sec
    [junit] Testcase: testDoubleCommentStart took 0,196 sec
    [junit] Testcase: testNewlines took 0,199 sec
    [junit] Running freenet.client.filter.ContentFilterTest$TagVerifierTest
    [junit] Testsuite: freenet.client.filter.ContentFilterTest$TagVerifierTest
    [junit] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,271 sec
    [junit] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,271 sec
    [junit] 
    [junit] Testcase: testMetaTagHTMLContentType took 1,351 sec
    [junit] Testcase: testFormTag took 0,013 sec
    [junit] Testcase: testInvalidInputTag took 0,005 sec
    [junit] Testcase: testMetaTagXHTMLContentType took 0,004 sec
    [junit] Testcase: testInvalidFormMethod took 0,003 sec
    [junit] Testcase: testBodyTag took 0,003 sec
    [junit] Testcase: testLinkTag took 0,308 sec
    [junit] Testcase: testMetaTagUnknownContentType took 0,004 sec
    [junit] Testcase: testHTMLTagWithInvalidNS took 0,005 sec
    [junit] Testcase: testValidInputTag took 0,003 sec
    [junit] Running freenet.client.filter.ContentFilterTest
    [junit] Testsuite: freenet.client.filter.ContentFilterTest
    [junit] Corrupt or malicious web page (unable to filter the page)!
    [junit]     at freenet.client.filter.HTMLFilter.throwFilterException(HTMLFilter.java:701)
    [junit]     at freenet.client.filter.HTMLFilter$HTMLParseContext.run(HTMLFilter.java:296)
    [junit]     at freenet.client.filter.HTMLFilter.readFilter(HTMLFilter.java:84)
    [junit]     at freenet.client.filter.ContentFilterTest.testEvilCharset(ContentFilterTest.java:293)
    [junit] Failure: Corrupt or malicious web page (unable to filter the page)!
    [junit] Failure: Corrupt or malicious web page (unable to filter the page)!
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,544 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,544 sec
    [junit] ------------- Standard Output ---------------
    [junit] Failure: Corrupt or malicious web page (unable to filter the page)!
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit] Failure: Corrupt or malicious web page (unable to filter the page)!
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Corrupt or malicious web page (unable to filter the page)!
    [junit]     at freenet.client.filter.HTMLFilter.throwFilterException(HTMLFilter.java:701)
    [junit]     at freenet.client.filter.HTMLFilter$HTMLParseContext.run(HTMLFilter.java:296)
    [junit]     at freenet.client.filter.HTMLFilter.readFilter(HTMLFilter.java:84)
    [junit]     at freenet.client.filter.ContentFilterTest.testEvilCharset(ContentFilterTest.java:293)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] Corrupt or malicious web page (unable to filter the page)!
    [junit]     at freenet.client.filter.HTMLFilter.throwFilterException(HTMLFilter.java:701)
    [junit]     at freenet.client.filter.HTMLFilter$HTMLParseContext.run(HTMLFilter.java:296)
    [junit]     at freenet.client.filter.HTMLFilter.readFilter(HTMLFilter.java:84)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at freenet.client.filter.ContentFilter.filter(ContentFilter.java:294)
    [junit]     at freenet.client.filter.ContentFilterTest.testEvilCharset(ContentFilterTest.java:309)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] Corrupt or malicious web page (unable to filter the page)!
    [junit]     at freenet.client.filter.HTMLFilter.throwFilterException(HTMLFilter.java:701)
    [junit]     at freenet.client.filter.HTMLFilter$HTMLParseContext.run(HTMLFilter.java:296)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit]     at freenet.client.filter.HTMLFilter.readFilter(HTMLFilter.java:84)
    [junit]     at freenet.client.filter.ContentFilter.filter(ContentFilter.java:294)
    [junit]     at freenet.client.filter.ContentFilterTest.testEvilCharset(ContentFilterTest.java:309)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testMetaRefresh took 2,4 sec
    [junit] Testcase: testLowerCaseExtensions took 0,005 sec
    [junit] Testcase: testHTMLFilter took 1,575 sec
    [junit] Testcase: testEvilCharset took 0,055 sec
    [junit] Running freenet.client.filter.FilterUtilsTest
    [junit] Testsuite: freenet.client.filter.FilterUtilsTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,555 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,555 sec
    [junit] 
    [junit] Testcase: testInvalidLengthUnits took 0,064 sec
    [junit] Testcase: testValidLenthUnits took 0,011 sec
    [junit] Running freenet.client.filter.JPEGFilterTest
    [junit] Testsuite: freenet.client.filter.JPEGFilterTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,564 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,564 sec
    [junit] 
    [junit] Testcase: testThatAThumbnailExtensionCodeIsPreserved took 0,085 sec
    [junit] Running freenet.client.filter.PNGFilterTest
    [junit] Testsuite: freenet.client.filter.PNGFilterTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,801 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,801 sec
    [junit] 
    [junit] Testcase: testSuiteTest took 0,334 sec
    [junit] Running freenet.clients.fcp.FCPPluginConnectionImplTest
    [junit] Testsuite: freenet.clients.fcp.FCPPluginConnectionImplTest
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,581 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,581 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSendSynchronousThreadSafety took 1,052 sec
    [junit] Running freenet.clients.fcp.FCPPluginMessageEncodeDecodeTest
    [junit] Testsuite: freenet.clients.fcp.FCPPluginMessageEncodeDecodeTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,883 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,883 sec
    [junit] 
    [junit] Testcase: testEncodeDecode took 0,43 sec
    [junit] Running freenet.clients.http.CookieTest
    [junit] Testsuite: freenet.clients.http.CookieTest
    [junit] sessionid=abCd12345;version=1;path=/Freetalk;expires=Sat, 02 Apr 2016 15:26:46 GMT;discard=true;
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,793 sec
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,793 sec
    [junit] ------------- Standard Output ---------------
    [junit] sessionid=abCd12345;version=1;path=/Freetalk;expires=Sat, 02 Apr 2016 15:26:46 GMT;discard=true;
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testGetValue took 0,074 sec
    [junit] Testcase: testEncodeToHeaderValue took 0,007 sec
    [junit] Testcase: testGetName took 0,001 sec
    [junit] Testcase: testGetPath took 0,002 sec
    [junit] Testcase: testCookieURIStringStringDate took 0,07 sec
    [junit] Testcase: testEqualsObject took 0,007 sec
    [junit] Testcase: testGetDomain took 0,001 sec
    [junit] Running freenet.clients.http.FilterCSSIdentifierTest
    [junit] Testsuite: freenet.clients.http.FilterCSSIdentifierTest
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,595 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,595 sec
    [junit] 
    [junit] Testcase: testInvalidFirstDash took 0,082 sec
    [junit] Testcase: testInvalidChar took 0,001 sec
    [junit] Testcase: testKnownValid took 0,003 sec
    [junit] Running freenet.clients.http.ReceivedCookieTest
    [junit] Testsuite: freenet.clients.http.ReceivedCookieTest
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,08 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,08 sec
    [junit] 
    [junit] Testcase: testParseHeader took 0,232 sec
    [junit] Testcase: testEncodeToHeaderValue took 0,002 sec
    [junit] Testcase: testGetDomain took 0,002 sec
    [junit] Testcase: testGetValue took 0,003 sec
    [junit] Testcase: testGetName took 0,002 sec
    [junit] Testcase: testGetPath took 0,002 sec
    [junit] Testcase: testCookieURIStringStringDate took 0,049 sec
    [junit] Testcase: testEqualsObject took 0,004 sec
    [junit] Running freenet.config.ConfigTest
    [junit] Testsuite: freenet.config.ConfigTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,188 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,188 sec
    [junit] 
    [junit] Testcase: testGet took 0,217 sec
    [junit] Testcase: testRegister took 0,428 sec
    [junit] Testcase: testConfig took 0,001 sec
    [junit] Testcase: testGetConfigs took 0,002 sec
    [junit] Running freenet.crypt.AEADBucketTest
    [junit] Testsuite: freenet.crypt.AEADBucketTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,009 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,009 sec
    [junit] 
    [junit] Testcase: testCopyBucketNotDivisibleBy16 took 0,564 sec
    [junit] Running freenet.crypt.AEADStreamsTest
    [junit] Testsuite: freenet.crypt.AEADStreamsTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,031 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,031 sec
    [junit] 
    [junit] Testcase: testCorruptedRoundTrip took 2,279 sec
    [junit] Testcase: testGarbageAfterClose took 0,172 sec
    [junit] Testcase: testSuccessfulRoundTrip took 0,641 sec
    [junit] Testcase: testCloseEarly took 0,012 sec
    [junit] Testcase: testTruncatedReadsWritesRoundTrip took 0,455 sec
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12297089ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12260651ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Running freenet.crypt.CTRBlockCipherTest
    [junit] Testsuite: freenet.crypt.CTRBlockCipherTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14,94 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14,94 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12297089ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12260651ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testNISTRandomLength took 9,858 sec
    [junit] Testcase: testNIST took 0,002 sec
    [junit] Testcase: testRandomJCA took 1,227 sec
    [junit] Testcase: testRandom took 3,371 sec
    [junit] Running freenet.crypt.CryptByteBufferTest
    [junit] Testsuite: freenet.crypt.CryptByteBufferTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12398804ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12373630ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Tests run: 30, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,693 sec
    [junit] Tests run: 30, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,693 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12398804ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12373630ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSuccessfulRoundTripByteArrayNewInstance took 8,107 sec
    [junit] Testcase: testSetIVIvParameterSpec took 0,062 sec
    [junit] Testcase: testEncryptWrapByteBuffer took 0,027 sec
    [junit] Testcase: testEncryptByteArrayIntIntOffsetOutOfBounds took 0,009 sec
    [junit] Testcase: testEncryptByteArrayIntIntLengthOutOfBounds took 0,009 sec
    [junit] Testcase: testGenIV took 0,002 sec
    [junit] Testcase: testGetIV took 0,004 sec
    [junit] Testcase: testGenIVLength took 0,002 sec
    [junit] Testcase: testGenIVUnsupportedTypeException took 0,001 sec
    [junit] Testcase: testEncryptByteBufferToByteBufferDirect took 0,015 sec
    [junit] Testcase: testDecryptByteArrayNullInput took 0,013 sec
    [junit] Testcase: testRoundRandomLengthBytes took 0,11 sec
    [junit] Testcase: testSetIVIvParameterSpecNullInput took 0,002 sec
    [junit] Testcase: testSuccessfulRoundTripByteArrayReset took 0,018 sec
    [junit] Testcase: testSuccessfulRoundTripInPlace took 0,013 sec
    [junit] Testcase: testDecryptByteArrayIntIntNullInput took 0,042 sec
    [junit] Testcase: testOverlappingDecode took 0,065 sec
    [junit] Testcase: testEncryptDirectByteBuffer took 0,056 sec
    [junit] Testcase: testOverlappingEncode took 0,051 sec
    [junit] Testcase: testEncryptByteBufferToByteBuffer took 0,02 sec
    [junit] Testcase: testRoundOneByte took 0,04 sec
    [junit] Testcase: testSuccessfulRoundTripInPlaceOffset took 0,038 sec
    [junit] Testcase: testEncryptByteArrayIntIntNullInput took 0,024 sec
    [junit] Testcase: testEncryptByteArrayNullInput took 0,011 sec
    [junit] Testcase: testSetIVIvParameterSpecUnsupportedTypeException took 0,015 sec
    [junit] Testcase: testSuccessfulRoundTripByteArray took 0,04 sec
    [junit] Testcase: testDecryptByteArrayIntIntOffsetOutOfBounds took 0,022 sec
    [junit] Testcase: testSuccessfulRoundTripOutOfPlaceOffset took 0,034 sec
    [junit] Testcase: testDecryptWrapByteBuffer took 0,025 sec
    [junit] Testcase: testDecryptByteArrayIntIntLengthOutOfBounds took 0,027 sec
    [junit] Running freenet.crypt.CryptUtilTest
    [junit] Testsuite: freenet.crypt.CryptUtilTest
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi2947201881134795957lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,78 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,78 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testRandomBytes took 2,019 sec
    [junit] Testcase: testSecureRandomBytes took 0,268 sec
    [junit] Running freenet.crypt.DSAGroupGeneratorTest
    [junit] Testsuite: freenet.crypt.DSAGroupGeneratorTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,657 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,657 sec
    [junit] 
    [junit] Testcase: testIsPrime took 0,17 sec
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi6138669811090174832lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] Running freenet.crypt.DSATest
    [junit] Testsuite: freenet.crypt.DSATest
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,221 sec
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,221 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSign_grp_pvtKey_r_kInv_m_rand took 0,027 sec
    [junit] Testcase: testSameSignConsistency took 0,02 sec
    [junit] Testcase: testSign_grp_pvtKey_m_rand took 0,126 sec
    [junit] Testcase: testSign_grp_pvtKey_k_m_rand took 0,551 sec
    [junit] Testcase: testSignAndVerify took 0,006 sec
    [junit] Testcase: testSignSmallQValue took 0,007 sec
    [junit] Testcase: testVerify took 0,003 sec
    [junit] Running freenet.crypt.ECDHTest
    [junit] Testsuite: freenet.crypt.ECDHTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,886 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,886 sec
    [junit] 
    [junit] Testcase: testGetPublicKey took 3,224 sec
    [junit] Testcase: testGetAgreedSecret took 0,18 sec
    [junit] Running freenet.crypt.ECDSATest
    [junit] Testsuite: freenet.crypt.ECDSATest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,025 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,025 sec
    [junit] 
    [junit] Testcase: testGetPublicKey took 6,476 sec
    [junit] Testcase: testSign took 0,316 sec
    [junit] Testcase: testAsFieldSet took 0,184 sec
    [junit] Testcase: testSignToNetworkFormat took 0,157 sec
    [junit] Testcase: testVerify took 0,323 sec
    [junit] Testcase: testSerializeUnserialize took 0,045 sec
    [junit] Running freenet.crypt.EncryptedRandomAccessBucketTest
    [junit] Testsuite: freenet.crypt.EncryptedRandomAccessBucketTest
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,694 sec
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,694 sec
    [junit] 
    [junit] Testcase: testIrregularWritesNotOverlapping took 1,214 sec
    [junit] Testcase: testBucketToRAF took 1,14 sec
    [junit] Testcase: testSerialize took 0,363 sec
    [junit] Testcase: testIrregularWrites took 0,034 sec
    [junit] Testcase: testStoreTo took 0,104 sec
    [junit] Testcase: testReadExcess took 0,03 sec
    [junit] Testcase: testReuse took 0,034 sec
    [junit] Testcase: testReadEmpty took 0,01 sec
    [junit] Testcase: testReadWrite took 0,053 sec
    [junit] Testcase: testLargeData took 0,23 sec
    [junit] Testcase: testNegative took 0,009 sec
    [junit] Running freenet.crypt.EncryptedRandomAccessBufferAltTest
    [junit] Testsuite: freenet.crypt.EncryptedRandomAccessBufferAltTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18,923 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18,923 sec
    [junit] 
    [junit] Testcase: testArray took 16,49 sec
    [junit] Testcase: testClose took 0,06 sec
    [junit] Testcase: testSize took 0,104 sec
    [junit] Testcase: testFormula took 1,409 sec
    [junit] Testcase: testWriteOverLimit took 0,424 sec
    [junit] Running freenet.crypt.EncryptedRandomAccessBufferTest
    [junit] Testsuite: freenet.crypt.EncryptedRandomAccessBufferTest
    [junit] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,649 sec
    [junit] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,649 sec
    [junit] 
    [junit] Testcase: testSuccesfulRoundTrip took 0,722 sec
    [junit] Testcase: testClose took 0,026 sec
    [junit] Testcase: testSize took 0,038 sec
    [junit] Testcase: testSuccesfulRoundTripReadHeader took 0,107 sec
    [junit] Testcase: testClosePwrite took 0,094 sec
    [junit] Testcase: testWrongMagic took 0,025 sec
    [junit] Testcase: testPreadFileOffsetTooSmall took 0,018 sec
    [junit] Testcase: testPreadFileOffsetTooBig took 0,013 sec
    [junit] Testcase: testUnderlyingRandomAccessThingTooSmall took 0,005 sec
    [junit] Testcase: testSerialize took 0,418 sec
    [junit] Testcase: testEncryptedRandomAccessThingNullInput1 took 0,002 sec
    [junit] Testcase: testEncryptedRandomAccessThingNullInput3 took 0,011 sec
    [junit] Testcase: testWrongMasterSecret took 0,053 sec
    [junit] Testcase: testPwriteFileOffsetTooBig took 0,037 sec
    [junit] Testcase: testEncryptedRandomAccessThingNullBARAT took 0,014 sec
    [junit] Testcase: testWrongERATType took 0,061 sec
    [junit] Testcase: testEncryptedRandomAccessThingNullByteArray took 0,015 sec
    [junit] Testcase: testPwriteFileOffsetTooSmall took 0,021 sec
    [junit] Testcase: testClosePread took 0,023 sec
    [junit] Testcase: testStoreTo took 0,157 sec
    [junit] Running freenet.crypt.EncryptingIoAdapterTest
    [junit] Testsuite: freenet.crypt.EncryptingIoAdapterTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12276495ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12260849ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 58,147 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 58,147 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12276495ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12260849ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testFlatRandom took 10,436 sec
    [junit] Testcase: testClobberBuffer took 0,004 sec
    [junit] Testcase: testMirrored took 4,755 sec
    [junit] Testcase: testLinear took 42,44 sec
    [junit] Running freenet.crypt.HMACTest
    [junit] Testsuite: freenet.crypt.HMACTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,299 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,299 sec
    [junit] 
    [junit] Testcase: testWrongKeySize took 1,111 sec
    [junit] Testcase: testAllCipherNames took 0,345 sec
    [junit] Testcase: testBenchmark took 0,202 sec
    [junit] Testcase: testKnownVectors took 0,092 sec
    [junit] Testcase: testSHA256SignVerify took 0,083 sec
    [junit] Running freenet.crypt.KeyGenUtilsTest
    [junit] Testsuite: freenet.crypt.KeyGenUtilsTest
    [junit] 16
    [junit] 32
    [junit] 16
    [junit] 32
    [junit] 32
    [junit] 48
    [junit] 64
    [junit] 32
    [junit] 16
    [junit] 32
    [junit] Tests run: 47, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,439 sec
    [junit] Tests run: 47, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,439 sec
    [junit] ------------- Standard Output ---------------
    [junit] 16
    [junit] 32
    [junit] 16
    [junit] 32
    [junit] 32
    [junit] 48
    [junit] 64
    [junit] 32
    [junit] 16
    [junit] 32
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testGetPublicKeyPairNotNull took 0,019 sec
    [junit] Testcase: testGetPublicKeyNullInput1 took 0,001 sec
    [junit] Testcase: testGetPublicKeyNullInput2 took 0,001 sec
    [junit] Testcase: testGetPublicKeyPairNullInput1 took 0,001 sec
    [junit] Testcase: testGetPublicKeyPairNullInput2 took 0 sec
    [junit] Testcase: testDeriveIvParameterSpec took 0,074 sec
    [junit] Testcase: testGenNonceLength took 0,103 sec
    [junit] Testcase: testGenSecretKeyKeySize took 0,636 sec
    [junit] Testcase: testGetPublicKey took 0,024 sec
    [junit] Testcase: testGetPublicKeyPair took 0,03 sec
    [junit] Testcase: testGetPublicKeyDSAType took 0,007 sec
    [junit] Testcase: testGenIV took 0,014 sec
    [junit] Testcase: testGenKeyPairPublicKeyLength took 0,21 sec
    [junit] Testcase: testGetIvParameterSpecOffsetOutOfBounds took 0 sec
    [junit] Testcase: testGetIvParameterSpecLengthOutOfBounds took 0,001 sec
    [junit] Testcase: testGetKeyPairPublicKeyPrivateKey took 0 sec
    [junit] Testcase: testDeriveSecretKey took 0,043 sec
    [junit] Testcase: testGetSecretKeyNullInput1 took 0,001 sec
    [junit] Testcase: testGetSecretKeyNullInput2 took 0,001 sec
    [junit] Testcase: testGenKeyPairNullInput took 0,001 sec
    [junit] Testcase: testGetIvParameterSpecLength took 0,001 sec
    [junit] Testcase: testGetKeyPairKeyPairTypeByteArrayNullInput1 took 0 sec
    [junit] Testcase: testGetKeyPairKeyPairTypeByteArrayNullInput2 took 0,022 sec
    [junit] Testcase: testGetKeyPairKeyPairTypeByteArrayNullInput3 took 0,028 sec
    [junit] Testcase: testGetKeyPairKeyPairTypeByteArrayByteArray took 0,035 sec
    [junit] Testcase: testGetKeyPairKeyPairTypeByteArrayDSAType took 0,001 sec
    [junit] Testcase: testGenSecretKeyNullInput took 0,001 sec
    [junit] Testcase: testDeriveSecretKeyLength took 0,143 sec
    [junit] Testcase: testGetKeyPairPublicKeyPrivateKeySamePrivate took 0,001 sec
    [junit] Testcase: testGetSecretKey took 0,009 sec
    [junit] Testcase: testDeriveSecretKeyNullInput1 took 0,051 sec
    [junit] Testcase: testDeriveSecretKeyNullInput2 took 0,001 sec
    [junit] Testcase: testDeriveSecretKeyNullInput3 took 0 sec
    [junit] Testcase: testDeriveSecretKeyNullInput4 took 0,001 sec
    [junit] Testcase: testGenNonceNegativeLength took 0 sec
    [junit] Testcase: testDeriveIvParameterSpecLength took 0,119 sec
    [junit] Testcase: testDeriveIvParameterSpecNullInput1 took 0,002 sec
    [junit] Testcase: testDeriveIvParameterSpecNullInput2 took 0,001 sec
    [junit] Testcase: testDeriveIvParameterSpecNullInput3 took 0 sec
    [junit] Testcase: testDeriveIvParameterSpecNullInput4 took 0,001 sec
    [junit] Testcase: testGenKeyPairDSAType took 0 sec
    [junit] Testcase: testGetPublicKeyPairDSAType took 0 sec
    [junit] Testcase: testGetIvParameterSpecNullInput took 0,001 sec
    [junit] Testcase: testGenIVNegativeLength took 0 sec
    [junit] Testcase: testGenSecretKey took 0,006 sec
    [junit] Testcase: testGetKeyPairPublicKeyPrivateKeySamePublic took 0,001 sec
    [junit] Testcase: testGenKeyPair took 0,034 sec
    [junit] Running freenet.crypt.MasterSecretTest
    [junit] Testsuite: freenet.crypt.MasterSecretTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,306 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,306 sec
    [junit] 
    [junit] Testcase: testDeriveKeyLength took 0,639 sec
    [junit] Testcase: testDeriveKeyNullInput took 0,002 sec
    [junit] Testcase: testDeriveIvLength took 0,081 sec
    [junit] Testcase: testDeriveKey took 0,039 sec
    [junit] Testcase: testDeriveIvNullInput took 0,002 sec
    [junit] Testcase: testDeriveIv took 0,01 sec
    [junit] Running freenet.crypt.MessageAuthCodeTest
    [junit] Testsuite: freenet.crypt.MessageAuthCodeTest
    [junit] HMACSHA256
    [junit] HMACSHA384
    [junit] HMACSHA512
    [junit] Poly1305AES
    [junit] Tests run: 29, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,935 sec
    [junit] Tests run: 29, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,935 sec
    [junit] ------------- Standard Output ---------------
    [junit] HMACSHA256
    [junit] HMACSHA384
    [junit] HMACSHA512
    [junit] Poly1305AES
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSetIVIvParameterSpec took 0,868 sec
    [junit] Testcase: testAddBytesByteBufferNullInput took 0,01 sec
    [junit] Testcase: testVerifyData took 0,072 sec
    [junit] Testcase: testVerifyDataNullInput1 took 0,016 sec
    [junit] Testcase: testVerifyDataNullInput2 took 0,005 sec
    [junit] Testcase: testAddByte took 0,031 sec
    [junit] Testcase: testAddBytesByteArrayIntIntNullInput took 0,003 sec
    [junit] Testcase: testGenIV took 0,001 sec
    [junit] Testcase: testGetIV took 0,001 sec
    [junit] Testcase: testGenIVLength took 0,002 sec
    [junit] Testcase: testGenIVUnsupportedTypeException took 0,002 sec
    [junit] Testcase: testVerifyNullInput1 took 0,001 sec
    [junit] Testcase: testVerifyNullInput2 took 0,001 sec
    [junit] Testcase: testGetMacByteArrayArray took 0,013 sec
    [junit] Testcase: testGetMacByteArrayArrayNullInput took 0,003 sec
    [junit] Testcase: testVerifyDataFalse took 0,012 sec
    [junit] Testcase: testSetIVIvParameterSpecNullInput took 0,001 sec
    [junit] Testcase: testAddBytesByteBuffer took 0,029 sec
    [junit] Testcase: testGetIVUnsupportedTypeException took 0,002 sec
    [junit] Testcase: testAddBytesByteArrayIntIntOffsetOutOfBounds took 0,003 sec
    [junit] Testcase: testAddBytesByteArrayIntIntLengthOutOfBounds took 0,012 sec
    [junit] Testcase: testAddByteNullInput took 0,006 sec
    [junit] Testcase: testAddBytesByteArrayIntInt took 0,041 sec
    [junit] Testcase: testGetMacByteArrayArrayNullMatrixElementInput took 0,004 sec
    [junit] Testcase: testGetKey took 0,009 sec
    [junit] Testcase: testVerifyFalse took 0 sec
    [junit] Testcase: testGetMacByteArrayArrayReset took 0,018 sec
    [junit] Testcase: testSetIVIvParameterSpecUnsupportedTypeException took 0,001 sec
    [junit] Testcase: testVerify took 0 sec
    [junit] Running freenet.crypt.PCFBModeTest
    [junit] Testsuite: freenet.crypt.PCFBModeTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12391033ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12306733ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,715 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11,715 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12391033ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12306733ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testKnownValues took 7,73 sec
    [junit] Testcase: testKnownValuesRandomLength took 2,027 sec
    [junit] Testcase: testRandom took 1,476 sec
    [junit] Running freenet.crypt.TrivialPaddedBucketTest
    [junit] Testsuite: freenet.crypt.TrivialPaddedBucketTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,342 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,342 sec
    [junit] 
    [junit] Testcase: testSimple took 0,872 sec
    [junit] Running freenet.crypt.YarrowTest
    [junit] Testsuite: freenet.crypt.YarrowTest
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi1400214721143539532lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12111166ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12287327ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,909 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,909 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12111166ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12287327ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testNextBoolean took 9,322 sec
    [junit] Testcase: testDouble took 0,087 sec
    [junit] Testcase: testNextInt took 0,011 sec
    [junit] Running freenet.crypt.ciphers.RijndaelTest
    [junit] Testsuite: freenet.crypt.ciphers.RijndaelTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12295028ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12280510ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 13,422 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 13,422 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12295028ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12280510ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testGladmanTestVectors took 12,014 sec
    [junit] Testcase: testNonStandardTestVK took 0,01 sec
    [junit] Testcase: testStandardTestVKJCA took 0,242 sec
    [junit] Testcase: testKnownValue took 0,001 sec
    [junit] Testcase: testStandardTestVK took 0,019 sec
    [junit] Testcase: testRandom took 0,672 sec
    [junit] Running freenet.io.AddressIdentifierTest
    [junit] Testsuite: freenet.io.AddressIdentifierTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,535 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,535 sec
    [junit] 
    [junit] Testcase: test took 0,045 sec
    [junit] Testcase: testIsAnISATAPIPv6Address took 0,002 sec
    [junit] Running freenet.io.Inet4AddressMatcherTest
    [junit] Testsuite: freenet.io.Inet4AddressMatcherTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,506 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,506 sec
    [junit] 
    [junit] Testcase: test took 0,035 sec
    [junit] Running freenet.io.Inet6AddressMatcherTest
    [junit] Testsuite: freenet.io.Inet6AddressMatcherTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,489 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,489 sec
    [junit] 
    [junit] Testcase: test took 0,025 sec
    [junit] Running freenet.io.MessageTest
    [junit] Testsuite: freenet.io.MessageTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,613 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,613 sec
    [junit] 
    [junit] Testcase: test took 0,102 sec
    [junit] Running freenet.keys.ClientCHKBlockTest
    [junit] Testsuite: freenet.keys.ClientCHKBlockTest
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi8597104015519126133lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12046351ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12363920ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30,534 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 30,534 sec
    [junit] ------------- Standard Output ---------------
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12046351ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12363920ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testEncodeDecodeNearlyFullBlock took 20,355 sec
    [junit] Testcase: testEncodeDecodeShortInteger took 5,12 sec
    [junit] Testcase: testEncodeDecodeRandomLength took 0,507 sec
    [junit] Testcase: testEncodeDecodeEmptyBlock took 0,044 sec
    [junit] Testcase: testEncodeDecodeFullBlock took 4,072 sec
    [junit] Running freenet.keys.FreenetURITest
    [junit] Testsuite: freenet.keys.FreenetURITest
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi4925345381680209058lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12143503ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12278956ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,385 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,385 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12143503ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12278956ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testDeriveRequestURIFromInsertURI took 7,9 sec
    [junit] Testcase: testSskForUSK took 0,007 sec
    [junit] Running freenet.l10n.BaseL10nTest
    [junit] Testsuite: freenet.l10n.BaseL10nTest
    [junit] The default translation for test.nonexistent hasn't been found!
    [junit] java.lang.Exception
    [junit]     at freenet.l10n.BaseL10n.getFallbackString(BaseL10n.java:545)
    [junit]     at freenet.l10n.BaseL10n.access$000(BaseL10n.java:37)
    [junit]     at freenet.l10n.BaseL10n$L10nStringIterator.next(BaseL10n.java:166)
    [junit]     at freenet.l10n.BaseL10n$L10nStringIterator.next(BaseL10n.java:140)
    [junit]     at freenet.l10n.BaseL10n.getString(BaseL10n.java:447)
    [junit]     at freenet.l10n.BaseL10nTest.testGetStringNonexistent(BaseL10nTest.java:188)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,014 sec
    [junit] Tests run: 20, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,014 sec
    [junit] ------------- Standard Error -----------------
    [junit] The default translation for test.nonexistent hasn't been found!
    [junit] java.lang.Exception
    [junit]     at freenet.l10n.BaseL10n.getFallbackString(BaseL10n.java:545)
    [junit]     at freenet.l10n.BaseL10n.access$000(BaseL10n.java:37)
    [junit]     at freenet.l10n.BaseL10n$L10nStringIterator.next(BaseL10n.java:166)
    [junit]     at freenet.l10n.BaseL10n$L10nStringIterator.next(BaseL10n.java:140)
    [junit]     at freenet.l10n.BaseL10n.getString(BaseL10n.java:447)
    [junit]     at freenet.l10n.BaseL10nTest.testGetStringNonexistent(BaseL10nTest.java:188)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testAddL10nSubstitutionMissingBrace took 0,267 sec
    [junit] Testcase: testAddL10nSubstitutionMissingFallback took 0,024 sec
    [junit] Testcase: testAddL10nSubstitutionUnclosedMissing took 0,008 sec
    [junit] Testcase: testAddL10nSubstitutionMissing took 0,009 sec
    [junit] Testcase: testAddL10nSubstitutionSelfNested took 0,009 sec
    [junit] Testcase: testGetStringOverridden took 0,011 sec
    [junit] Testcase: testAddL10nSubstitutionExtra took 0,009 sec
    [junit] Testcase: testAddL10nSubstitution took 0,009 sec
    [junit] Testcase: testAddL10nSubstitutionUnclosed took 0,009 sec
    [junit] Testcase: testGetStringFallbackOverridden took 0,01 sec
    [junit] Testcase: testGetStringNonexistent took 0,047 sec
    [junit] Testcase: testAddL10nSubstitutionDouble took 0,008 sec
    [junit] Testcase: testGetStringFallback took 0,017 sec
    [junit] Testcase: testAddL10nSubstitutionNested took 0,008 sec
    [junit] Testcase: testAddL10nSubstitutionUnmatchedClose took 0,008 sec
    [junit] Testcase: testAddL10nSubstitutionMultiple took 0,009 sec
    [junit] Testcase: testAddL10nSubstitutionSelfNestedEmpty took 0,008 sec
    [junit] Testcase: testGetString took 0,007 sec
    [junit] Testcase: testAddL10nSubstitutionFallback took 0,021 sec
    [junit] Testcase: testStrings took 8,934 sec
    [junit] Running freenet.node.LocationTest
    [junit] Testsuite: freenet.node.LocationTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,899 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,899 sec
    [junit] 
    [junit] Testcase: testDistanceAllowInvalid took 0,019 sec
    [junit] Testcase: testNormalize took 0 sec
    [junit] Testcase: testDistance took 0,001 sec
    [junit] Testcase: testChange took 0,004 sec
    [junit] Testcase: testEquals took 0 sec
    [junit] Testcase: testIsValid took 0,001 sec
    [junit] Running freenet.node.MasterKeysTest
    [junit] Testsuite: freenet.node.MasterKeysTest
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi5606170937759971460lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12409068ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12472834ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Encrypted password with 50 iterations.
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Trying to read master keys file...
    [junit] Encrypted password with 130 iterations.
    [junit] Decrypting master keys using password with 130 iterations...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Encrypted password with 760 iterations.
    [junit] Writing new master.keys file
    [junit] Encrypted password with 1230 iterations.
    [junit] Decrypting master keys using password with 1230 iterations...
    [junit] Trying to read master keys file...
    [junit] Decrypting master keys using password with 1230 iterations...
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Writing new master.keys file
    [junit] Encrypted password with 2460 iterations.
    [junit] Decrypting master keys using password with 2460 iterations...
    [junit] Trying to read master keys file...
    [junit] Trying to read master keys file...
    [junit] Decrypting master keys using password with 2460 iterations...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,656 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,656 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12409068ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12472834ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Encrypted password with 50 iterations.
    [junit] Encrypted password with 130 iterations.
    [junit] Decrypting master keys using password with 130 iterations...
    [junit] Encrypted password with 760 iterations.
    [junit] Encrypted password with 1230 iterations.
    [junit] Decrypting master keys using password with 1230 iterations...
    [junit] Decrypting master keys using password with 1230 iterations...
    [junit] Encrypted password with 2460 iterations.
    [junit] Decrypting master keys using password with 2460 iterations...
    [junit] Decrypting master keys using password with 2460 iterations...
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Writing new master.keys file
    [junit] Trying to read master keys file...
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] DELETING FILE tmp.master-keys-test
    [junit] Trying to read master keys file...
    [junit] Creating new master keys file
    [junit] Trying to read master keys file...
    [junit] Read old master keys file
    [junit] DELETING FILE tmp.master-keys-test/test.master.keys
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testChangePasswordEmptyToEmpty took 9,014 sec
    [junit] Testcase: testChangePasswordSomethingToEmpty took 0,138 sec
    [junit] Testcase: testRestartWithPassword took 0,152 sec
    [junit] Testcase: testChangePasswordSomethingToSomething took 0,385 sec
    [junit] Testcase: testChangePasswordEmptyToSomething took 0,267 sec
    [junit] Testcase: testRestartNoPassword took 0,014 sec
    [junit] Running freenet.node.MessageWrapperTest
    [junit] Testsuite: freenet.node.MessageWrapperTest
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,574 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,574 sec
    [junit] 
    [junit] Testcase: testGetFragmentWithLoss took 0,134 sec
    [junit] Testcase: testLost took 0,002 sec
    [junit] Testcase: testGetFragment took 0,001 sec
    [junit] Running freenet.node.NPFPacketTest
    [junit] Testsuite: freenet.node.NPFPacketTest
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi197424770511261387lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] Tests run: 22, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,957 sec
    [junit] Tests run: 22, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,957 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSendEmptyPacket took 0,149 sec
    [junit] Testcase: testPacketWithAck took 0,005 sec
    [junit] Testcase: testSendCompletePacket took 0,025 sec
    [junit] Testcase: testReceiveBadFragment took 0,001 sec
    [junit] Testcase: testEncodeDecodeLossyPerPacketMessages2 took 0,004 sec
    [junit] Testcase: testPacketWithFragments took 0,001 sec
    [junit] Testcase: testSendPacketWithAck took 0 sec
    [junit] Testcase: testSendPacketWithTwoAcks took 0,004 sec
    [junit] Testcase: testReceiveSequenceNumber took 0,001 sec
    [junit] Testcase: testEmptyPacket took 0,001 sec
    [junit] Testcase: testSendPacketWithTwoAcksLong took 0 sec
    [junit] Testcase: testReceiveZeroLengthFragment took 0 sec
    [junit] Testcase: testReceiveLongFragmentedMessage took 0,001 sec
    [junit] Testcase: testSendPacketWithAcks took 0,001 sec
    [junit] Testcase: testEncodeDecodeLossyPerPacketMessages2Padded took 2,813 sec
    [junit] Testcase: testReceivedLargeFragment took 0 sec
    [junit] Testcase: testLength took 0 sec
    [junit] Testcase: testPacketWithFragment took 0,02 sec
    [junit] Testcase: testSendPacketWithAckRange took 0 sec
    [junit] Testcase: testEncodeDecodeLossyPerPacketMessages took 0,003 sec
    [junit] Testcase: testPacketWithAcks took 0,001 sec
    [junit] Testcase: testSendPacketWithFragment took 0,001 sec
    [junit] Running freenet.node.NewPacketFormatTest
    [junit] Testsuite: freenet.node.NewPacketFormatTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12498625ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12406267ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14,78 sec
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14,78 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12498625ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12406267ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testLoadStatsSendWhenPeerWants took 1,141 sec
    [junit] Testcase: testResendAlreadyCompleted took 0,206 sec
    [junit] Testcase: testLostLastAck took 3,213 sec
    [junit] Testcase: testLoadStatsLowLevel took 0,208 sec
    [junit] Testcase: testLoadStatsHighLevel took 0,203 sec
    [junit] Testcase: testSequenceNumberEncryption took 8,279 sec
    [junit] Testcase: testReceiveUnknownMessageLength took 0,003 sec
    [junit] Testcase: testAckOnlyCreation took 0,402 sec
    [junit] Testcase: testEmptyCreation took 0,015 sec
    [junit] Testcase: testOutOfOrderDelivery took 0,003 sec
    [junit] Testcase: testEncryption took 0,548 sec
    [junit] Running freenet.node.NodeTest
    [junit] Testsuite: freenet.node.NodeTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,531 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,531 sec
    [junit] 
    [junit] Testcase: testDefaultStoreSizeSanity took 0,007 sec
    [junit] Running freenet.node.PeerMessageQueueTest
    [junit] Testsuite: freenet.node.PeerMessageQueueTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,6 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,6 sec
    [junit] 
    [junit] Testcase: testUrgentTimeEmpty took 0,127 sec
    [junit] Testcase: testUrgentTime took 0,006 sec
    [junit] Testcase: testGrabQueuedMessageItem took 0,01 sec
    [junit] Testcase: testUrgentTimeQueuedWrong took 0,002 sec
    [junit] Running freenet.node.probe.ErrorTest
    [junit] Testsuite: freenet.node.probe.ErrorTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,616 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,616 sec
    [junit] 
    [junit] Testcase: testValidCodes took 0,017 sec
    [junit] Testcase: testInvalidCodes took 0,005 sec
    [junit] Running freenet.node.probe.TypeTest
    [junit] Testsuite: freenet.node.probe.TypeTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,475 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,475 sec
    [junit] 
    [junit] Testcase: testValidCodes took 0,012 sec
    [junit] Testcase: testInvalidCodes took 0,006 sec
    [junit] Running freenet.pluginmanager.PluginStoreTest
    [junit] Testsuite: freenet.pluginmanager.PluginStoreTest
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,383 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,383 sec
    [junit] 
    [junit] Testcase: testStringsWithInvalidChars took 0,039 sec
    [junit] Testcase: testWriteStringArrays took 0,004 sec
    [junit] Testcase: testRandom took 0,733 sec
    [junit] Running freenet.store.PubkeyStoreTest
    [junit] Testsuite: freenet.store.PubkeyStoreTest
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi948726083168094314lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,803 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,803 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSimple took 2,369 sec
    [junit] Running freenet.store.RAMSaltMigrationTest
    [junit] Testsuite: freenet.store.RAMSaltMigrationTest
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi7194115120188342437lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12211695ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12343605ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false
    [junit] Resizing datastore teststore
    [junit] Waiting for resize to complete...
    [junit] WrapperManager: Initializing...
    [junit] WrapperManager: WARNING - The wrapper.native_library system property was not
    [junit] WrapperManager:           set. Using the default value, 'wrapper'.
    [junit] WrapperManager: WARNING - The version of the Wrapper which launched this JVM is 
    [junit] WrapperManager:           "unknown" while the version of the native library 
    [junit] WrapperManager:           is "3.5.14".
    [junit] WrapperManager:           The Wrapper may appear to work correctly but some features may
    [junit] WrapperManager:           not function correctly.  This configuration has not been tested
    [junit] WrapperManager:           and is not supported.
    [junit] WrapperManager: 
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] Resizing datastore teststore
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] Resizing datastore teststore
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] teststore cleaner in progress: 0/20
    [junit] Successfully closed store teststore
    [junit] Resizing datastore (teststore)
    [junit] Resizing datastore teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Successfully closed store teststore
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] Resizing datastore teststore
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Successfully closed store teststore
    [junit] Waiting for resize to complete...
    [junit] Resizing datastore teststore
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] teststore cleaner in progress: 0/20
    [junit] Successfully closed store teststore
    [junit] Resizing datastore (teststore)
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 28,825 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 28,825 sec
    [junit] ------------- Standard Output ---------------
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12211695ns
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12343605ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] WrapperManager: Initializing...
    [junit] WrapperManager: WARNING - The wrapper.native_library system property was not
    [junit] WrapperManager:           set. Using the default value, 'wrapper'.
    [junit] WrapperManager: WARNING - The version of the Wrapper which launched this JVM is 
    [junit] WrapperManager:           "unknown" while the version of the native library 
    [junit] WrapperManager:           is "3.5.14".
    [junit] WrapperManager:           The Wrapper may appear to work correctly but some features may
    [junit] WrapperManager:           not function correctly.  This configuration has not been tested
    [junit] WrapperManager:           and is not supported.
    [junit] WrapperManager: 
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore (teststore)
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] Resizing datastore (teststore)
    [junit] Resizing datastore teststore
    [junit] Successfully closed store teststore
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-50-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-0-true/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Slot filter (tmp-slashdotstoretest/saltstore/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] teststore cleaner in progress: 0/20
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=true).
    [junit] Waiting for resize to complete...
    [junit] teststore cleaner in progress: 0/10
    [junit] Completed shrink, old size was 10 new size was 20 size is now 20 (prev=0)
    [junit] Slot filter (tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter) for teststore is loaded (new=false).
    [junit] teststore cleaner in progress: 0/20
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.config
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-false/teststore.hd
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.metadata
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.config
    [junit] Shutting down...
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.slotfilter
    [junit] DELETING FILE tmp-slashdotstoretest/saltstore-5-10-true/teststore.hd
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testRAMStoreOldBlocks took 8,65 sec
    [junit] Testcase: testMigrateKeyed took 0,536 sec
    [junit] Testcase: testSaltedStoreOldBlock took 1,913 sec
    [junit] Testcase: testMigrate took 0,135 sec
    [junit] Testcase: testSaltedStoreWithClose took 11,16 sec
    [junit] Testcase: testRAMStore took 0,044 sec
    [junit] Testcase: testSaltedStore took 0,462 sec
    [junit] Testcase: testSaltedStoreResize took 5,369 sec
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Successfully closed store teststore
    [junit] Running freenet.store.SimplePubkeyCacheTest
    [junit] Testsuite: freenet.store.SimplePubkeyCacheTest
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi763237010618395458lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,743 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,743 sec
    [junit] ------------- Standard Output ---------------
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testSimple took 2,308 sec
    [junit] Running freenet.store.SlashdotStoreTest
    [junit] Testsuite: freenet.store.SlashdotStoreTest
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi4529179146234517394lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12403660ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12357145ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] DELETING FILE tmp-slashdotstoretest/temp-5cbc7b772b053911
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 12,93 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 12,93 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12403660ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12357145ns
    [junit] Using JCA cipher provider: BC version 1.54
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] DELETING FILE tmp-slashdotstoretest/temp-5cbc7b772b053911
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testDeletion took 12,166 sec
    [junit] Testcase: testSimple took 0,247 sec
    [junit] Running freenet.store.caching.CachingFreenetStoreTest
    [junit] Testsuite: freenet.store.caching.CachingFreenetStoreTest
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi3181800319206520722lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12131876ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12277187ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter) for testCachingFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreTimeExpire
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter) for testCachingFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18,69 sec
    [junit] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18,69 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12131876ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12277187ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreTimeExpire
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter) for testCachingFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnClose.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreTimeExpire.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter) for testCachingFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter) for testCachingFreenetStoreSSK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreSSK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testOnCollisionsSSK took 9,649 sec
    [junit] Testcase: testSimpleCHK took 1,143 sec
    [junit] Testcase: testSimpleSSK took 1,027 sec
    [junit] Testcase: testOnCloseCHK took 0,308 sec
    [junit] Testcase: testOnCloseSSK took 0,653 sec
    [junit] Testcase: testManualWriteCollision took 0,257 sec
    [junit] Testcase: testTimeExpireCHK took 0,409 sec
    [junit] Testcase: testTimeExpireSSK took 0,86 sec
    [junit] Testcase: testCollisionsOverMaximumSize took 0,213 sec
    [junit] Testcase: testSimpleManualWrite took 0,129 sec
    [junit] Testcase: testZeroSize took 0,497 sec
    [junit] Testcase: testOverMaximumSize took 2,974 sec
    [junit] Shutting down...
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreOnClose
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreTimeExpire
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreOnCloseSSK
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] Successfully closed store testCachingFreenetStoreSSK
    [junit] Running freenet.store.saltedhash.SaltedHashFreenetStoreTest
    [junit] Testsuite: freenet.store.saltedhash.SaltedHashFreenetStoreTest
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] Slot filter (tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter) for testSaltedHashFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi511529968691651791lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12325568ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12420593ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.hd
    [junit] Slot filter (tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter) for testSaltedHashFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] Successfully closed store testSaltedHashFreenetStoreCHK
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] Successfully closed store testSaltedHashFreenetStoreSSK
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 13,027 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 13,027 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12325568ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12420593ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] Successfully closed store testSaltedHashFreenetStoreCHK
    [junit] Successfully closed store testSaltedHashFreenetStoreSSK
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.config
    [junit] Slot filter (tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter) for testSaltedHashFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.hd
    [junit] Slot filter (tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter) for testSaltedHashFreenetStoreOnCloseSSK is loaded (new=true).
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.slotfilter
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreOnCloseSSK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.config
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.hd
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.metadata
    [junit] DELETING FILE tmp-saltedHashfreenetstoretest/saltstore/testSaltedHashFreenetStoreSSK.config
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testOnCollisionsSSK took 10,039 sec
    [junit] Testcase: testSimpleCHK took 1,584 sec
    [junit] Testcase: testSimpleSSK took 0,789 sec
    [junit] Shutting down...
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] Successfully closed store testSaltedHashFreenetStoreCHK
    [junit] Successfully closed store testSaltedHashFreenetStoreOnCloseSSK
    [junit] Successfully closed store testSaltedHashFreenetStoreSSK
    [junit] Running freenet.store.saltedhash.SaltedHashSlotFilterTest
    [junit] Testsuite: freenet.store.saltedhash.SaltedHashSlotFilterTest
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi6651877886827377202lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12048372ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12264320ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Rebuilding slot filter because new
    [junit] WrapperManager: Initializing...
    [junit] WrapperManager: WARNING - The wrapper.native_library system property was not
    [junit] WrapperManager:           set. Using the default value, 'wrapper'.
    [junit] testCachingFreenetStoreCHK cleaner in progress: 0/100
    [junit] WrapperManager: WARNING - The version of the Wrapper which launched this JVM is 
    [junit] WrapperManager:           "unknown" while the version of the native library 
    [junit] WrapperManager:           is "3.5.14".
    [junit] WrapperManager:           The Wrapper may appear to work correctly but some features may
    [junit] WrapperManager:           not function correctly.  This configuration has not been tested
    [junit] WrapperManager:           and is not supported.
    [junit] WrapperManager: 
    [junit] testCachingFreenetStoreCHK cleaner finished successfully.
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Rebuilding slot filter because new
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 24,415 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 24,415 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] HmacSHA256: using SunJCE version 1.7
    [junit] SHA1: using SUN version 1.7
    [junit] MD5: using SUN version 1.7
    [junit] SHA-256: using SUN version 1.7
    [junit] SHA-384: using SUN version 1.7
    [junit] SHA-512: using SUN version 1.7
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12048372ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12264320ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Rebuilding slot filter because new
    [junit] WrapperManager: Initializing...
    [junit] WrapperManager: WARNING - The wrapper.native_library system property was not
    [junit] WrapperManager:           set. Using the default value, 'wrapper'.
    [junit] WrapperManager: WARNING - The version of the Wrapper which launched this JVM is 
    [junit] WrapperManager:           "unknown" while the version of the native library 
    [junit] WrapperManager:           is "3.5.14".
    [junit] WrapperManager:           The Wrapper may appear to work correctly but some features may
    [junit] WrapperManager:           not function correctly.  This configuration has not been tested
    [junit] WrapperManager:           and is not supported.
    [junit] WrapperManager: 
    [junit] testCachingFreenetStoreCHK cleaner finished successfully.
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Rebuilding slot filter because new
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] testCachingFreenetStoreCHK cleaner in progress: 0/100
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=false).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore
    [junit] Slot filter (tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter) for testCachingFreenetStoreCHK is loaded (new=true).
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.hd
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.metadata
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.slotfilter
    [junit] DELETING FILE tmp-cachingfreenetstoretest/saltstore/testCachingFreenetStoreCHK.config
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testCHKPresent took 14,834 sec
    [junit] Testcase: testCHKDelayedTurnOnSlotFiltersWithCleaner took 2,049 sec
    [junit] Testcase: testCHKPresentWithAbort took 3,377 sec
    [junit] Testcase: testCHKPresentWithClose took 2,452 sec
    [junit] Testcase: testCHKDelayedTurnOnSlotFilters took 1,186 sec
    [junit] Shutting down...
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Successfully closed store testCachingFreenetStoreCHK
    [junit] Running freenet.support.Base64Test
    [junit] Testsuite: freenet.support.Base64Test
    [junit] Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,708 sec
    [junit] Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,708 sec
    [junit] 
    [junit] Testcase: testIllegalBaseLength took 0,017 sec
    [junit] Testcase: testIllegalBaseCharacter took 0,001 sec
    [junit] Testcase: testDecodeStandard took 0,005 sec
    [junit] Testcase: testEncodeDecode took 0,001 sec
    [junit] Testcase: testEncodeStandard took 0,005 sec
    [junit] Testcase: testDecode took 0,001 sec
    [junit] Testcase: testEncode took 0,001 sec
    [junit] Testcase: testRandom took 1,116 sec
    [junit] Testcase: testEncodePadding took 0,001 sec
    [junit] Running freenet.support.BitArrayTest
    [junit] Testsuite: freenet.support.BitArrayTest
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,503 sec
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,503 sec
    [junit] 
    [junit] Testcase: testShrinkGrow took 0,008 sec
    [junit] Testcase: testSetAndGetBit took 0,001 sec
    [junit] Testcase: testUnsignedByteToInt took 0,004 sec
    [junit] Testcase: testToStringEmpty took 0,001 sec
    [junit] Testcase: testGetSize took 0 sec
    [junit] Testcase: testLastOne took 0,001 sec
    [junit] Testcase: testFirstOne took 0,001 sec
    [junit] Testcase: testSetBit_OutOfBounds took 0,001 sec
    [junit] Testcase: testBitArray_int took 0 sec
    [junit] Testcase: testToStringAllEquals took 0,002 sec
    [junit] Testcase: testSetAllOnes took 0 sec
    [junit] Running freenet.support.BloomFilterTest
    [junit] Testsuite: freenet.support.BloomFilterTest
    [junit] ---freenet.support.CountingBloomFilter@6a790e37---
    [junit]           k = 1
    [junit]           q = 0.3935063648773005
    [junit]           p = 0.3935063648773005
    [junit]       limit = 0.41330375343366554
    [junit]      actual = 0.38916015625
    [junit]  actual / p = 0.9889551757856427
    [junit] ---freenet.support.BinaryBloomFilter@7a631c70---
    [junit]           k = 1
    [junit]           q = 0.3935063648773005
    [junit]           p = 0.3935063648773005
    [junit]       limit = 0.41330375343366554
    [junit]      actual = 0.38916015625
    [junit]  actual / p = 0.9889551757856427
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6,65 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6,65 sec
    [junit] ------------- Standard Output ---------------
    [junit] ---freenet.support.CountingBloomFilter@6a790e37---
    [junit]           k = 1
    [junit]           q = 0.3935063648773005
    [junit]           p = 0.3935063648773005
    [junit]       limit = 0.41330375343366554
    [junit]      actual = 0.38916015625
    [junit]  actual / p = 0.9889551757856427
    [junit] ---freenet.support.BinaryBloomFilter@7a631c70---
    [junit]           k = 1
    [junit]           q = 0.3935063648773005
    [junit]           p = 0.3935063648773005
    [junit]       limit = 0.41330375343366554
    [junit]      actual = 0.38916015625
    [junit]  actual / p = 0.9889551757856427
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testCountingFilterRemove took 3,704 sec
    [junit] Testcase: testBinaryFilterPositive took 0,159 sec
    [junit] Testcase: testCountingFilterFalsePositive took 0,922 sec
    [junit] Testcase: testCountingFilterPositive took 0,032 sec
    [junit] Testcase: testBinaryFilterFalsePositive took 1,279 sec
    [junit] Running freenet.support.BufferTest
    [junit] Testsuite: freenet.support.BufferTest
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,543 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,543 sec
    [junit] 
    [junit] Testcase: testDataInputStreamBuffer took 0,01 sec
    [junit] Testcase: testByteArrayBuffer took 0,003 sec
    [junit] Testcase: testCopy took 0,002 sec
    [junit] Testcase: testByteArrayIndexBuffer took 0,001 sec
    [junit] Testcase: testHashcode took 0,062 sec
    [junit] Testcase: testLongBufferToString took 0,001 sec
    [junit] Testcase: testEquals took 0,001 sec
    [junit] Testcase: testBadLength took 0 sec
    [junit] Running freenet.support.ByteArrayWrapperTest
    [junit] Testsuite: freenet.support.ByteArrayWrapperTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,506 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,506 sec
    [junit] 
    [junit] Testcase: testWrapper took 0,074 sec
    [junit] Running freenet.support.ByteBufferInputStreamTest
    [junit] Testsuite: freenet.support.ByteBufferInputStreamTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,456 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,456 sec
    [junit] 
    [junit] Testcase: testUnsignedRead took 0,013 sec
    [junit] Running freenet.support.DoublyLinkedListImplTest
    [junit] Testsuite: freenet.support.DoublyLinkedListImplTest
    [junit] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] 
    [junit] Testcase: testIternator took 0,032 sec
    [junit] Testcase: testPopN took 0,001 sec
    [junit] Testcase: testClearSize took 0,001 sec
    [junit] Testcase: testHeadTail took 0 sec
    [junit] Testcase: testRandomRemovePush took 0 sec
    [junit] Testcase: testForwardShiftUnshift took 0,001 sec
    [junit] Testcase: testRandomInsert took 0,003 sec
    [junit] Testcase: testForwardPushPop took 0 sec
    [junit] Testcase: testRandomShiftPush took 0 sec
    [junit] Testcase: testShiftN took 0 sec
    [junit] Running freenet.support.FieldTrimSecondTest
    [junit] Testsuite: freenet.support.FieldTrimSecondTest
    [junit] Input: 50 KiB/s Parsed: 51200   Intended: 51200
    [junit] Input: 1.5 MiB/sec  Parsed: 1572864 Intended: 1572864
    [junit] Input: 128 kbps Parsed: 128000  Intended: 128000
    [junit] Input: 20 KiB   Parsed: 20480   Intended: 20480
    [junit] Input: 5800 Parsed: 5800    Intended: 5800
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,635 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,635 sec
    [junit] ------------- Standard Output ---------------
    [junit] Input: 50 KiB/s Parsed: 51200   Intended: 51200
    [junit] Input: 1.5 MiB/sec  Parsed: 1572864 Intended: 1572864
    [junit] Input: 128 kbps Parsed: 128000  Intended: 128000
    [junit] Input: 20 KiB   Parsed: 20480   Intended: 20480
    [junit] Input: 5800 Parsed: 5800    Intended: 5800
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: test took 1,133 sec
    [junit] Running freenet.support.FieldsTest
    [junit] Testsuite: freenet.support.FieldsTest
    [junit] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,396 sec
    [junit] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,396 sec
    [junit] 
    [junit] Testcase: testBytesToLongsException took 0,06 sec
    [junit] Testcase: testCommaListFromString took 0,001 sec
    [junit] Testcase: testHashcodeForByteArray took 0 sec
    [junit] Testcase: testLongHashcode took 0 sec
    [junit] Testcase: testHexToLong took 0,002 sec
    [junit] Testcase: testBoolToString took 0 sec
    [junit] Testcase: testBytesToLong took 0,001 sec
    [junit] Testcase: testIntsToBytes took 0,001 sec
    [junit] Testcase: testCompareVersion took 0,007 sec
    [junit] Testcase: testTrimLines took 0,004 sec
    [junit] Testcase: testHexToInt took 0,001 sec
    [junit] Testcase: testBytesToInt took 0 sec
    [junit] Testcase: testGetDigits took 0,708 sec
    [junit] Testcase: testStringToBool took 0,001 sec
    [junit] Testcase: testStringToBoolWithDefault took 0,001 sec
    [junit] Testcase: testStringArrayToCommaList took 0 sec
    [junit] Testcase: testBytesToLongException took 0,001 sec
    [junit] Testcase: testLongsToBytes took 0,001 sec
    [junit] Running freenet.support.HTMLEncoderDecoderTest
    [junit] Testsuite: freenet.support.HTMLEncoderDecoderTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,969 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,969 sec
    [junit] 
    [junit] Testcase: testCompactRepeated took 0,092 sec
    [junit] Testcase: testDecodeAppendedEntities took 0,248 sec
    [junit] Testcase: testIsWhiteSpace took 0,002 sec
    [junit] Testcase: testDecodeIncomplete took 0 sec
    [junit] Testcase: testDecodeSingleEntities took 0,014 sec
    [junit] Testcase: testCompactMixed took 0,001 sec
    [junit] Running freenet.support.HTMLNodeTest
    [junit] Testsuite: freenet.support.HTMLNodeTest
    [junit] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,797 sec
    [junit] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,797 sec
    [junit] 
    [junit] Testcase: testHTMLNode_StringStringStringString_WrongAttributeName took 0,048 sec
    [junit] Testcase: testAddChildSameName took 0,018 sec
    [junit] Testcase: testHTMLNode_StringStringStringString_WrongNodeName took 0,002 sec
    [junit] Testcase: testAddChildUsingTheNodeItselfAsChild took 0,001 sec
    [junit] Testcase: testAddChild_StringArrayArrayString took 0,002 sec
    [junit] Testcase: testHTMLNodeArray_nullAttributeValue took 0,005 sec
    [junit] Testcase: testGenerate_fromHTMLNode_StringString took 0,124 sec
    [junit] Testcase: testHTMLNode_AttributesArray took 0,009 sec
    [junit] Testcase: testAddChildrenSameObject took 0,001 sec
    [junit] Testcase: testAddChild_StringArrayArray took 0,001 sec
    [junit] Testcase: testAddGetAttributes took 0,009 sec
    [junit] Testcase: testGenerate_HTMLNode_withChild took 0,003 sec
    [junit] Testcase: testGenerate_fromHTMLNode_String took 0,001 sec
    [junit] Testcase: testAddAttribute_nullAttributeValue took 0,001 sec
    [junit] Testcase: testAddChildrenUsingTheNodeItselfAsChild took 0,001 sec
    [junit] Testcase: testGenerate_fromHTMLNode_StringStringStringString took 0,002 sec
    [junit] Testcase: testHTMLNode_nullAttributeValue took 0,003 sec
    [junit] Testcase: testAddChild_StringStringStringString took 0,002 sec
    [junit] Testcase: testGenerate_fromHTMLNode_percentName took 0,001 sec
    [junit] Testcase: testGenerate_fromHTMLNode_StringStringString took 0,002 sec
    [junit] Testcase: testGenerate_fromHTMLNode_textareaDivA took 0,005 sec
    [junit] Testcase: testHTMLDoctype_generate took 0,001 sec
    [junit] Testcase: testGetAttribute took 0,003 sec
    [junit] Testcase: testAddChildSameObject took 0,001 sec
    [junit] Testcase: testHTMLNode_nullAttributeName took 0,001 sec
    [junit] Testcase: testHTMLNode_attributeArrays_differentLengths took 0,001 sec
    [junit] Testcase: testGetContent took 0,001 sec
    [junit] Testcase: testHTMLNodeArray_nullAttributeName took 0,001 sec
    [junit] Testcase: testAddChild_StringStringString took 0,001 sec
    [junit] Testcase: testAddAttribute_nullAttributeName took 0,001 sec
    [junit] Testcase: testGenerate_fromHTMLNodeWithChild_SpecialNames took 0,013 sec
    [junit] Testcase: testSameAttributeManyTimes took 0,003 sec
    [junit] Running freenet.support.HexUtilTest
    [junit] Testsuite: freenet.support.HexUtilTest
    [junit] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,763 sec
    [junit] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,763 sec
    [junit] 
    [junit] Testcase: testBytesToHex_byteIntInt_WithLongReading took 0,059 sec
    [junit] Testcase: testBitsToBytes_BitSetInt took 0,014 sec
    [junit] Testcase: testBytesToHex_byteIntInt_WithLongOffset took 0 sec
    [junit] Testcase: testHexToBits took 0,002 sec
    [junit] Testcase: testHexToBytes_StringByteInt_WithShortArray took 0,001 sec
    [junit] Testcase: testCountBytesForBits_int took 0,026 sec
    [junit] Testcase: testBiToHex_BigInteger took 0,009 sec
    [junit] Testcase: testHexToBytes_WithBadDigit took 0,001 sec
    [junit] Testcase: testBitsToBytes_WithShortSize took 0,001 sec
    [junit] Testcase: testBytesToHexZeroLength took 0,001 sec
    [junit] Testcase: testHexToBytes_StringByteInt took 0,008 sec
    [junit] Testcase: testHexToBytes_StringByteInt_WithLongOffset took 0,001 sec
    [junit] Testcase: testHexToBytes_StringInt took 0,008 sec
    [junit] Testcase: testHexToBytes_String took 0,014 sec
    [junit] Testcase: testWriteAndReadBigInteger took 0,002 sec
    [junit] Testcase: testBytesToBits_byteBitSetInt took 0,029 sec
    [junit] Testcase: testBitsToHexString took 0 sec
    [junit] Testcase: testBytesToHex_byte took 0,01 sec
    [junit] Testcase: testBytesToHex_byteIntInt_WithZeroLength took 0,001 sec
    [junit] Running freenet.support.JVMVersionTest
    [junit] Testsuite: freenet.support.JVMVersionTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,666 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,666 sec
    [junit] 
    [junit] Testcase: testNull took 0,026 sec
    [junit] Testcase: testCompare took 0,135 sec
    [junit] Testcase: testTooOld took 0,001 sec
    [junit] Testcase: testRecentEnough took 0,002 sec
    [junit] Running freenet.support.LRUMapTest
    [junit] Testsuite: freenet.support.LRUMapTest
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,803 sec
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,803 sec
    [junit] 
    [junit] Testcase: testPushNull took 0,104 sec
    [junit] Testcase: testGetNullKey took 0,004 sec
    [junit] Testcase: testPeekValue took 0,009 sec
    [junit] Testcase: testRemoveNotPresent took 0,004 sec
    [junit] Testcase: testGet took 0,004 sec
    [junit] Testcase: testKeys took 0,012 sec
    [junit] Testcase: testSize took 0,009 sec
    [junit] Testcase: testContainsKey took 0,004 sec
    [junit] Testcase: testRemoveNullKey took 0,004 sec
    [junit] Testcase: testPushSameKey took 0,004 sec
    [junit] Testcase: testPopValueFromEmpty took 0 sec
    [junit] Testcase: testPopValue took 0,007 sec
    [junit] Testcase: testPushSameObjTwice took 0,005 sec
    [junit] Testcase: testPopKey took 0,007 sec
    [junit] Testcase: testIsEmpty took 0,007 sec
    [junit] Testcase: testRemoveKey took 0,007 sec
    [junit] Running freenet.support.LRUQueueTest
    [junit] Testsuite: freenet.support.LRUQueueTest
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,702 sec
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,702 sec
    [junit] 
    [junit] Testcase: testPushNull took 0,054 sec
    [junit] Testcase: testToArray2 took 0,011 sec
    [junit] Testcase: testToArray took 0,021 sec
    [junit] Testcase: testRemoveNotPresent took 0,009 sec
    [junit] Testcase: testPop took 0,012 sec
    [junit] Testcase: testSize took 0,008 sec
    [junit] Testcase: testToArrayOrdered2 took 0,009 sec
    [junit] Testcase: testToArrayOrdered took 0,005 sec
    [junit] Testcase: testToArrayEmptyQueue took 0,001 sec
    [junit] Testcase: testPushLeast took 0,005 sec
    [junit] Testcase: testContains took 0,007 sec
    [junit] Testcase: testRemoveNull took 0,004 sec
    [junit] Testcase: testElements took 0,007 sec
    [junit] Testcase: testPushSameObjTwice took 0,005 sec
    [junit] Testcase: testIsEmpty took 0,007 sec
    [junit] Testcase: testRemove took 0,009 sec
    [junit] Running freenet.support.ListUtilsTest
    [junit] Testsuite: freenet.support.ListUtilsTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,564 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,564 sec
    [junit] 
    [junit] Testcase: testRemoveByObject took 0,025 sec
    [junit] Testcase: testRemoveByRandom took 0,006 sec
    [junit] Testcase: testRemoveByIndex took 0,005 sec
    [junit] Testcase: testRemoveByRandomSimple took 0,002 sec
    [junit] Running freenet.support.LoaderTest
    [junit] Testsuite: freenet.support.LoaderTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,504 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,504 sec
    [junit] 
    [junit] Testcase: testLoader took 0,012 sec
    [junit] Running freenet.support.MemoryLimitedJobRunnerTest
    [junit] Testsuite: freenet.support.MemoryLimitedJobRunnerTest
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 26,521 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 26,521 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testAsyncQueueingManySmallDelayed took 8,025 sec
    [junit] Testcase: testQueueingSmallDelayed took 5,638 sec
    [junit] Testcase: testQueueingManySmallDelayed took 7,33 sec
    [junit] Testcase: testAsyncQueueingSmallDelayed took 5,054 sec
    [junit] Running freenet.support.MultiValueTableTest
    [junit] Testsuite: freenet.support.MultiValueTableTest
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,722 sec
    [junit] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,722 sec
    [junit] 
    [junit] Testcase: testContainsElement took 0,025 sec
    [junit] Testcase: testGetArray took 0,009 sec
    [junit] Testcase: testGet took 0,008 sec
    [junit] Testcase: testPut took 0,007 sec
    [junit] Testcase: testClear took 0,008 sec
    [junit] Testcase: testKeys took 0,007 sec
    [junit] Testcase: testGetSync took 0,012 sec
    [junit] Testcase: testContainsKey took 0,012 sec
    [junit] Testcase: testCountAll took 0,009 sec
    [junit] Testcase: testGetAll took 0,026 sec
    [junit] Testcase: testRemoveElement took 0,02 sec
    [junit] Testcase: testIsEmpty took 0,013 sec
    [junit] Testcase: testRemove took 0,007 sec
    [junit] Testcase: testDifferentKeysSameElement took 0,004 sec
    [junit] Running freenet.support.MutableBooleanTest
    [junit] Testsuite: freenet.support.MutableBooleanTest
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,472 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,472 sec
    [junit] 
    [junit] Testcase: testMutableBoolean took 0,014 sec
    [junit] Running freenet.support.PrioritizedSerialExecutorTest
    [junit] Testsuite: freenet.support.PrioritizedSerialExecutorTest
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] [J1, J2, J3, J4]
    [junit] [JM]
    [junit] [JM, J8, JN]
    [junit] [JM, J8, JN, JP, JQ, J2, JO, JR]
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,789 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,789 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] [J1, J2, J3, J4]
    [junit] [JM]
    [junit] [JM, J8, JN]
    [junit] [JM, J8, JN, JP, JQ, J2, JO, JR]
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testRun took 0,296 sec
    [junit] Testcase: testRunPrio took 0,016 sec
    [junit] Running freenet.support.PrioritizedTickerTest
    [junit] Testsuite: freenet.support.PrioritizedTickerTest
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Starting Ticker
    [junit] Starting Ticker
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,215 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,215 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Starting Ticker
    [junit] Starting Ticker
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testDeduping took 0,266 sec
    [junit] Testcase: testSimple took 0,457 sec
    [junit] Running freenet.support.RandomArrayIteratorTest
    [junit] Testsuite: freenet.support.RandomArrayIteratorTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,625 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,625 sec
    [junit] 
    [junit] Testcase: testReset took 0,02 sec
    [junit] Testcase: testNoSuchElement took 0,002 sec
    [junit] Testcase: testReadonly took 0,005 sec
    [junit] Testcase: testDefaultOrder took 0,002 sec
    [junit] Running freenet.support.SentTimeCacheTest
    [junit] Testsuite: freenet.support.SentTimeCacheTest
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,481 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,481 sec
    [junit] 
    [junit] Testcase: testQueryAndRemove took 0,029 sec
    [junit] Testcase: testFifo took 0,004 sec
    [junit] Testcase: testMaxSize took 0,002 sec
    [junit] Running freenet.support.SerialExecutorTest
    [junit] Testsuite: freenet.support.SerialExecutorTest
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,7 sec
    [junit] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,7 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testBlocking took 0,284 sec
    [junit] Running freenet.support.SerializerTest
    [junit] Testsuite: freenet.support.SerializerTest
    [junit] java.lang.IllegalArgumentException: Cannot serialize an array of more than 255 doubles; attempted to serialize 256.
    [junit]     at freenet.support.Serializer.writeToDataOutputStream(Serializer.java:175)
    [junit]     at freenet.support.SerializerTest.testTooLongDoubleArray(SerializerTest.java:53)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit] Threw when too long; should be something about how the array is too long to serialize:
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,557 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,557 sec
    [junit] ------------- Standard Output ---------------
    [junit] Threw when too long; should be something about how the array is too long to serialize:
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] java.lang.IllegalArgumentException: Cannot serialize an array of more than 255 doubles; attempted to serialize 256.
    [junit]     at freenet.support.Serializer.writeToDataOutputStream(Serializer.java:175)
    [junit]     at freenet.support.SerializerTest.testTooLongDoubleArray(SerializerTest.java:53)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    [junit]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    [junit]     at java.lang.reflect.Method.invoke(Method.java:606)
    [junit]     at junit.framework.TestCase.runTest(TestCase.java:176)
    [junit]     at junit.framework.TestCase.runBare(TestCase.java:141)
    [junit]     at junit.framework.TestResult$1.protect(TestResult.java:122)
    [junit]     at junit.framework.TestResult.runProtected(TestResult.java:142)
    [junit]     at junit.framework.TestResult.run(TestResult.java:125)
    [junit]     at junit.framework.TestCase.run(TestCase.java:129)
    [junit]     at junit.framework.TestSuite.runTest(TestSuite.java:255)
    [junit]     at junit.framework.TestSuite.run(TestSuite.java:250)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:523)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1063)
    [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:914)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testTooLongDoubleArray took 0,036 sec
    [junit] Testcase: test took 0,048 sec
    [junit] Running freenet.support.ShortBufferTest
    [junit] Testsuite: freenet.support.ShortBufferTest
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,758 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,758 sec
    [junit] 
    [junit] Testcase: testShortBufferToString took 0,026 sec
    [junit] Testcase: testCopy took 0,003 sec
    [junit] Testcase: testByteArrayShortBuffer took 0,015 sec
    [junit] Testcase: testByteArrayIndexShortBuffer took 0,001 sec
    [junit] Testcase: testHashcode took 0,091 sec
    [junit] Testcase: testEquals took 0,001 sec
    [junit] Testcase: testDataInputStreamShortBuffer took 0,003 sec
    [junit] Testcase: testBadLength took 0,005 sec
    [junit] Running freenet.support.SimpleFieldSetTest
    [junit] Testsuite: freenet.support.SimpleFieldSetTest
    [junit] Starting iterator test
    [junit] Tests run: 37, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,849 sec
    [junit] Tests run: 37, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,849 sec
    [junit] ------------- Standard Output ---------------
    [junit] Starting iterator test
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testPutAndTPut_WithEmpty took 0,03 sec
    [junit] Testcase: testDirectSubsetNameIterator took 0,002 sec
    [junit] Testcase: testPutOverwrite_StringArray took 0,004 sec
    [junit] Testcase: testKeyIterator_String took 0,002 sec
    [junit] Testcase: testPut_StringSimpleFieldSet took 0,003 sec
    [junit] Testcase: testEmptyValue took 0,023 sec
    [junit] Testcase: testPut_StringBoolean took 0,089 sec
    [junit] Testcase: testPutAllOverwrite took 0,004 sec
    [junit] Testcase: testSplit took 0,002 sec
    [junit] Testcase: testSimpleFieldSet_StringBooleanBoolean took 0,002 sec
    [junit] Testcase: testToplevelKeyIterator took 0,002 sec
    [junit] Testcase: testPutOverwrite_String took 0,001 sec
    [junit] Testcase: testRemoveValue took 0,002 sec
    [junit] Testcase: testTPut_StringSimpleFieldSet took 0,002 sec
    [junit] Testcase: testKeyIterator took 0,002 sec
    [junit] Testcase: testPut_StringInt took 0,003 sec
    [junit] Testcase: testPutAppend took 0,004 sec
    [junit] Testcase: testSimpleFieldSetSubset_String took 0,003 sec
    [junit] Testcase: testRemoveSubset took 0,005 sec
    [junit] Testcase: testSimpleFieldSetPutSingle_StringString_WithTwoPairedMultiLevelChars took 0,001 sec
    [junit] Testcase: testSimpleFieldSetPutAppend_StringString_WithTwoPairedMultiLevelChars took 0,001 sec
    [junit] Testcase: testSimpleFieldSetPutAndGet_MultiLevel took 0,004 sec
    [junit] Testcase: testGetDoubleArray took 0,004 sec
    [junit] Testcase: testSimpleFieldSet_BufferedReaderBooleanBoolean took 0,001 sec
    [junit] Testcase: testNamesOfDirectSubsets took 0,002 sec
    [junit] Testcase: testBase64 took 0,033 sec
    [junit] Testcase: testKeyIterationPastEnd took 0,002 sec
    [junit] Testcase: testGetAll took 0,001 sec
    [junit] Testcase: testPut_StringDouble took 0,002 sec
    [junit] Testcase: testPut_StringChar took 0,001 sec
    [junit] Testcase: testPut_StringLong took 0,003 sec
    [junit] Testcase: testIsEmpty took 0,001 sec
    [junit] Testcase: testSimpleFieldSet_SimpleFieldSet took 0,002 sec
    [junit] Testcase: testGetIntArray took 0,009 sec
    [junit] Testcase: testPut_StringShort took 0,001 sec
    [junit] Testcase: testSimpleFieldSetPutAndGet_NoMultiLevel took 0,001 sec
    [junit] Testcase: testEndMarker took 0,002 sec
    [junit] Running freenet.support.SizeUtilTest
    [junit] Testsuite: freenet.support.SizeUtilTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,558 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,558 sec
    [junit] 
    [junit] Testcase: testFormatSizeLong_WithIntermediateValues took 0,033 sec
    [junit] Testcase: testFormatSizeLong took 0,004 sec
    [junit] Running freenet.support.SparseBitmapTest
    [junit] Testsuite: freenet.support.SparseBitmapTest
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,537 sec
    [junit] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,537 sec
    [junit] 
    [junit] Testcase: testContainsThrowsOnBadRange took 0,022 sec
    [junit] Testcase: testAdd took 0,007 sec
    [junit] Testcase: testClear took 0,001 sec
    [junit] Testcase: testCombineBackwards took 0,005 sec
    [junit] Testcase: testCombineMiddle took 0 sec
    [junit] Testcase: testIteratorDoubleRemove took 0,001 sec
    [junit] Testcase: testRemove took 0,001 sec
    [junit] Testcase: testCombineAdjacent took 0,001 sec
    [junit] Running freenet.support.TimeSortedHashtableTest
    [junit] Testsuite: freenet.support.TimeSortedHashtableTest
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,528 sec
    [junit] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,528 sec
    [junit] 
    [junit] Testcase: testAddRemoveTS took 0,059 sec
    [junit] Testcase: testBeforeInclusive took 0,001 sec
    [junit] Testcase: testPairs took 0,005 sec
    [junit] Testcase: testAddRemove took 0,002 sec
    [junit] Running freenet.support.TimeUtilTest
    [junit] Testsuite: freenet.support.TimeUtilTest
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] 
    [junit] Testcase: testFormatTime_LongIntBoolean_milliseconds took 0,108 sec
    [junit] Testcase: testFormatTime_Long took 0,001 sec
    [junit] Testcase: testFormatTime_LongIntBoolean_tooManyTerms took 0,001 sec
    [junit] Testcase: testFormatTime_LongIntBoolean_maxTerms took 0,001 sec
    [junit] Testcase: testFormatTime_KnownValues took 0,001 sec
    [junit] Testcase: testFormatTime_LongIntBoolean_MaxValue took 0,001 sec
    [junit] Testcase: testFormatTime_LongInt took 0,001 sec
    [junit] Running freenet.support.URIPreEncoderTest
    [junit] Testsuite: freenet.support.URIPreEncoderTest
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,076 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3,076 sec
    [junit] 
    [junit] Testcase: testEncodeURI took 0,011 sec
    [junit] Testcase: testEncode took 2,128 sec
    [junit] Running freenet.support.URLEncoderDecoderTest
    [junit] Testsuite: freenet.support.URLEncoderDecoderTest
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,964 sec
    [junit] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4,964 sec
    [junit] 
    [junit] Testcase: testEncodeDecodeString_allChars took 3,832 sec
    [junit] Testcase: testEncodeForced took 0,055 sec
    [junit] Testcase: testDecodeWrongString took 0,001 sec
    [junit] Testcase: testDecodeWrongHex took 0,012 sec
    [junit] Testcase: testEncodeDecodeString_notSafeBaseChars took 0,003 sec
    [junit] Testcase: testTolerantDecoding took 0,001 sec
    [junit] Testcase: testEncodeDecodeString_notSafeAdvChars took 0,015 sec
    [junit] Running freenet.support.compress.Bzip2CompressorTest
    [junit] Testsuite: freenet.support.compress.Bzip2CompressorTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,657 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,657 sec
    [junit] 
    [junit] Testcase: testBzip2Compressor took 0,104 sec
    [junit] Testcase: testByteArrayDecompress took 0,569 sec
    [junit] Testcase: testBucketDecompress took 0,008 sec
    [junit] Testcase: testCompress took 0,227 sec
    [junit] Testcase: testCompressException took 0,098 sec
    [junit] Testcase: testDecompressException took 0,147 sec
    [junit] Running freenet.support.compress.GzipCompressorTest
    [junit] Testsuite: freenet.support.compress.GzipCompressorTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,709 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,709 sec
    [junit] 
    [junit] Testcase: testGzipCompressor took 0,108 sec
    [junit] Testcase: testByteArrayDecompress took 0,108 sec
    [junit] Testcase: testBucketDecompress took 0,002 sec
    [junit] Testcase: testCompress took 0,002 sec
    [junit] Testcase: testCompressException took 0,001 sec
    [junit] Testcase: testDecompressException took 0,014 sec
    [junit] Running freenet.support.compress.NewLzmaCompressorTest
    [junit] Testsuite: freenet.support.compress.NewLzmaCompressorTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15,674 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 15,674 sec
    [junit] 
    [junit] Testcase: testNewLzmaCompressor took 0,105 sec
    [junit] Testcase: testByteArrayDecompress took 0,469 sec
    [junit] Testcase: testCompressException took 0,07 sec
    [junit] Testcase: testDecompressException took 0,089 sec
    [junit] Testcase: testRandomByteArrayDecompress took 14,453 sec
    [junit] Running freenet.support.io.ArrayBucketTest
    [junit] Testsuite: freenet.support.io.ArrayBucketTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,713 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,713 sec
    [junit] 
    [junit] Testcase: testReadExcess took 0,036 sec
    [junit] Testcase: testReuse took 0,05 sec
    [junit] Testcase: testReadEmpty took 0,001 sec
    [junit] Testcase: testReadWrite took 0,001 sec
    [junit] Testcase: testLargeData took 0,134 sec
    [junit] Testcase: testNegative took 0 sec
    [junit] Running freenet.support.io.ByteArrayRandomAccessBufferTest
    [junit] Testsuite: freenet.support.io.ByteArrayRandomAccessBufferTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,936 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 8,936 sec
    [junit] 
    [junit] Testcase: testArray took 7,385 sec
    [junit] Testcase: testClose took 0,003 sec
    [junit] Testcase: testSize took 0,003 sec
    [junit] Testcase: testFormula took 0,949 sec
    [junit] Testcase: testWriteOverLimit took 0,061 sec
    [junit] Running freenet.support.io.HeaderStreamsTest
    [junit] Testsuite: freenet.support.io.HeaderStreamsTest
    [junit] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,613 sec
    [junit] Tests run: 19, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,613 sec
    [junit] 
    [junit] Testcase: testAugInputSkipAndRead0 took 0,031 sec
    [junit] Testcase: testAugInputSkipAndReadI took 0,001 sec
    [junit] Testcase: testAugInputSkipAndReadM took 0,001 sec
    [junit] Testcase: testAugInputSkipAndReadP took 0,001 sec
    [junit] Testcase: testAugInputSkipAndReadZ took 0,001 sec
    [junit] Testcase: testAugInputRead0 took 0,001 sec
    [junit] Testcase: testAugInputRead1 took 0,001 sec
    [junit] Testcase: testAugInputReadI took 0,001 sec
    [junit] Testcase: testAugInputReadM took 0,001 sec
    [junit] Testcase: testAugInputReadP took 0 sec
    [junit] Testcase: testAugInputReadZ took 0,001 sec
    [junit] Testcase: testDimOutputThrow0 took 0,01 sec
    [junit] Testcase: testDimOutputThrow1 took 0 sec
    [junit] Testcase: testDimOutputWrite0 took 0,001 sec
    [junit] Testcase: testDimOutputWrite1 took 0,001 sec
    [junit] Testcase: testDimOutputWriteI took 0 sec
    [junit] Testcase: testDimOutputWriteM took 0,001 sec
    [junit] Testcase: testDimOutputWriteP took 0,001 sec
    [junit] Testcase: testDimOutputWriteZ took 0 sec
    [junit] Running freenet.support.io.LineReadingInputStreamTest
    [junit] Testsuite: freenet.support.io.LineReadingInputStreamTest
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,595 sec
    [junit] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,595 sec
    [junit] 
    [junit] Testcase: testReadLineWithoutMarking took 0,107 sec
    [junit] Testcase: testBothImplementation took 0,001 sec
    [junit] Testcase: testReadLine took 0,002 sec
    [junit] Running freenet.support.io.PaddedEphemerallyEncryptedBucketTest
    [junit] Testsuite: freenet.support.io.PaddedEphemerallyEncryptedBucketTest
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12306789ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12366182ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,353 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,353 sec
    [junit] ------------- Standard Output ---------------
    [junit] AES/CTR/NOPADDING (SunJCE version 1.7): 12306789ns
    [junit] AES/CTR/NOPADDING (BC version 1.54): 12366182ns
    [junit] Using JCA cipher provider: SunJCE version 1.7
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testReadExcess took 8,164 sec
    [junit] Testcase: testReuse took 0,03 sec
    [junit] Testcase: testReadEmpty took 0,02 sec
    [junit] Testcase: testReadWrite took 0,008 sec
    [junit] Testcase: testLargeData took 1,625 sec
    [junit] Testcase: testNegative took 0,021 sec
    [junit] Running freenet.support.io.PooledFileRandomAccessBufferTest
    [junit] Testsuite: freenet.support.io.PooledFileRandomAccessBufferTest
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test6259209596810098373.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test33305219255342692.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test1003474985387376899.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test7751124920479986023.tmp
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,314 sec
    [junit] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10,314 sec
    [junit] ------------- Standard Error -----------------
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test6259209596810098373.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test33305219255342692.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test1003474985387376899.tmp
    [junit] DELETING FILE tmp.pooled-random-access-file-wrapper-test/test7751124920479986023.tmp
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testLock took 0,254 sec
    [junit] Testcase: testSimplePooling took 0,355 sec
    [junit] Testcase: testLockedNotClosableFromNotOpenFD took 0,006 sec
    [junit] Testcase: testLockedNotClosable took 0,004 sec
    [junit] Testcase: testLockBlocking took 0,12 sec
    [junit] Testcase: testLocksB took 0,005 sec
    [junit] Testcase: testArray took 7,335 sec
    [junit] Testcase: testClose took 0,076 sec
    [junit] Testcase: testSize took 0,098 sec
    [junit] Testcase: testFormula took 0,927 sec
    [junit] Testcase: testWriteOverLimit took 0,642 sec
    [junit] Running freenet.support.io.RandomAccessFileWrapperTest
    [junit] Testsuite: freenet.support.io.RandomAccessFileWrapperTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,092 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,092 sec
    [junit] 
    [junit] Testcase: testStoreTo took 0,387 sec
    [junit] Testcase: testArray took 7,213 sec
    [junit] Testcase: testClose took 0,008 sec
    [junit] Testcase: testSize took 0,009 sec
    [junit] Testcase: testFormula took 0,841 sec
    [junit] Testcase: testWriteOverLimit took 0,142 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.support.io.TempBucketFactoryRAFEncryptedTest
    [junit] Testsuite: freenet.support.io.TempBucketFactoryRAFEncryptedTest
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 23,547 sec
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 23,547 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testBucketToRAFFreeBucketWhileArray took 0,275 sec
    [junit] Testcase: testBucketToRAFWhileArray took 0,542 sec
    [junit] Testcase: testBucketToRAFFreeWhileFileMigrateFirst took 1,146 sec
    [junit] Testcase: testBucketToRAFCallTwiceFile took 0,134 sec
    [junit] Testcase: testArrayMigration took 0,414 sec
    [junit] Testcase: testBucketToRAFCallTwiceArray took 0,008 sec
    [junit] Testcase: testBucketToRAFFreeWhileFileFreeRAF took 0,017 sec
    [junit] Testcase: testBucketToRAFFailure took 0,035 sec
    [junit] Testcase: testBucketToRAFFreeWhileFile took 0,008 sec
    [junit] Testcase: testBucketToRAFWhileFile took 1,017 sec
    [junit] Testcase: testBucketToRAFFreeWhileArray took 0,014 sec
    [junit] Testcase: testArray took 15,439 sec
    [junit] Testcase: testClose took 0,188 sec
    [junit] Testcase: testSize took 0,233 sec
    [junit] Testcase: testFormula took 1,887 sec
    [junit] Testcase: testWriteOverLimit took 1,668 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.support.io.TempBucketFactoryRAFPlaintextTest
    [junit] Testsuite: freenet.support.io.TempBucketFactoryRAFPlaintextTest
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,158 sec
    [junit] Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 9,158 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] ------------- Standard Error -----------------
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] Deleted 0 of 0 temporary files (0 non-temp files in temp directory) in 0s
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testBucketToRAFFreeBucketWhileArray took 0,232 sec
    [junit] Testcase: testBucketToRAFWhileArray took 0,355 sec
    [junit] Testcase: testBucketToRAFFreeWhileFileMigrateFirst took 0,066 sec
    [junit] Testcase: testBucketToRAFCallTwiceFile took 0,008 sec
    [junit] Testcase: testArrayMigration took 0,231 sec
    [junit] Testcase: testBucketToRAFCallTwiceArray took 0,009 sec
    [junit] Testcase: testBucketToRAFFreeWhileFileFreeRAF took 0,008 sec
    [junit] Testcase: testBucketToRAFFailure took 0,017 sec
    [junit] Testcase: testBucketToRAFFreeWhileFile took 0,005 sec
    [junit] Testcase: testBucketToRAFWhileFile took 0,07 sec
    [junit] Testcase: testBucketToRAFFreeWhileArray took 0,004 sec
    [junit] Testcase: testArray took 6,389 sec
    [junit] Testcase: testClose took 0,028 sec
    [junit] Testcase: testSize took 0,028 sec
    [junit] Testcase: testFormula took 0,953 sec
    [junit] Testcase: testWriteOverLimit took 0,297 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.support.io.TempBucketTest$TempBucketMigrationTest
    [junit] Testsuite: freenet.support.io.TempBucketTest$TempBucketMigrationTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,863 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1,863 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testRamLimitCreate took 1,367 sec
    [junit] Testcase: testWriteExcessLimit took 0,016 sec
    [junit] Testcase: testWriteExcessConversionFactor took 0,005 sec
    [junit] Testcase: testBigConversionWhileReading took 0,022 sec
    [junit] Testcase: testConversionWhileReading took 0,002 sec
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] Running freenet.support.io.TempBucketTest
    [junit] Testsuite: freenet.support.io.TempBucketTest
    [junit] Tests run: 35, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,656 sec
    [junit] Tests run: 35, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2,656 sec
    [junit] ------------- Standard Output ---------------
    [junit] Attempting to load the NativeThread library [jar:file:/home/arne/fred-work/lib/freenet/freenet-ext.jar!/freenet/support/io/libNativeThread-amd64.so]
    [junit] Using the NativeThread implementation (base nice level is 0)
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testReadExcess took 0,036 sec
    [junit] Testcase: testReuse took 0 sec
    [junit] Testcase: testReadEmpty took 0,001 sec
    [junit] Testcase: testReadWrite took 0,019 sec
    [junit] Testcase: testLargeData took 0,188 sec
    [junit] Testcase: testNegative took 0,001 sec
    [junit] Testcase: testReadExcess took 0 sec
    [junit] Testcase: testReuse took 0,001 sec
    [junit] Testcase: testReadEmpty took 0 sec
    [junit] Testcase: testReadWrite took 0,001 sec
    [junit] Testcase: testLargeData took 0,018 sec
    [junit] Testcase: testNegative took 0 sec
    [junit] Testcase: testReadExcess took 0,001 sec
    [junit] Testcase: testReuse took 0 sec
    [junit] Testcase: testReadEmpty took 0 sec
    [junit] Testcase: testReadWrite took 0,001 sec
    [junit] Testcase: testLargeData took 0,035 sec
    [junit] Testcase: testNegative took 0,001 sec
    [junit] Testcase: testReadExcess took 0,001 sec
    [junit] Testcase: testReuse took 0 sec
    [junit] Testcase: testReadEmpty took 0,001 sec
    [junit] Testcase: testReadWrite took 0,001 sec
    [junit] Testcase: testLargeData took 1,652 sec
    [junit] Testcase: testNegative took 0,001 sec
    [junit] Testcase: testReadExcess took 0,001 sec
    [junit] Testcase: testReuse took 0,001 sec
    [junit] Testcase: testReadEmpty took 0,001 sec
    [junit] Testcase: testReadWrite took 0,001 sec
    [junit] Testcase: testLargeData took 0,155 sec
    [junit] Testcase: testNegative took 0 sec
    [junit] Testcase: testRamLimitCreate took 0,006 sec
    [junit] Testcase: testWriteExcessLimit took 0,002 sec
    [junit] Testcase: testWriteExcessConversionFactor took 0,003 sec
    [junit] Testcase: testBigConversionWhileReading took 0,01 sec
    [junit] Testcase: testConversionWhileReading took 0,002 sec
    [junit] Running freenet.support.io.TempFileBucketTest
    [junit] Testsuite: freenet.support.io.TempFileBucketTest
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,812 sec
    [junit] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,812 sec
    [junit] 
    [junit] Testcase: testReadExcess took 0,164 sec
    [junit] Testcase: testReuse took 0,022 sec
    [junit] Testcase: testReadEmpty took 0,003 sec
    [junit] Testcase: testReadWrite took 0,004 sec
    [junit] Testcase: testLargeData took 0,132 sec
    [junit] Testcase: testNegative took 0,003 sec
    [junit] Running freenet.support.math.MersenneTwisterTest
    [junit] Testsuite: freenet.support.math.MersenneTwisterTest
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0,628 sec
    [junit] 
    [junit] Testcase: testConsistencySeedFromInteger took 0,094 sec
    [junit] Testcase: testConsistencySeedFromInts took 0,006 sec
    [junit] Testcase: testConsistencySeedFromLong took 0,005 sec
    [junit] Testcase: testConsistencySeedFromBytes took 0,07 sec
    [junit] Testcase: testBytesToInts took 0,001 sec
    [junit] Running net.i2p.util.NativeBigIntegerTest
    [junit] Testsuite: net.i2p.util.NativeBigIntegerTest
    [junit] OpenJDK 64-Bit Server VM warning: You have loaded library /tmp/jbigi2156358229084298660lib.tmp which might have disabled stack guard. The VM will try to fix the stack guard now.
    [junit] It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6,367 sec
    [junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 6,367 sec
    [junit] ------------- Standard Error -----------------
    [junit] INFO: Optimized native BigInteger library 'net/i2p/util/libjbigi-linux-x86_64.so' loaded from resource
    [junit] ------------- ---------------- ---------------
    [junit] 
    [junit] Testcase: testModPow took 2,344 sec
    [junit] Testcase: testDoubleValue took 3,541 sec

package-only:
      [jar] Building jar: /home/arne/fred-work/dist/freenet.jar

package:

BUILD SUCCESSFUL
Total time: 27 minutes 19 seconds

(colorized with antlog-mode, a quickly whipped up emacs mode for highlighting and navigating the output from ant)

I now have a spam-resistant, decentralized comment system via Freenet

Note (2017): Due to changes in cross-origin requests, babcom is currently broken. I want to fix it, but can’t do it right now. Sorry for that.

In the last years, spam became worse and worse. The more my site grew, the more time I had to spend deleting blatant advertisements. Even captchas did not help anymore: Either they were so hard that I myself needed 3 tries on average to get through, or I got hundreds of spam messages per day. A few years ago, I caved in and disabled comments. The alternative would have been to turn my Website into a mere PR-outlet of Facebook, twitter or one of the commenting platforms out there.

But this all changed now. I finally have decentralized, spam-resistant comments using babcom with Freenet as backend!

» babcom: decentralized, spam-resistant comments! «

The comment-system builds on the decentral, spam-resistant social features of the Freenet Project, one of the old cypherpunk creations which started in 2000 with the goal to provide true Freedom of the Press in the Internet and has been evolving ever since. It’s an irony that nowadays spam became a vehicle to push people into censorship-enabling platforms, to use up their limited free time or to drown their words in a pile of dung, so other people cannot find them.

If you do not run Freenet now, this screenshot shows how the comment-system looks for me:

Babcom Screenshot

And for me this is a huge relief: I can finally get comments to my articles again without having to sell my conscience or waste most of my time deleting advertisements.

If that sounds interesting, head over to babcom and check if it suits you!

And if you like it, please Flattr babcom and Flattr Sone!

Infocalypse - Make your code survive the information apocalypse

Anonymous DVCS in the Darknet.

Real Life Infocalypse
easy setup of infocalypse (script)
Freenet Development over Freenet

This is a mirror of the documentation of the infocalypse extension for Mercurial written by djk - published here with his permission. It is licensed solely under the GPLv2 or later. The text is long. For concise information, use the second Link above (Freenet Development over Freenet).

Introduction

The Infocalypse 2.0 hg extension is an extension for Mercurial that allows you to create, publish and maintain incrementally updateable repositories in Freenet.

Your code is then hosted decentrally and anonymously, making it just as censorship-resistant as all other content in Freenet.

It works better than the other DVCS currently available for Freenet.

Most of the information you will find in this document can also be found in the extension's online help. i.e.:

hg help infocalypse

HOWTO: Infocalypse 2.0 hg extension


updated: 20090927

Note: Contains Freenet only links

Table of Contents


Requirements

The extension has the following dependencies:

  • Freenet
    You can more information on Freenet here:

    http://freenetproject.org/ [HTTP Link!]

  • Python
    I test on Python 2.5.4 and 2.6.1. Any 2.5.x or later version should work. Earlier versions may work.

    You probably won't have to worry about installing Python. It's included in the Windows binary Mercurial distributions and most *nix flavor OS's should have a reasonably up to date version of Python installed.

  • Mercurial
    You can find more information on Mercurial here:

    http://mercurial-scm.org/ [HTTP Link!]

    Version 1.0.2 won't work.

    I use version 1.2.1 (x86 Gentoo) on a daily basis. Later versions should work.

    I've smoke tested 1.1.2 (on Ubuntu Jaunty Jackalope) and 1.3 (on Widows XP) without finding any problems.

  • FMS
    Installation of the Freenet Messaging System (FMS) is optional but
    highly recommended. The hg fn-fmsread and hg fn-fmsnotify commands won't work without FMS. Without fn-fmsread it is extremely difficult to reliably detect repository updates.

    The official FMS freesite is here:

    USK@0npnMrqZNKRCRoGojZV93UNHCMN-6UU3rRSAmP6jNLE,~BG-edFtdCC1cSH4O3BWdeIYa8Sw5DfyrSV-TKdO5ec,AQACAAE/fms/106/
    
    

[TOC]


Installation

You checked the requirements and understandthe risks right?

Here are step-by-step instructions on how to install the extension.

  • Download the bootstrap hg bundle:
    CHK@S~kAIr~UlpPu7mHNTQV0VlpZk-f~z0a71f7DlyPS0Do,IB-B5Hd7WePtvQuzaUGrVrozN8ibCaZBw3bQr2FvP5Y,AAIC--8/infocalypse2_1723a8de6e7c.hg
        

    You'll get a Potentially Dangerous Content warning from fproxy because the mime type isn't set. Choose 'Click here to force your browser to download the file to disk.'.

    I'll refer to the directory that you saved the bundle file to as DOWNLOAD_DIR.

  • Create an empty directory where you want to install the extension.
    I'll refer to that directory as INSTALL_DIR in the
    rest of these instructions.

  • Create an empty hg repository there. i.e.:
    cd INSTALL_DIR
    hg init
    
  • Unbundle the bootstrap bundle into the new repository. i.e:
    hg pull DOWNLOAD_DIR/infocalypse2_1723a8de6e7c.hg
    hg update
    
  • Edit the '[extensions]' section of your .hgrc/mercurial.ini
    file to point to the infocalypse directory in the unbundled source.

    # .hgrc/mercurial.ini snippet
    [extensions]
    infocalypse = INSTALL_DIR/infocalypse
    

    where INSTALL_DIR is the directory you unbundled into.

    If you don't known where to find/create your .hgrc/mercurial.ini file this link may be useful:

    http://www.selenic.com/mercurial/hgrc.5.html [HTTP Link!]

  • Run fn-setup to create the config file and temp dir. i.e.
    hg fn-setup
       

    If you run your Freenet node on another machine or on a non-standard port you'll need to use the --fcphost and/or --fcpport parameters to set the FCP host and port respectively.

    By default fn-setup will write the configuration file for the extension (.infocalype on *nix, infocalypse.ini on Windows) into your home directory and also create a temp directory called infocalypse_tmp there.

    You can change the location of the temp directory by using the --tmpdir argument.

    If you want to put the config file in a different location set the cfg_file option in the [infocalypse] section of your .hgrc/mercurial.ini file before running fn-setup.

    Example .hgrc entry:
    # Snip, from .hgrc
    [infocalypse]
    cfg_file = /mnt/usbkey/s3kr1t/infocalypse.cfg
  • Edit the fms_id and possibly fms_host/fms_port information in the.infocalyse/infocalypse.ini file. i.e.:

    # Example .infocalypse snippet
    fms_id = YOUR_FMS_ID
    
    fms_host = 127.0.0.1
    fms_port = 1119
    

    where YOUR_FMS_ID is the part of your fms id before the '@' sign.

    If you run FMS with the default settings on the same machine you are running
    Mercurial on you probably won't need to adjust the fcp_host or fcp_port.

    You can skip this step if you're not running fms.

  • Read the latest know version of the extension's repository USK index from FMS.
    hg fn-fmsread -v
    

    You can skip this step if you're not running fms.

  • Pull the latest changes to the extension from Freenet for the first time. Don't skip this step! i.e.:
    hg fn-pull --aggressive --debug --uri USK@kRM~jJVREwnN2qnA8R0Vt8HmpfRzBZ0j4rHC2cQ-0hw,2xcoQVdQLyqfTpF2DpkdUIbHFCeL4W~2X1phUYymnhM,AQACAAE/infocalypse.hgext.R1/41
    hg update
    

    You may have trouble finding the top key if you're not using fn-fmsread. Just keep retrying. If you know the index has increased, use the new index in the URI.

    After the first pull, you can update without the URI.

[TOC]


Updating

This extension is under active development. You should periodically update to get the latest bug fixes and new features.

Once you've installed the extension and pulled it for the first time, you can get updates by cd'ing into the initial INSTALL_DIRand typing:

hg fn-fmsread -vhg fn-pull --aggressive hg update

If you're not running FMS you can skip the fn-fmsread step. You may have trouble getting the top key. Just keep retrying.

If you're having trouble updating and you know the index has increased, use the full URI with the new index as above.

[TOC]


Background

Here's background information that's useful when using the extension.See the
Infocalypse 2.0 hg extension page on my freesite for a more detailed description of how the extension works.

Repositories are collections of hg bundle files

An Infocalypse repository is just a collection of hg bundle files which have been inserted into Freenet as CHKs and some metadata describing how to pull the bundles to reconstruct the repository that they represent. When you 'push' to an infocalypse repository a new bundleCHK is inserted with the changes since the last update. When you 'pull', only the CHKs for bundles for changesets not already in the local repository need to be fetched.

Repository USKs

The latest version of the repository's metadata is stored on a Freenet Updateable Subspace Key (USK) as a small binary file.

You'll notice that repository USKs end with a number without a trailing '/'. This is an important distinction. A repository USK is not a freesite. If you try to view one with fproxy you'll just get a 'Potentially Dangerous Content' warning. This is harmless, and ugly but unavoidable at the current time because of limitation in fproxy/FCP.

Repository top key redundancy

Repository USKs that end in *.R1/<number> are inserted redundantly, with a second USK insert done on *.R0/<number>. Top key redundancy makes it easier for other people to fetch your repository.

Inserting to a redundant repository USK makes the inserter more vulnerable to
correlation attacks. Don't use '.R1' USKs if you're worried about this.

Repository Hashes

Repository USKs can be long and cumbersome. A repository hash is the first 12 bytes of the Sha1 hash of the zero index version of a repository USK. e.g.:

SHA1( USK@kRM~jJVREwnN2qnA8R0Vt8HmpfRzBZ0j4rHC2cQ-0hw,2xcoQVdQLyqfTpF2DpkdUIbHFCeL4W~2X1phUYymnhM,AQACAAE/infocalypse.hgext.R1/0 )
  == 'be68e8feccdd'

You can get the repository hash for a repository USK using:

hg fn-info

from a directory the repository USK has been fn-pull'd into.

You can get the hashes of repositories that other people have announced via fms with:

hg fn-fmsread --listall

Repository hashes are used in the fms update trust map.

The default private key

When you run fn-setup, it creates a default SSK private key, which it stores inthe default_private_key parameter in your .infocalypse/infocalypse.ini file.

You can edit the config file to substitute any valid SSK private key you want.

If you specify an Insert URI without the key part for an infocalypse command the default private key is filled in for you. i.e

hg fn-create --uri USK@/test.R1/0

Inserts the local hg repository into a new USK in Freenet, using the private key in your config file.

USK <--> Directory mappings

The extension's commands 'remember' the insert and request repository USKs they were last run with when run again from the same directory.

This makes it unnecessary to retype cumbersome repository USK values once a repository has been successfully pulled or pushed from a directory.

Aggressive top key searching

fn-pull and fn-push have an --aggressive command line argument which causes them to search harder for the latest request URI.

This can be slow, especially if the USK index is much lower than the latest index in Freenet.

You will need to use it if you're not using FMS update notifications.

[TOC]


Basic Usage

Here are examples of basic commands.

Generating a new private key

You can generate an new private key with:

hg fn-genkey

This has no effect on the stored default private key.

Make sure to change the 'SSK' in the InsertURI to 'USK' when supplying the insert URI on the command line.

Creating a new repository

hg fn-create --uri USK@/test.R1/0

Inserts the local hg repository into a new USK in Freenet, using the privatekey in your config file. You can use a full insert URI value if you want.

If you see an "update -- Bundle too big to salt!" warning message when you run this command you should consider running
fn-reinsert --level 4.

Pushing to a repository

hg fn-push --uri USK@/test.R1/0

Pushes incremental changes from the local directory into an existing Infocalypse repository.

The <keypart>/test.R1/0 repository must already exist in Freenet.In the example above the default private key is used. You could have specified a full Insert URI. The URI must end in a number but the value doesn't matter because fn-push searches for the latest unused index.

You can ommit the --uri argument whenyou run from the same directory the fn-create (or a previous fn-push)was run from.

Pulling from a repository

hg fn-pull --uri <request uri>

pulls from an Infocalypse repository in Freenet intothe local repository.
Here's an example with a fully specified uri.

You can ommit the --uri argument whenyou run from the same directory a previous fn-pull was successfully run from.

For maximum reliability use the --aggressive argument.

[TOC]


Using FMS to send and receive update notifications

The extension can send and receive repository update notifications via FMS. It is highly recommended that you
setup this feature.

The update trust map

There's a trust map in the .infocalypse/infocalypse.ini config file which determines which fms ids can update the index values for which repositories. It is purely local and completely separate from the trust values which appear in the FMS web of trust.

The format is:
<number> = <fms_id>|<usk_hash0>|<usk_hash1>| ... |<usk_hashn>

The number value must be unique, but is ignored.

The fms_id values are the full FMS ids that you are trusting to update the repositories with the listed hashes.

The usk_hash* values are repository hashes.

Here's an example trust map config entry:

# Example .infocalypse snippet
[fmsread_trust_map]
1 = test0@adnT6a9yUSEWe5p8J-O1i8rJCDPqccY~dVvAmtMuC9Q|55833b3e6419
0 = djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks|be68e8feccdd|5582404a9124
2 = test1@SH1BCHw-47oD9~B56SkijxfE35M9XUvqXLX1aYyZNyA|fab7c8bd2fc3

You must update the trust map to enable index updating for repos other than the one this code lives in (be68e8feccdd). You can edit the config file directly if you want.

However, the easiest way to update the trust map is by using the--trust and --untrust options on fn-fmsread.

For example to trust falafel@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITwto notify you about changes to the repository with repo hash 2220b02cf7ee,type:

hg fn-fmsread --trust --hash 2220b02cf7ee --fmsid falafel@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITw

And to stop trusting that FMS id for updates to 2220b02cf7ee, you would type:

hg fn-fmsread --untrust --hash 2220b02cf7ee --fmsid falafel@IxVqeqM0LyYdTmYAf5z49SJZUxr7NtQkOqVYG0hvITw

To show the trust map type:

hg fn-fmsread --showtrust

Reading other people's notifications

hg fn-fmsread -v

Will read update notifications for all the repos in the trust map and locally cache the new latest index values. If you run with -vit prints a message when updates are available which weren't used because the sender(s) weren't in the trust map.

hg fn-fmsread --list

Displays announced repositories from fms ids that appear inthe trust map.

hg fn-fmsread --listall

Displays all announced repositories including ones from unknown fms ids.

Pulling an announced repository

You can use the --hash option with fn-pull to pull any repository you see in the fn-read --list or fn-read --listall lists.

For example to pull the latest version of the infocalypse extension code, cd to an empty directory and type:

hg inithg fn-pull --hash be68e8feccdd --aggressive

Posting your own notifications

hg fn-fmsnotify -v

Posts an update notification for the current repository to fms.

You MUST set the fms_id value in the config fileto your fms id for this to work.

Use --dryrun to double check before sending the actual fms message.

Use --announce at least once if you want your USK to show up in the fmsread --listall list.

By default notifications are written to and read from the infocalypse.notify fms group.

The read and write groups can be changed by editing the following variables in the config file:

fmsnotify_group = <group>
fmsread_groups = <group0>[|<group1>|...]

fms can have pretty high latency. Be patient. It may take hours (sometimes a day!) for your notification to appear. Don't send lots of redundant notifications.

[TOC]


Reinserting and 'sponsoring' repositories

hg fn-reinsert

will re-insert the bundles for the repository that was last pulled into the directory.

The exact behavior is determined by the level argument.

level:

  • 1 - re-inserts the top key(s)
  • 2 - re-inserts the top keys(s), graphs(s) and the most recent update.
  • 3 - re-inserts the top keys(s), graphs(s) and all keys required to bootstrap the repo.

    This is the default level.

  • 4 - adds redundancy for big (>7Mb) updates.
  • 5 - re-inserts existing redundant big updates.

Levels 1 and 4 require that you have the privatekey for the repository. For other levels, the top key insert is skipped if you don't have the private key.

DO NOT use fn-reinsert if you're concerned about
correlation attacks. The risk is on the order of re-inserting a freesite, but may be worse if you use redundant(i.e. USK@<line noise>/name.R1/0) top keys.

[TOC]


Forking a repository onto a new USK

hg fn-copy --inserturi USK@/name_for_my_copy.R1/0

copies the Infocalypse repository which was fn-pull'd intothe local directory onto a new repository USK under your default private key. You can use a full insert URI if you want.

This only requires copying the top key data (a maximum of 2 SSK inserts).

[TOC]


Sharing private keys

It is possible for multiple people to collaborate anonymously over Freenet by sharing the private key to a single Infocalypse repository.

The FreeFAQ is an example of this technique.

Here are some things to keep in mind when sharing private keys.

  • There is no (explict) key revocation in Freenet

    If you decide to share keys, you should generate a special key on a per repo basis with fn-genkey. There is no way to revoke a private key once it has been shared. This could be mitigated with an ad-hoc convention. e.g. if I find any file named USK@<public_key>/revoked.txt, I stop using the key.
  • Non-atomic top key inserts

    Occasionally, you might end up overwriting someone elses commits because the FCP insert of the repo top key isn't atomic. I think you should be able to merge and re fn-push to resolve this. You can fn-pull a specific version of the repo by specify the full URI including the version number with --uri and including the --nosearch option.
  • All contributors should be in the fn-fmsread trust map

[TOC]


Inserting a freesite

hg fn-putsite --index <n>

inserts a freesite based on the configuration inthe freesite.cfg file in the root of the repository.

Use:

hg fn-putsite --createconfig

to create a basic freesite.cfg file that you can modify. Look at the comments in it for an explanation of the supported parameters.

The default freesite.cfg file inserts using the same private key as the repo and a site name of 'default'. Editing the name is highly recommended.

You can use --key CHK@ to insert a test version of the site to a CHK key before writing to the USK.

Limitations:

  • You MUST have fn-pushed the repo at least once in order to insert using the repo's private key. If you haven't fn-push'd you'll see this error: "You don't have the insert URI for this repo. Supply a private key with --key or fn-push the repo."
  • Inserts all files in the site_dir directory in the freesite.cfg file. Run with --dryrun to make
    sure that you aren't going to insert stuff you don't want too.
  • You must manually specify the USK edition you want to insert on. You will get a collision error
    if you specify an index that was already inserted.
  • Don't use this for big sites. It should be fine for notes on your project. If you have lots of images
    or big binary files use a tool like jSite instead.
  • Don't modify site files while the fn-putsite is running.

[TOC]


Risks

I don't believe that using this extension is significantly more dangerous that using any other piece of Freenet client code, but here is a list of the risks which come to mind:

  • Freenet is beta software
    The authors of Freenet don't pretend to guarantee that it is free of bugs that could that could compromise your anonymity or worse.

    While written in Java, Freenet loads native code via JNI (FEC codecs, bigint stuff, wrapper, etc.) that makes it vulnerable to the same kinds of attacks as any other C/C++ code.

  • FMS == anonymous software
    FMS is published anonymously on Freenet and it is written in C++ with dependencies on large libraries which could contain security defects.

    I personally build FMS from source and run it in a chroot jail.

    Somedude, the author of FMS, seems like a reputable guy and has conducted himself as such for more than a year.

  • correlation attacks
    There is a concern that any system which inserts keys that can be predicted ahead of time could allow an attacker with control over many nodes in the network to eventually find the IP of your node.

    Any system which has this property is vulnerable. e.g. fproxy Freesite insertion,Freetalk, FMS, FLIP. This extension's optional use of
    redundant top keys may make it particularly vulnerable. If you are concerned don't use '.R1' keys.

    Running your node in pure darknet mode with trusted peers may somewhat reduce the risk of correlation attacks.

  • Bugs in my code, Mercurial or Python
    I do my best but no one's perfect.

    There are lots of eyes over the Mercurial and Python source.

[TOC]


Advocacy

Here are some reasons why I think the Infocalypse 2.0 hg extension is better than
pyFreenetHg and
egit-freenet:

  • Incremental

    You only need to insert/retrieve what has actually changed. Changes of up to 32kof compressed deltas can be fetched in as little as one SSK fetch and one CHK fetch.

  • Redundant

    The top level SSK and the CHK with the representation of the repository state are inserted redundantly so there are no 'critical path' keys. Updates of up to ~= 7Mbare inserted redundantly by cloning the splitfile metadata at the cost of a single32k CHK insert.

  • Re-insertable

    Anyone can re-insert all repository data except for the top level SSKs with a simple command (hg fn-reinsert). The repository owner can re-insert the top levelSSKs as well.

  • Automatic rollups

    Older changes are automatically 'rolled up' into large splitfiles, such that the entire repository can almost always be fetched in 4 CHK fetches or less.

  • Fails explictly

    REDFLAG DCI

[TOC]


Source Code

The authoritative repository for the extension's code is hosted in Freenet:

hg inithg fn-fmsread -vhg fn-pull --aggressive --debug --uri USK@kRM~jJVREwnN2qnA8R0Vt8HmpfRzBZ0j4rHC2cQ-0hw,2xcoQVdQLyqfTpF2DpkdUIbHFCeL4W~2X1phUYymnhM,AQACAAE/infocalypse.hgext.R1/41hg update

It is also mirrored on bitbucket.org:

hg clone http://bitbucket.org/dkarbott/infocalypse_hgext/

[TOC]


Fixes and version information

  • hg version: c51dc4b0d282

    Fixed abort: <bundle_file> not found! problem on fn-pull when hg-git plugin was loaded.
  • hg version: 0c5ce9e6b3b4

    Fixed intermittent stall when bootstrapping from an empty repo.
  • hg version: 7f39b20500f0

    Fixed bug that kept fn-pull --hash from updating the initial USK index.
  • hg version: 7b10fa400be1

    Added fn-fmsread --trust and --untrust and fn-pull --hash support.


    fn-pull --hash isn't really usable until 7f39b20500f0
  • hg version: ea6efac8e3f6

    Fixed a bug that was causing the berkwood binary 1.3 Mercurial distribution
    (http://mercurial.berkwood.com/binaries/Mercurial-1.3.exe [HTTP Link!]) not to work.

[TOC]


Freenet-only links

This document is meant to inserted into Freenet.

It contains links (starting with 'CHK@' and 'USK@')to Freenet keys that will only work from within fproxy [HTTP link!].

You can find reasonably up to date version of this document on my freesite:

USK@-bk9znYylSCOEDuSWAvo5m72nUeMxKkDmH3nIqAeI-0,qfu5H3FZsZ-5rfNBY-jQHS5Ke7AT2PtJWd13IrPZjcg,AQACAAE/feral_codewright/15/infocalypse_howto.html

[TOC]


Contact

FMS:
djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks

I lurk on the freenet and fms boards.

If you really need to you can email me at d kar bott at com cast dot net but I prefer FMS.

freesite:
USK@-bk9znYylSCOEDuSWAvo5m72nUeMxKkDmH3nIqAeI-0,qfu5H3FZsZ-5rfNBY-jQHS5Ke7AT2PtJWd13IrPZjcg,AQACAAE/feral_codewright/15/

[TOC]


Install and setup infocalypse on GNU/Linux (script)

Update (2015-11-27): The script works again with newer Freenet versions.

Install and setup infocalypse on GNU/Linux:

setup_infocalypse_on_linux.sh

Just download and run1 it via

wget http://draketo.de/files/setup_infocalypse_on_linux.sh_.txt
bash setup_infocalypse*

This script needs a running freenet node to work! → Install Freenet

In-Freenet-link: CHK@rtJd8ThxJ~usEFOaWAvwXbHuPC6L1zOFWtKxlhUPfR8,21XedKU8YbKPGsYWu9szjY7hChX852zmFAYuvyihOd0,AAMC--8/setup_infocalypse_on_linux.sh

The script allows you to get and setup the infocalypse extension with a few keystrokes to be able to instantly use the Mercurial DVCS for decentral, anonymous code-sharing over freenet.

« Real Life Infocalypse »
DVCS in the Darknet. The decentralized p2p code repository (using Infocalypse)

This gives you code hosting like a minimal version of BitBucket, Gitorious or GitHub but without the central control. Additionally the Sone plugin for freenet supplies anonymous communication and the site extension allows creating static sites with information about the repo, recent commits and such without the need of a dedicated hoster.

Basic Usage

Clone a repo into freenet with a new key:

hg clone localrepo USK@/repo

(Write down the insert key and request key after the upload! Localrepo is an existing Mercurial repository)

Clone a repo into or from freenet (respective key known):

hg clone localrepo freenet://USK@<insert key>/repo.R1/0
hg clone freenet://USK@<request key>/repo.R1/0 [localpath]

Push or pull new changes:

hg push freenet://USK@<insert key>/repo.R1/0
hg pull freenet://USK@<request key>/repo.R1/0

For convenient copy-pasting of freenet keys, you can omit the “freenet://” here, or use freenet:USK@… instead.

Also, as shown in the first example, you can let infocalypse generate a new key for your repo:

hg clone localrepo USK@/repo

mind the “USK@/” (slash after @ == missing key). Also see the missing .R1/0 after the repo-name and the missing freenet://. Being able to omit those on repository creation is just a convenience feature - but one which helps me a lot.

You can also add the keys to the <repo>/.hg/hgrc:

[paths]
example = freenet://USK@<request key>/repo.R1/0
example-push = freenet://USK@<insert key>/repo.R1/0
# here you need the freenet:// !

then you can simply use

hg push example-push

and

hg pull example

Contribute

This script is just a quick sketch, feel free to improve it and upload improved versions (for example with support for more GNU/Linux distros). If you experience any problems, please contact me! (i.e. write a comment)

If you want to contribute more efficiently to this script, get the repo via

hg clone freenet://USK@73my4fc2CLU3cSfntCYDFYt65R4RDmow3IT5~gTAWFk,Fg9EAv-Hut~9NCJKtGaGAGpsn1PjA0oQWTpWf7b1ZK4,AQACAAE/setup_infocalypse/1 

Then hack on it, commit and upload it again via

hg clone setup_infocalypse freenet://USK@/setup_infocalypse

Finally share the request URI you got.

Alternate repo: http://draketo.de/proj/setup_infocalypse


  1. On systems based on Debian or Gentoo - including Ubuntu and many others - this script will install all needed software except for freenet itself. You will have to give your sudo password in the process. Since the script is just a text file with a set of commands, you can simply read it to make sure that it won’t do anything evil with those sudo rights

AnhangGröße
setup_infocalypse_on_linux.sh.txt2.39 KB
setup_infocalypse_on_linux.sh.txt2.39 KB
setup_infocalypse_on_linux.sh_1.txt2.49 KB
setup_infocalypse_on_linux.sh_.txt2.75 KB

Let us talk over Freenet, so I can speak freely again

I sent this email to many of my friends to regain confidential private communication. If you want to do the same, feel free to reuse the text-version (be sure to replace the noderef textblock with your own noderef from http://127.0.0.1:8888/friends/myref.txt). This text is also available in Freenet.

About 10% of my friends joined - which is enough to build the darknet and makes it possible for me to speak freely again.

First: The Essence of this text:

I’ve been censoring my emails for years. Not just what I write, but also whom and when.

Freenet allows me to write invisible messages to my friends. Those are messages I do not need to censor. They give me freedom. Surveillance can show that we could write, but not whether, when or what we actually write. If Freenet is used for that, it needs very little resources.

This is how to connect:

  1. Download and install Freenet from https://freenetproject.org,
  2. in the automatically opened setup wizard select “only friends”
  3. Copy the textblock1 you got with my email and paste it into the textfield on http://127.0.0.1:8888/addfriend/
  4. Then just send me what Freenet shows on the page http://127.0.0.1:8888/friends/myref.txt (attach it to an email or just copy it into the email)

As soon as I add you, too, we are connected. We can then write messages via the friends page (click my name):

  • Write message,: http://127.0.0.1:8888/friends/
  • Read messages: http://127.0.0.1:8888/alerts/

Hi,

I’ve been self-censoring what I write by email for years. But over the past year, with ever more details of surveillance being proven as fact and not just conspiracy theory, that became more serious: I no longer see email as safe, and with that, email is lost for me as a medium for personal communication. If I want to talk privately, I don’t use email.

You might have noticed that since then I’ve been writing fewer and fewer non-public emails.

This started impeding my life, when the critical law reporter at groklaw stopped publishing, because the owner did not consider sending information via email as safe anymore. Now I self-censor what I write, to whom I write, and when I write.

There is now no shield from forced exposure.2

But I have one haven left: Instead of writing private stuff by email, I’m communicating more and more via Freenet, especially with darknet contacts: People I know personally. And I’d like to do that with you, too. The reason is that Freenet Darknet messages hide even the information that we have a conversation at all:

I can finally send completely invisible messages.

This gives me the confidentiality back which allows talking freely. Talking without self-censoring every word I write.

And I would like to have that freedom when talking to you online. So I would be very happy if you’d install Freenet and connect to me over Darknet.

Install Freenet

To install Freenet, just go to https://freenetproject.org and click the green install-button

Then click through the installer as usual. After that your browser should open and show the Freenet Setup Wizard.

The Wizard

In the wizard, choose "Connect only to friends: (high security)".

For the following questions, just use the default or the option called "normal".

You can always revisit the wizard at http://127.0.0.1:8888/wizard/

Connect with me

Now go to the page “connect to a friend”: http://127.0.0.1:8888/addfriend/

There simply paste the following into the empty text field below the blurp of explanation (note: for this article I replaced the identifying info with X-es. Use your own from http://127.0.0.1:8888/friends/myref.txt):

identity=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
lastGoodVersion==XXXXXXXXXXXXXXXXXXXXXXX  
location==XXXXXXXXXXXXXXXXXXXXXXXX  
myName=XXXXXXX  
opennet=XXXXX  
sigP256=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
version==XXXXXXXXXXXXXXXXXXXXXXX  
ark.number=XXXX  
ark.pubURI=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
auth.negTypes=XX  
ecdsa.P256.pub=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
physical.udp==XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  
End

Just put my name in the description above the “Add” button and leave everything else at default.

Then send me an email3 with the text you find at the URL http://127.0.0.1:8888/friends/myref.txt

Once I copy that text into my own addfriends page, our computers will connect over Freenet.

(no need to babysit Freenet for this: simply let it run when you’re online and as soon as I add you, our Computers will connect over Freenet. Please give me a few days: With the PhD and the two little ones I’m often no longer able to answer email daily, but I see them)

And that’s it. We’re connected. In the rest of this mail, I’ll describe what you can do with Freenet.

Welcome to Freenet, where no one can watch you read!

I hope we will connect soon!

Best wishes, Arne

Using Freenet

Talk with me over Freenet

Once we are connected, you can send me confidential messages by going on the Friends page and clicking my name.

Friends-page: http://127.0.0.1:8888/friends/

That page lists all the people you are connected to. You can also tick the checkbox for multiple people and then use the drop down list “– Select Action –” and select “Send N2NTM to selected peers”. A N2NTM is a “node to node text message”.

You can see all messages you received on the messages page:

Messages-page: http://127.0.0.1:8888/alerts/

These messages are invisible to the outside.

Send me files over Freenet

If you want to send me bigger files, you can upload them from the upload page:

Upload-page: http://127.0.0.1:8888/insertfile/

When they finish uploading, just go to the list of Uploads, select the files you want to share with me and click the button “Recommend files to friends”. Then select my name and click the “Recommend” button at the bottom.

List of Uploads: http://127.0.0.1:8888/uploads/

You can also do the same for downloads, so it’s easy to pass on files.

The files you upload are stored encrypted in Freenet and can only be found by people who have the Link to the file. Like a filehoster, but it is encrypted and completely decentralized.

Advanced Freenet Usage

What I show here aren’t all the features of Freenet. Not by a long shot. But it’s enough to provide confidential communication between friends:

I can talk to you without self-censoring every single thought.

If you want to explore further features of Freenet, there are three central features:

  • Bookmarks to have hidden websites which inform you when they are updated.
  • Your own website in Freenet.
  • Anonymous Discussions with a Web of Trust to prevent spam.

Bookmarks

Bookmarks are easy. Just go to the main freenet page and click the [Edit] link above the bookmarks. It gets you to the bookmarks editor for changing and sharing bookmarks.

Bookmark-editor: http://127.0.0.1:8888/bookmarkEditor/

Websites in Freenet

Websites in Freenet are also simple. To get a basic website, just install the ShareWiki plugin, enter text, click publish and once the upload finished, send the URL to your friends by clicking “share” in the list of uploads. With this you can publish in Freenet: Your friends will know that it’s your site, but no one else.

Configure Plugins: http://127.0.0.1:8888/plugins/ The key for sharewiki to add as “Plugin from Freenet”: CHK@aCQTjPQI3uGsahMiTuddwJ51UJypA5Mqg4y0tf1VqXQ,eEkO3uge6IJ1QcrT5KGlJ1R6kEcMhQV4rXfv6NzoL5o,AAMC–8/ShareWiki-b17.jar

(note: ignore the search box on the main page. It’s broken)

Anonymous Discussions

Anonymous Discussions are somewhat different from the other features, because they require the Web of Trust, and that is very heavyweight.

If you want to keep the resource consumption of Freenet low, avoid the anonymous discussion platforms.

You will see people recommend it - even me. It is cool, but you should only enable it, if you have a computer which always runs and for which it does not matter when it runs at high load.

If you only want confidential communication with Friends, just avoid the Web of Trust for now. If you stick to the basic features (darknet messages, uploads, downloads bookmarks), Freenet will require few resources and little bandwidth.

For a low-spec computer or a laptop, avoid the Web of Trust and anonymous discussions: They are really cool, but still require lots of resources.

If you value truly anonymous discussions higher than keeping the load on your computer low, or if you have a computer which is always running, have a look at the Freenet Social Networking guide. It shows you how to setup and use the social features of Freenet.

Freenet Social Networking Guide: http://freesocial.draketo.de

Have fun in Freenet!

Troubleshooting

High resource usage

If Freenet makes your fans run at full speed and your disk cackle, you can fix that with three steps:

Technical details


  1. Censored version of my textblock (you’ll get an uncensored version by email) identity=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    lastGoodVersion==XXXXXXXXXXXXXXXXXXXXXXX
    location==XXXXXXXXXXXXXXXXXXXXXXXX
    myName=XXXXXXX
    opennet=XXXXX
    sigP256=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    version==XXXXXXXXXXXXXXXXXXXXXXX
    ark.number=XXXX
    ark.pubURI=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    auth.negTypes=XX
    ecdsa.P256.pub=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    physical.udp==XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    End 

  2. Groklaw: Forced exposure 

  3. Naturally it would be better to send the freenet addfriend text via encrypted emails with a full chain of trusted signatures. But for the basic goal of confidential communication that is not necessary. We can check sometime later, whether the text we exchanged was changed, so if someone wants to eavesdrop, we can detect that. And we would have proof, which would make for the next great story for political magazines like Panorama - which would help a lot at fighting surveillance on the long term (so it’s unlikely that people who want surveillance will dare to do that). Example: “NSA targets privacy conscious” in german public media documentation

AnhangGröße
connect-over-freenet-01.txt11.32 KB

Lots of site uploads into freenet

I just finished lots of new uploads of sites into freenet - with the new freesitemgr (which actually uploads quickly when WoT is disabled, check todays IRC-logs tomorrow to get background on that). You can get the new freesitemgr from github.com/ArneBab/lib-pyfreenet-staging or via infocalypse:

hg clone freenet://USK@kDVhRYKItV8UBLEiiEC8R9O8LdXYNOkPYmLct9oT9dM%2CdcEYugEmpW6lb9fe4UzrJ1PgyWfe0Qto2GCdEgg-OgE%2CAQACAAE/pyfreenet.R1/14 

The sites are also available via my freenet inproxy:

freenet-team - an introduction of most of the freenet hackers I know.

mathmltest - example of mathml in freenet.

winterface-deadlines - deadlines for the Winterface GSoC project

freenet-funding - the freenet fundraising plan, still lacking good design and crisp presentation slides or a video

freenet-meltdown - on the recent massive performance degradation which lasted a few month and ended with the link length fix.

fix-link-length - background on the link-length fix which made freenet actually do small world routing again instead of random routing (into which it had degraded, partially due to local requests, partially due to having so many peers per node that random routing actually worked for the current network size, so the pressure by routing-success to go back to small world routing was too weak compared to the pressure from local requests to randomize the connections)

download-web-site - how to download a single page from a website - for example to mirror it into freenet. Hint: For all the sites on draketo.de or 1w6.org you are allowed to do so freely (licensed under GPL).

guiledocs - the online documentation for GNU Guile with a focus on Scheme (using Guile): A powerful lisp-like language with multiple implementations.

decorrespondent-metadata - experiment how much information one can glean about your life from just one week of metadata, in dutch.

netzpolitiz-metadaten - same article translated to german. License: cc by-nc-sa

Adventures of a Pythonista in Schemeland - the adventures of a Pythonista in Schemeland: A deep understanding of Scheme for Python users. I learned to love Scheme with this. BSD license.

programming-languages - The Programming languages lecture. License: cc by-nc-sa

tao of programming - "When you have learned to snatch the error code from the trap frame, it will be time for you to leave."

Mitigate the Pitch Black attack (the simulation works)

I fixed a small bug in the simulator of thesnark. With that, the simulator shows that the defense against the Pitch Black Attack works: A small number of attackers can no longer kill parts of the keyspace and can also no longer make certain parts of the keyspace inaccessible.

Attackers can still limit the convergence of the network towards a reproduction of the small world network, but since we know that Opennet works quite well with 30% backoff, this limited convergence should suffice for efficient routing.

peer distances under attack

I also identified two possible ways to make the algorithm more efficient.

The fix does not need to know the size of the network. The only global information it needs is routing to random locations.

In this mail I first describe simulator and Pitch Black Attack. Afterwards I describe the fix. The fix was originally proposed by Oskar Sandberg. He did all the hard work, I just describe it here.

Graphics

Peer Distances - Location histogram

(because that’s what most people really want ☺)

These show that the fix prevents complete fracturing of the keyspace: It recreates the short connections.

The simulator

Most of the simulation is the work of Michael Grube. I just fixed a small bug.

  • Michaels Repo: http://github.com/mgrube/pbsim
  • My Repo: http://github.com/ArneBab/pbsim

The network starts with a random network and then optimizes it — either with clean swapping or under attack without and with different countermeasures.

To run the simulation, run

./testfixpitchblack.py

You need pylab and networkx (links are in README.md).

The Pitch Black Attack (the problem)

Optimizing the network with swapping works pretty well without attacks (within the mathematical limits1) — as shown in the simulation ("clean swapping network"). But this can currently be broken easily, even by a single attacker, using the Pitch Black Attack.2

Swapping exchanges keys and implicitly trusts randomly selected nodes. Two nodes compare their peers, and if they determine that exchanging their locations improves the link length distribution to their respective group of peers, they swap the locations. Node A now has the former location of node B and node B has the former location of node A.

Normally that’s no problem: The probability that this trust is violated is just the proportion of attackers in the network. So some swapping will wrong, but this will only happen rarely.

There is one lasting effect however: If node B always hands out the same location when swapping, this location will stay in the network indefinitely and former location of node A will be lost. This is slow, only one key can be killed per swapping, but highly effective.

Using the Pitch Black Attack, attackers can remove selected locations From the network (which allows for censorship by making selected files with known keys inaccessible, because nodes with their content change to locations which won’t be searched for this content).

The fix for this has been pending since 2008 because “We have solutions for this but they are still being tested.” (https://freenetproject.org/about.html#papers). I consider this testing to be done with this email. The fix works (described as follows).

Approach

To fix the Pitch Black Attack nodes route to a random location and check the distance of the closest node they can reach. If this distance is much larger than expected, they consider the network to be under attack and switch to this location to fill the gap they found.

If detection and filling of gaps is faster than creation of gaps by the Pitch Black Attack, this reduces the Pitch Black Attack from a death stroke to a nuisance.

Requirements

  1. The network must be stable for (a) a random network and (b) a network with a cluster of small-world structured nodes embedded in a random network. The algorithm must not mistake (a) or (b) as attacked networks, otherwise swapping will not be able to change a random network to a small world network.

  2. In case of an attack, nodes must switch do positions inside the created gaps to fill them.

  3. When switching locations, content must be preserved close to the old location.

Information used

The simulated algorithm only uses the estimated number of peers (also known as outdegree), the distance to direct peers and actual routing. It does not need the size of the network.

The number of peers is used to calculate the expected distance to a location in a randomly structured network. More exactly: The mean distance plus two standard deviations (97.5% of random routes will find a shorter distance than this). Let’s call this expected random distance range d_er. As far as I can reconstruct it, this distance was calculated by Oskar using statistics. I just use brute force, as shown in https://github.com/ArneBab/pbsim/blob/master/bruteforcemindist.py

This is the magic number 0.037. If you choose a set of six random locations in the circular keyspace [0..1) repeatedly and stop when the closest of these locations isn’t closer to a target than on the previous try, and you re-run this experiment repeatedly, then 95% of the results will be closer than 0.037. It’s the 95% limit of the distance to a target in a random network with outdegree 6.

The basic algorithm

Before starting to swap, a freenet node first selects a random location. Let’s call it l. Then it routes towards this location and notes the distance of the node closest to this location. Lets call it d.

Now it calculates the mean distance to its direct peers. Let’s call this d_mean

If the distance d minus the mean distance to the peers d_mean is larger than the expected random distance range d_er, the node assumes that the random location l is within a gap. Instead of starting a swap request, it switches to this tested location l.

if (d - d_mean) > d_er: switch to l else: initiate swap

d - d_mean compares the routing result with the distribution of direct peers. If the gap is bigger than the mean distance to the peers, it might be a real gap, purely from local information.

(d - d_mean) > d_er ensures that even if the peers have the same location (d_mean = 0), this is only treated as gap if d is larger than the distance which would be found on 95% of routing tries in a random network, d_er. This ensures that even when there is a small optimized group within a large randomized network (for example when the network grows quickly), the nodes in the optimized group will not mistake the routing quality outside the optimized group as attacked network.

Adaptions

Median distance

During experimentation I found that using mean peer distance means that nodes with more long-distance connections are less likely to detect a gap. An attacker might be able to segment the network so that every node has a few long-distance connections to prevent detection of gaps. I tried to fix this using the median distance to peers instead of the mean distance, since the median is less sensitive to outliers.

use d_median instead of d_mean

This was the most effective adjustment, but I need help from someone with deeper knowledge about network statistics to test this.

Route to two targets

If the constant minimum distance for random networks (d_er) should prove problematic, we can reduce the value of d_er by doing two routing tries with different targets and check the shorter of the two distances but switch to the target with the larger distance. d_er would then for example be only around 0.02 instead of 0.037). But for this the simulation results have been unclear.

Avoid data loss

Update: Reinsertion is not needed, because a node which swaps to a random location will very likely swap back to a location closer to its neighbors within the next few swapping operations.

If a node changes its location by a large distance, this means that the content it holds cannot be found anymore. To fix this, it needs to re-insert all content in its store.

This is no large problem with basic swapping, because there the locations should stabilize, changing only in small ways. In case of an attack, it becomes important, though.

While it sounds expensive to re-insert all content in the store, it should not actually cost too much, since we can assume that most peers of the node will be close to its old location. So it could simply insert the content in its store with a HTL around 2 and still be confident to reach the right nodes.

Conclusion

This solution mitigates the Pitch Black Attack with moderate cost. Under attack the network no longer converges completely, but it still reaches a more optimized state of which I would expect that it suffices for routing.

It would be great to have more math on this, but I think it’s already ready for implementation.

Please comment!

Best wishes, Arne Babenhauserheide


  1. Stefanie Roos showed that efficient convergence is not possible under churn, but this should not affect Freenet too badly, because in friend-to-friend mode many connections are extremely long lived, often on the order of years. Therefore real churn (as in permanently lost connections) is extremely low compared to other systems which often have lifetimes on the order of hours. 

  2. This was shown by Christian Grothoff: http://grothoff.org/christian/pitchblack.pdf @conference{pitchblack, title = {Routing in the Dark: Pitch Black}, booktitle = {23rd Annual Computer Security Applications Conference (ACSAC 2007)}, year = {2007}, pages = {305{\textendash}314}, publisher = {IEEE Computer Society}, organization = {IEEE Computer Society}, abstract = {In many networks, such as mobile ad-hoc networks and friend-to-friend overlay networks, direct communication between nodes is limited to specific neighbors. Often these networks have a small-world topology; while short paths exist between any pair of nodes in small-world networks, it is non-trivial to determine such paths with a distributed algorithm. Recently, Clarke and Sandberg proposed the first decentralized routing algorithm that achieves efficient routing in such small-world networks.

    This paper is the first independent security analysis of Clarke and Sandberg{\textquoteright}s routing algorithm. We show that a relatively weak participating adversary can render the overlay ineffective without being detected, resulting in significant data loss due to the resulting load imbalance. We have measured the impact of the attack in a testbed of 800 nodes using minor modifications to Clarke and Sandberg{\textquoteright}s implementation of their routing algorithm in Freenet. Our experiments show that the attack is highly effective, allowing a small number of malicious nodes to cause rapid loss of data on the entire network.

    We also discuss various proposed countermeasures designed to detect, thwart or limit the attack. While we were unable to find effective countermeasures, we hope that the presented analysis will be a first step towards the design of secure distributed routing algorithms for restricted-route topologies.}, keywords = {denial-of-service, Freenet, installation, routing}, url = {http://grothoff.org/christian/pitchblack.pdf}, author = {Nathan S Evans and Chis GauthierDickey and Christian Grothoff} } 

News of the day — and using Freenet as decentralized, pseudonymous communication backend for applications

This is a proposal I wrote for the NLnet Open call for funding 2016-12. It got into the short list but was not selected, so I’m sharing it here. Maybe it spikes your interest or serves as inspiration for something exciting you want to realize with Freenet. I still plan to do this, but in hobby-time it will likely take a few years to realize instead of the 6 months I had planned. Initial work is available in pyFreenet/babcom_cli

The project

The goal of this project is to provide a working, anonymous communication system which can be used as library to add privacy-respecting communication features to any application.

The focus of the communication system is providing the news-of-the-day. News-of-the-day is a concept to reduce information overload: Every user can select the two most important news items of the day which are then shared with his or her subscribers on the next day. One of these is self-written, one is forwarded from other news items the user saw.

By avoiding any centralized infrastructure, the project will be free of external pressure (i.e. needing to fund the infrastructure through advertisements, or attempts to censor information) which cause other projects to focus on engagement instead of actual news.

To provide these features, it builds on Freenet, a decentralized platform for pseudonymous publishing and communication which was started in 2000 and is currently used by about 8000 people. Freenet provides publishing under a pseudonym without needing to run a server as well as completely decentralized spam-prevention. The spam-prevention will also allow users to limit fake-news by treating pseudonyms who repeatedly promote fake-news as spammers.

The target community

The community is twofold: On the one hand desktop-users who want to reduce their information overload without missing important news items. With important in the meaning defined by the following quote:

“Whatever a patron desires to get published is advertising; whatever he wants to keep out of the paper is news,” — 1918, Anonymous (quoted in The Fourth Estate: A Newspaper for the Makers of Newspapers)

On the other hand application developers who want to add communication features into their programs without having to worry about violating the privacy of their users when a server is breached and without having to build and maintain a centralized back-end infrastructure.

Usage of the money

10 000€ will be used to improve the scalability of the spam-prevention method in Freenet¹ and another 10 000€ to improve the response times². These are the two tasks I cannot do easily myself. In addition, 4000€ will be used to allow me to reduce my working hours for 3 months without impacting the family budget too strongly. Another 1000€ will be used for presenting the project at programming conventions.

¹: Improving the scalability should require about 6 weeks of work in the ideal case, with 10 weeks the more realistic estimate. This will be done by hiring the main developer of the spam-prevention method for implementing the detailed plan described in this task: https://bugs.freenetproject.org/view.php?id=3816#c12182

²: The spam-prevention method in Freenet reacts slowly due to over-locking. I will hire an external developer to profile the code and solve the problems which impact the use-cases relevant for my project.

What is new?

On the feature-side, the new approach is encouraging the users to choose only a limited number of most important items, while providing real anonymity along with decentralized spam-protection so users can promote what they deem newsworthy without having to worry about their public image.

On the technical side, the main new approach is to tie together established and tested methods provided by Freenet (this has never been done before, partly due to missing documentation how to harness them) and to use these methods for implementing communication features in external applications.

The technical approach is described in the Freenet Communication Primitives I published end of last year: http://www.draketo.de/light/english/freenet/communication-primitives-2-discovery

This project will also form the core of the third part of the Freenet Communication Primitives.

How will promote the project to your target community?

To reach users as early adopters, I will promote early stages directly in Freenet. When the system reaches stability, I will contact websites which write about privacy-tools. I am already in contact with one of the writers for deepdotweb which has a good reach into the group of privacy aware people who are willing and able to invest into trying a new tool.

To reach developers, I will present the project at programming conventions which are one of the major source of actionable information about usable libraries. I will back this with simple tutorials about using the project to add communication tools to other programs.

On the 2014 freenet-meltdown

Update (2018-04-14): After 3 years of testing we could confidently decrease the minimum required connections to 6 (for 10 KiB/s upload speed) and still get good scaling thanks to the link length fix. This was released as Freenet build 1480. This yielded the same transfer speeds with lower CPU requirements and with much better scaling for high bandwidth nodes.

Update (2014-09-06): The meltdown is stopped and reversed. We implemented the link length fix and this solved an issue with the network structure we had for the last few years. We’re currently watching anxiously, whether the performance only comes back to the performance before the backdown or whether the lifetime actually gets much better. Watch the fetch-pull stats!

Current Fetch Performance, 1 day

^ inserted one day ago: You see the meltdown starting in april and the improvement with the latest version: It’s back on at least the level before the meltdown.

Current Fetch Performance, 4/2 weeks

^ 4 weeks ago inserted, 2 weeks ago accessed. If this goes above 0.6 starting 2014-09-19, the improvement could prove to be huge: It could give us much longer lifetimes of data in freenet.

Update (2014-07-23): The fetch-pull graphs look like we have oscillating here. This could mean that this is NOT an attack, but rather the direct effect of the KittyPorn patches: First the good connections get broken. This ruins the network. Then they can’t get any worse and the network recovers. Then they break again. This is still speculative. For an up to date plot, see fetchplots1.

Update (2014-05-22): The performance stats are much better again and the link-length distribution recovered. We might have been hit by an attack after all (which failed to take down freenet, but hurt pretty much). With some luck we’ll soon see a paper published with the evaluation of the attack and ways to mitigate it cleanly. (hint to computer scientists: we link to papers from the freenetproject.org website, so if you want to get a small boost for your chances of citation, send the link to your paper to devl@freenetproject.org)

Summary: There is a freenet patch floating around which claims to increase performance. The reality is (to our current-knowledge), that it breaks the network as soon as more than a few percent run it. And this is the case, which is why the network is almost completely broken right now. If you run that patch, please get rid of it!

Freenet is currently experiencing a meltdown, with extremely slow downloads, high connection churn and lifetimes for bigger files down to about a day. For a visualization, see the fetch-performance in the following graph and take note of the drop at the end. It nicely shows how a bad patch spread while more and more users installed it (hoping for better performance) and slowly killed the network. When that line goes below 50%, bigger files are dead approximately one day after being uploaded.

Fetch Performance (thanks for these stats goes to fetchpull from digger3)

We suspect that patch, because the number of nodes reporting 100 or more connections in the anonymised probe-stats increased a lot over the past few weeks (this is only possible with a patched freenet) and the link-length-distribution almost completely lost a bump it had at 0.004, suggesting that freenet essentially reverted to random routing, while the number of nodes did not change significantly.

connections per node
link length distribution
number of freenet nodes which report stats
(thanks for these stats goes to probe stats which operhiem1 implemented in Google Summer of Code 2012)

We are working on creating a clean solution.

Freesites still work, because the SSK-queue did not get hammered, so if you are a freesite author, please inform your readers about the patch and ask them to get rid of it!

In case you use freenet and want information on that patch, please read the note from TheSeeker:

Information from TheSeeker in IRC (#freenet @ freenode)

Recently Kittyporn released an autopatcher-script: CHK@r6dUGAYs2No4lWT3DTkY2dIYdgA-eoBAcU~U-kLU-0I,hxGN5OTN4j~04YnCS4UTflMK4fpW2hfhB58CU1KNRAw,AAMC--8/FNAutoPatch-1.0_by_Kittyporn.rar

This increased usage of the patch by probably several hundred nodes, judging by the partial logs from the webserver that we have for fetches of the source tarball.

The script stupidly pulls the freenet source from freenetproject.org rather than say, github, or freenet. Really bad for anonymity, but good for tracking.

logs only go back a couple weeks, which is why they are incomplete, and we don't know the real number of people that have run it. hard to tell how much less the people that are cheating feel the effects of the whole network collapsing around them. surely can't be long before they too start complaining about speeds given the data retention issues it's causing.

NLM was supposed to fix all this shit. :|

modified nodes are flooding the network, creating broad backoff issues. this makes routing suffer, and avg path lengths increase, which reduces overall availability of bandwidth and more backoff and more misrouting. Death spiral until we hit some equilibrium that is roughly equal to random routing.

essentially what the broken NLM did. thankfully, it is only routing for bulk chk, so it'll still be possible to do some things if forced through the realtime queue... e.g. if we want to deploy an update, and have the constituent blocks actually get routed anywhere near the correct destination...

Additional comment

To do the math: a few hundred users easily equals 10% of the network. No wonder we have a meltdown.

and even worse, these few hundred users are likely the high-bandwidth folks with a huge number of connections.

Let’s assume that they each have 40 connections while the others have ~10. Every node connected to such an abusive node will essentially be blocked. That’s 100% of the nodes…

40 other nodes wrecked × 10% = ouch!

AnhangGröße
fetchpull-stats-1148-fetchplots1.png43.8 KB
probe-stats-489-plot_link_length.png6.67 KB
probe-stats-489-plot_peer_count.png7.64 KB
probe-stats-489-year_900x300_plot_network_size.png26.24 KB
fetchpull-stats-1228-fetchplots1.png46.38 KB

Real Life Infocalypse

Freenet Logo: Follow the Rabbit DVCS in the Darknet. The decentralized p2p code repository.

In this guide I show by example how you can use the Infocalypse plugin for distributed development without central point of failure or reliance on unfree tools.12

If you think “I have no idea what this tool is for”: Infocalypse gives you fully decentralized Github with real anonymity, using only free software.

# freenet -> local
hg clone freenet://ArneBab/life-repo
# local -> freenet
hg clone life-repo real-life
hg clone real-life freenet://ArneBab/real-life
# send pull request
cd real-life
hg fn-pull-request --wot ArneBab/life-repo
(enter message)
# check for pull-requests
cd ../life-repo
sleep 1800 # (wait for confidential delivery)
hg fn-check-notifications --wot ArneBab

If you like this, please don’t only click like or +1, but share it with everyone who could be interested. The one who knows best how to reach your friends is you — and that’s how it should be.

Setup

(I only explain the setup for GNU/Linux because that’s what I use. If you want Infocalypse for other platforms, come to the #freenet IRC channel so we can find the best way to do it)

Freenet Setup

Install and start Freenet. This should just take 5 minutes.

Then activate the Web of Trust plugin and the Freemail plugin. As soon as your Freenet is running, you’ll find the Web of Trust and Freemail plugins on the Plugins-Page. This link will work once you have a running Freenet. If you want to run Freenet on another computer, you can make it accessible to your main machine via ssh port forwarding: ssh -NL 8888:localhost:8888 -L 9481:localhost:9481 <host>.

Now create a new Pseudonym on the OwnIdentities-page.

Infocalypse Setup

Install Mercurial, defusedxml, PyYAML for Python2. The easiest way of doing so is using easy_install from setuptools:

cd ~/
echo '
export PATH="${PATH}:~/.local/bin:~/bin"
export PYTHONPATH="${PYTHONPATH}:~/.local/lib64/python2.7:~/.local/lib/python2.7"
export PYTHONPATH="${PYTHONPATH}:~/lib/python2.7:~/lib64/python2.7"
' >> ~/.bashrc
source ~/.bashrc
wget https://bootstrap.pypa.io/ez_setup.py -O - | python2.7 - --user
easy_install --user --egg Mercurial defusedxml PyYAML pyFreenet==0.4.0

Then get and activate the Infocalypse extension:

hg clone https://hg.sr.ht/~arnebab/infocalypse
echo '[extensions]' >> ~/.hgrc
echo 'infocalypse=~/infocalypse/infocalypse' >> ~/.hgrc

Infocalypse with Pseudonym

Finally setup Infocalypse for the Pseudonym you created on the OwnIdentities-page. The Pseudonym provides pull-requests and for shorter repository URLs.1

hg fn-setup --truster <Nickname of your Web of Trust Pseudonym>
hg fn-setupfreemail --truster <Nickname of your Web of Trust Pseudonym>

That’s it. You’re good to go. You can now share your code over Freenet.

Welcome to the Infocalypse!

Example

This example shows how to share code over Freenet (using your Pseudonym instead of ArneBab).
# Create the repo
hg init life-repo
cd life-repo
echo "my" > life.txt
hg commit -Am "first steps"
cd ..

# Share the repo
hg clone life-repo freenet://ArneBab/life-repo

# Get a repo and add changes
hg clone freenet://ArneBab/life-repo real-life
cd real-life
echo "real" > life.txt
hg commit -m "getting serious"

# Share the repo and file a pull-request
hg clone . freenet://ArneBab/real-life
# the . stands for "the current folder"
hg fn-pull-request --wot ArneBab/life-repo # enter a message
cd ..

# Check for pull-requests and share the changes
cd life-repo
hg fn-check-notifications --wot ArneBab
hg pull -u freenet://ArneBab/real-life
hg push freenet://ArneBab/life-repo

Privacy Protections

Infocalypse takes your privacy seriously. When you clone a repository from freenet, your username for that repository is automatically set to “anonymous” and when you commit, the timezone is faked as UTC to avoid leaking your home country.

If you want to add more security to your commits, consider also using a fake time-of-day:

hg commit -m "Commit this sometime today" --date \
   "$(date -u "+%Y-%m-%d $(($RANDOM % 24)):$(($RANDOM % 60)):$(($RANDOM % 60)) +0000")"

Open path/to/repo-from-freenet/.hg/hgrc to set this permanently via an alias (just adapt the alias for rewriting the commit-date to UTC - these are already in the hgrc file if you cloned from Freenet).

Background Information

Let’s look at a few interesting steps in the example to highlight the strengths of Infocalypse, and provide an outlook with steps we already took to prepare Infocalypse for future development.

Efficient storage in Freenet

hg clone life-repo freenet://ArneBab/life-repo

Here we clone the local repository into Freenet. Infocalypse looks up the private key from the identity ArneBab. Then it creates two repositories in Freenet: <private key>/life-repo.R1/0 and <private key>/life-repo.R0/0. The URLS only differ in the R1 / R0: They both contain the same pointers to the actual data, and if one becomes inaccessible, the chances are good that the other still exists. Doubling them reduces the chance that they fall out and become inaccessible, which is crucial because they are the only part of your repository which does not have 100% redundancy. Also these pointers are the only part of the repository which only you can insert. As long as they stay available, others can reinsert the actual data to keep your repository accessible.

To make that easy, you can run the command hg fn-reinsert in a cloned repository. It provides 5 levels:

  • 1 - re-inserts the top key(s)
  • 2 - re-inserts the top keys(s), graphs(s) and the most recent update.
  • 3 - re-inserts the top keys(s), graphs(s) and all keys required to bootstrap the repo (default).
  • 4 - adds redundancy for big (>7Mb) updates.
  • 5 - re-inserts existing redundant big updates.
To reinsert everything you can insert, just run a tiny bash-loop:

for i in {1..5}; do hg fn-reinsert --level $i; done

Let’s get to that “actual data”. When uploading your data into Freenet, Infocalypse creates a bundle with all your changes and uploads it as a single file with a content-dependent key (a CHK). Others who know which data is in that bundle can always recreate it exactly from the repository.

When someone else uploads additional changes into Freenet, Infocalypse calculates the bundle for only the additional changes. This happens when you push:

hg push freenet://ArneBab/life-repo

To clone a repository, Infocalypse first downloads the file with pointers to the data, then downloads the bundles it needs (it walks the graph of available bundles and only gets the ones it needs) and reassembles the whole history by pulling it from the downloaded bundles.

hg clone freenet://ArneBab/life-repo real-life

By reusing the old bundles and only inserting the new data, Infocalypse minimizes the amount of data it has to transfer in and out of Freenet, and more importantly: Many repositories can share the same bundles, which provides automatic deduplication of content in Freenet. When you take into account that in Freenet often accessed content is faster and more reliable than seldomly accessed content, this gives Infocalypse a high degree of robustness and uses the capabilities of Freenet in an optimal way.

If you want to go into Infocalypse-specific commands, you can also clone a repository directly to your own keyspace without having to insert any actual data yourself:

hg fn-copy --requesturi USK@<other key>/<other reponame>.R1/N \
   --inserturi USK@<your key>/<your reponame>.R1/N

Pull requests via anonymous Freemail

Since the Google Summer of Code project from Steve Dougherty in 2013, Infocalypse supports sending pull-requests via Freemail, anonymous E-Mail over Freenet.

hg fn-pull-request --wot ArneBab/life-repo # enter a message
hg fn-check-notifications --wot ArneBab

This works by sending a Freemail to the owner of that repository which contains a YAML-encoded footer with the data about the repository to use.

You have to trust the owner of the other repository to send the pull-request, and the owner of the other repository has to trust you to receive the message. If the other does not trust you when you send the pull-request, you can change this by introducing your Pseudonym in the Web of Trust plugin (this means solving CAPTCHAs).

Convenience

To make key management easier, you can add the following into path/to/repo/.hg/hgrc

[paths]
default = freenet://ArneBab/life-repo
real-life = freenet://ArneBab/real-life

Now pull and push will by default go to freenet://ArneBab/life-repo and you can pull from the other repo via hg pull real-life.

Your keys are managed by the Web of Trust plugin in Freenet, so you can use the same freenet-uri for push and pull, and you can share the paths without having to take care that you don’t spill your private key.

DVCS WebUI

When looking for repositories with the command line interface, you are reliant on finding the addresses of repositories somewhere else. To ease that, Steve also implemented the DVCS WebUI for Freenet during his GSoC project. It provides a web interface via a Freenet plugin. In addition to providing a more colorful user interface, it could add 24/7 monitoring, walking remote repositories and pre-fetching of relevant data to minimize delays in the command line interface. It is still in rudimentary stages, though.

All the heavy lifting is done within the Infocalypse Mercurial plugin: Instead of implementing DVCS parsing itself, The DVCS WebUI asks you to connect Infocalypse so it can defer processing to that:

hg fn-connect

The longterm goal of the DVCS WebUI is to use provide a full-featured web interface for repository exploration. The current version provides the communication with the Mercurial plugin and lists the paths of locally known repositories.

You can get the DVCS WebUI from http://github.com/Thynix/plugin-Infocalypse-WebUI

Gitocalypse

If you prefer working with git, you can use gitocalypse written by SeekingFor to seamlessly use Infocalypse repositories as git remotes. Gitocalypse is available from https://github.com/SeekingFor/gitocalypse

The setup is explained in the README.

Troubleshooting

  • When I'm running "hg fn-setup" I get the error "abort: No module named fcp.node"
    Do you have pyFreenet installed? Also ensure that you installed it for python 2.
    wget bootstrap.pypa.io/ez_setup.py -O - | python2.7 - --user
    easy_install --user --egg Mercurial defusedxml PyYAML pyFreenet==0.4.0

Conclusion

Infocalypse provides hosting of repositories in Freenet with a level of convenience similar to GitHub or Bitbucket, but decentralized, anonymous and entirely built of Free Software.

You can leverage it to become independent from centralized hosting platforms for sharing your work and collaborating with other hackers.


  1. This guide shows the convenient way of working which has a higher barrier of entry. It uses WoT Pseudonyms to allow you to insert repositories by Pseudonym and repository name. If you can cope with inserting by private key and sending pull-requests manually, you can use it without the WoT, too, which reduces the setup effort quite a bit. Just skip the setup of the Web of Trust and Freemail and plugins. You can then clone the life repo via hg clone freenet://USK@6~ZDYdvAgMoUfG6M5Kwi7SQqyS-gTcyFeaNN1Pf3FvY,OSOT4OEeg4xyYnwcGECZUX6~lnmYrZsz05Km7G7bvOQ,AQACAAE/life-repo.R1/4 life-repo. See hg fn-genkey and hg help infocalypse for details. 

  2. Infocalypse shows one of many really interesting possibilities offered by Freenet. To get a feeling of how much more is possible, have a look at The Forgotten Cryptopunk Paradise

Reproducible build of Freenet do-it-yourself: verify-build demystified

You might know the reproducible-builds project, which tries to allow users to verify that what they install actually corresponds to the released source. Or GNU Guix, which provides transparent reproducible binaries — along with a challenge-function.

Given that Freenet is made for people with high expectations for integrity, it might not surprise you that Freenet has been providing a verifyable1 build and a verification script since 2012. However until release 1481, it was a hassle to set up, and few people used it.

But now that we’re on gradle, verifying that what I release is actually what’s tagged in the source is much easier than before.

The following instructions are for GNU/Linux, and maybe other *nixes, allowing you to verify the test release of 1482. You can easily adapt them for future releases.

preparation

Firstoff: to verify 1482 you NEED Java 7 - in general you need the Java version I release with. I hope that starting with 1483 it will be Java 8.

Update 2022: Now it’s Java 8.

get the release

Start by downloading the jar: SSK@…/jar-1482 (needs a running Freenet)

Copy it to /tmp/freenet-1482.jar

verify it

Then run the following:

failureWarning="FAILED TO VERIFY.
If you determine that this failure is not due to build environent differences,
then the source files used to build the published version of Freenet are 
different from the published source files. The build has been compromised.
Take care to only run version of Freenet with published, reviewable source code, 
as compromised versions of Freenet could easily contain back doors."

cd /tmp/
git clone git@github.com:freenet/fred.git
cd fred
git checkout build01482
./gradlew jar
mv build/libs/freenet.jar ../freenet-built.jar
cd ..

mkdir unpacked-built
unzip freenet-built.jar -d unpacked-built
(cd unpacked-built; find -type f) | sort > unpacked-built.list

mkdir unpacked-official
unzip freenet-1482.jar -d unpacked-official
(cd unpacked-official; find -type f) | sort > unpacked-official.list

if ! cmp unpacked-official.list unpacked-built.list; then
    echo FAILED TO VERIFY: Different files in official vs built
    echo Files in official but not in built are marked as +
    echo Files in built but not in official are marked with -
    diff -u unpacked-built.list unpacked-official.list
    echo ""
    echo "$failureWarning"
fi

while read x; do
    if ! cmp "unpacked-official/$x" "unpacked-built/$x"; then
        if [[ "$x" = "./META-INF/MANIFEST.MF" ]]; then
            echo "Manifest file is different; this is expected."
            echo "Please review the differences:"
            diff "unpacked-official/$x" "unpacked-built/$x"
        else
            echo "File is different: $x"
            echo "$x" >> "differences"
        fi
    fi
done < unpacked-official.list

if [[ -s "differences" ]]; then
    echo VERIFY FAILED: FILES ARE DIFFERENT:
    cat differences
    echo ""
    echo "$failureWarning"
fi

celebrate!

That’s it. You just verified release 1482 of Freenet. If that code does not shout a huge warning at you, then what I released is actually what is tagged and signed as 1482 in the source.

PS: This is a shorter and somewhat cleaned up version of the verify-build script.

PPS: Yes, there is also a docker solution. I cannot test it right now, though, because my docker does not work. Ask in IRC (#freenet on libera.chat).


  1. Since Java puts timestamps into class files and requires signing of jars, the jar is not byte-by-byte reproducible, but the verify-build script unpacks the jar and compares the class-files, ensuring that they only differ in timestamps and similar that do not affect functionality. 

Spread Freenet: A call for action

Freenet Logo: Follow the Rabbit “Daddy, where were you, when they took the freedom of the press away from the internet?” — Mike Godwin, Electronic Frontier Foundation

Reposted from Freetalk, the distributed pseudonymous forum in Freenet.

For all those among you, who use twitter, identi.ca[^identica], and/or other social networks this is a call to action.

Go to your social networking accounts and post about freenet. Tell us in 140 letters why freenet is your tool of choice, and remember to use the #freenet hashtag, so we can resend your posts!

I use freenet because we might soon need it as safe harbour to coordinate the fight against censorship → freenetproject.org

The broader story is the emerging concept of a right to freely exchange arbitrary data — Toad (former lead developer of freenet)

Background

There are still very many people out there who don’t know what freenet is. Just today a coder came into the #freenet IRC channel, asked what it did and learned that it already does everything he had thought about. And I still remember someone telling me “It would be cool if we had something like X-net from Cory Doctorow’s ‘Little Brother’” — he did not know that freenet already offers that with much improved security.

So we need to get the word out about freenet. And we have powerful words to choose from, beginning with Mike Godwin’s quote above but going much further. To just name a few buzz-words: Freenet is a crowdfunded distributed and censorship resistant freesoftware cloud publishing system. And different from info about corporate PR-powered projects, all these buzz words are true.

But to make us effective, we need to achieve critical mass. And to reach that, we need to coordinate and cross promote heavily.

Call to action

So I want to call to you to go to your social networking accounts and post about freenet. Tell us in 140 letters why freenet is your tool of choice, and remember to use the #freenet hashtag, so we can find and retweet your posts!

We can make a difference, if we fight together.

Additional info

Besides: My accounts are:

But no need to tell me your account. Just use your current social network of choice and remember to tell your friends to talk about freenet, too.

I hereby allow anyone to reuse this article in any form and under any license (up to the example tweets), so I can’t know who saw it here and who saw it elsewhere.

http://draketo.de/light/english/spread-freenet-a-call-to-action-on-twitter-and-identica

I hope I’ll soon see floods of entusiastic tweets about Freenet!

Some example tweets

I’ll gladly post and link yours here, if you allow it!

#Freenet: #crowdfunded distributed and censorship resistant #freesoftware cloud publishing → http://freenetproject.org — rightful buzz!

#imhappiestwhen when the internet is free. I hope it will remain so thanks to projects like #Freenet http://t.co/GMRXmDtGaming4JC

#freenet: freedom to publish that you may have to rely on, because censorship and ©ensorship are on the rise — Ixoliva

→ Install Freenet ←

Freenet

https://freenetproject.org

The Freenet Web of Trust keeps communication friendly with actual anonymity

In the past decade there hasn’t been a year without a politician calling for real names on the internet. Some even want to force people to use real photos as profile pictures. All in the name of stopping online hate, though enforcing real names has long been shown to actually make the problem worse.

This article presents another solution, one that has actually proven that it keeps communication friendly, even in the most anonymous environment of the fully decentralized Freenet project.

And that solution does work without enabling censorship and harassment (as requiring real names would).

History

The Web of Trust (WoT) was conceived when Frost, one of the older forums on Freenet, broke down due to intentional disruption: some people realized that full anonymity also allowed for automatic spamming without repercussions. For several months they drowned every board in spam, so people had to spend so much time ignoring spam that constructive communication mostly died.

Those spammers turned censorship resistance on its head and censored with spam. Similar to people who claim that free speech means that they have the right to shout down everyone who disagrees with them. Since the one central goal of Freenet is censorship resistance, something had to be done. The problem of Frost was that everyone could always write to everyone. Instead of going into an arms race of computing power or bandwidth, Freenet developers went to encode decentralized reputation into communication, focussed on stopping spam.

How it works

To make your messages visible to others, you have to be endorsed by someone they trust. When someone answers some of your messages without marking you as spammer, that means endorsement. To get initial visibility, you solve CAPTCHAs which makes you visible to a small number of people. This is similar to having moderators with a moderation queue, but users choose their own moderators.

If someone now starts spamming, users who see the messages mark them as spammer. To decide whose messages to see, users sum up all the endorsements (positive) and spam-marks (negative), weighted by their closeness in social interaction to the ones who gave them. If the total result is negative, the messages of the spammer are not even downloaded.

That method still provides full anonymity, but with accountability: you pay for misbehavior by losing visibility. This is the inverse of Chinese censorship: in China you get punished if your message reaches too many people. In Freenet you become invisible to the ones you annoy — and to those who trust them but not you (their own decision always wins).

But wait, does that actually work? Turns out that it does, because it punishes spammers by taking away visibility, the one currency spammers care about.

It is the one defence against spam which inherently scales better than spamming. And it keeps communication friendly.

Experience

Now I repeated the claim three times that the WoT keeps communications friendly (including the title). Let’s back it up. Why do I say that the WoT keeps communication friendly?

For the last decade, Freenet has been providing three discussion systems side by side. One is Frost, without Web of Trust. One is FMS, with user-selected moderators as Web of Trust. And the third is Sone, with propagating trust as Web of Trust. On Frost you see what happens without these systems. Insults fly high and the air is filled with hate and clogged by spam. Consequently it is very likely that FMS and Sone are a target of the same users. With no centralized way of banning someone, they face a harder challenge than most systems on the clearnet (though with much less financial incentive).

Yet discussions are friendly, constructive and often controversial. Anarchists, agorians, technocrats, democrats, LGBT activists and religious zealots discuss without going at each others throats.

And since this works in Freenet, where very different people clash without any fear of real-life repercussions, it can work everywhere.

Further reading

Use in other systems

How can this be applied to systems outside Freenet — for example federated microblogging like GNU social?

You can translate the required input to the Web of Trust as described in the scalability calculation to use information available in the federation:

  • As WoT identity, use the URL of a user on an instance. It is roughly controlled by that user.
  • As peer trust from Alice to Bob, use "if Alice follows Bob, use trust (100 - (100 / number of messages from Alice to Bob))".
  • As negative trust use a per-user blacklist (blocked users).
  • For initial visibility, just use visibility on the home instance.

These together reduce global moderation to moderation on a smaller instance and calculations based on existing social interaction.

If you want to get a feeling of how this works, install Freenet and FMS or Sone and just test it yourself. Both are Free Software and available to anyone:
freenetproject.org
FMS
Sone

(Finally typed down while listening to a podcast by techdirt about content moderation)

The Freenet social trust graph

Are trust relationships different in anonymous networks? This article should give you the tools to find out.

Update 2017: Now available from figshare with DOI 10.6084/m9.figshare.4725664

Update 2020: This data was used in Fuzzy Graph Modelling of Anonymous Networks (2018)!

Update 2020-11: Added graph of WoT under attack.

Recently we were asked in the #freenet IRC channel, whether we have a copy of the trust graph in the Web of Trust plugin (which provides service discovery and spam protection). While there is an easy way to get the non-spamming identities directly from the plugin (see wotutil), I decided to take the opportunity to do some Guile hacking: Crawling all the identities to dump a full copy of the trust graph. This also gives us IDs which are marked as spammers, and consequently ignored by the Web of Trust plugin.

So, firstoff, this is how the whole trust graph looks, about 13,000 identities and 250,000 trust relationships, with the size of the nodes showing the analyzed hub-value of the identities and the color showing the Eigenvector Centrality. Many of the nodes overlap, since the graph layouting in Gephi took hours to optimize it.

img

This is the 2020-11-01 graph, likely attackers in red, circles packed by hubbiness with Mike Bostock's Algorithm (also Gephi, but fast):

2020-11-01

I will not investigate all the details here. Instead, the files trust-deduplicated.csv and trust-sone.csv contain anonymized snapshots of the edges in the Web of Trust graph which can be loaded in common graph analysis tools. The first contains all trust values, the second only those which were set by the anonymous social network Sone, which indicates that the user saw at least one message of the other user.

An example of the investigations which can be done with this dataset is the following graph, where I let Gephi split the graph into communities using clustering analysis. The colors indicate the community, while the size of the nodes shows the hub-value and the color of the connections shows the betweenness. This uses the Reingold layout.

img

It’s already visible, that there are communities where the trust connection is realized by only a single node which trusts many others, but that there is also a well-connected center.

The identities in the csv files are given by an index in the list of identities instead of using their key to make it easy for researchers to use the data without having to fear that they might de-anonymize someone with correlation analysis or similar. The index-value depends on the identity files downloaded at

This dataset was created using the following scripts:

Simply execute them in order to get the file trust-anonymized.csv

(the most current version is available from notabug via Git from Bitbucket via Mercurial and from a static clone via Mercurial)

(to run the scripts, you need Guile 2.0.11 or later installed and Freenet running on port 8888. You might have to run them several times to retrieve seldomly accessed identities)

If you use this dataset, for example to investigate social interaction or the effects of anonymity, please drop me a note and reference the Freenet Project and me (Arne Babenhauserheide).

I release the csv files under cc by. If you use my Guile Scheme scripts (with the scm suffix) for research, I hereby grant the additional permission to use them under cc by, too. This should make it easy to comply with releasing your scripts and data as Open Access.

AnhangGröße
trust-deduplicated-force-atlas-hub-centrality.png1.37 MB
trust-sone-reingold.png953.21 KB
trust-sone.csv218.92 KB
trust-deduplicated.csv3.58 MB
crawl-wot.scm8.64 KB
parse-crawled.scm3.35 KB
anonymize-csv.scm3.18 KB
deduplicate-csv.scm1.35 KB
trust-anonymized-2020-11-01-under-attack.csv3.17 MB
attacking-nodes-2020-11-01.csv277 Bytes
2020-11-01-parse-crawled.scm3.35 KB
2020-11-01-crawl-wot.scm9.49 KB
2020-11-01-deduplicate-csv.scm1.35 KB
2020-11-01-anonymize-csv.scm3.47 KB
2020-11-01-graph-attackers-red-hubbiness-circle-pack.png894.42 KB

USK and Date-Hints: Finding the newest version of a site in Freenet's immutable datastore

Freenet provides a global, anonymous datastore where you can upload sites which then work like normal websites. But different from websites, they have a version-number.

The reason for this is, that you can only upload to a given key once1. This data then gets stored in the network and is effectively immutable (much like immutable data structures in functional programming).

In this model conflicts can arise from uploads of different users and from uploads of different versions of the site.

Avoid conflicts between users

So what if Alice uploads the file gpl.txt, and then Mallory tries to upload it again before users get the upload from Alice?

To avoid these conflicts between users, you can upload to an address defined by a key-pair. That key-pair has two keys, a public and a privat one. The URL of the site is derived from the public key. Everyone who has this URL can access the site. The private one allows uploading new data to the site. Only the owner of the private key can upload files to the site. This is the SSK: The Signed Subspace Key. It defines a space in Freenet which only you can update.

An SSK looks like this: SSK@[key]/[sitename]/[path/to/file]

Avoid conflicts between versions

But now what if Alice wants to upload a new version of gpl.txt - say GPLv3?

To avoid conflicts between different versions, each new version gets a unique identifier. The reason for using version numbers and not some other identifier is historical: To update sites despite not being able to rewrite published data, freenet users started to version their sites by simply appending a number to the name and then adding small images for future versions. If these images showed up, the new version existed.2

Most sites in freenet had a section like this (the images might take a bit to load - they are downloaded from a freenet outproxy):

technophob technophob-116technophob technophob-117technophob technophob-118technophob technophob-119

At some point, the freenet developers decided to integrate that function into freenet. They added a new key-type: The Updatable Subspace Key, in short: USK.

A USK looks like this: USK@[key]/[sitename]/[version]/[path/to/file]
(The difference to the SSK is that there is a path-element for the version).

If you enter a USK, freenet automatically checks for newer versions and then shows you the most recent version of the site.

As a practical example:

technophob
technophob

Note that this link will automatically get you to version 117 (or whatever version is the current one when you read this article), even though it has version 116 in its URL.

Internally the USK simply gets translated to an SSK in the form of SSK@[key]/[sitename]-[version]/[path/to/file]. You’ll surely recognize the scheme which is used here.

This is a prime example of demand-driven development: Users found a way to make sites dynamic with the activelink-hack. Then the Freenet developers added this as official feature. As nice side-effect, the activelink-images stayed with us as part of the Freenet Culture: Almost every site in freenet has a small logo with width and height 108x36 (pixels).

Date-Hints

USKs solved the problem of having updatable sites by checking some versions into the future. But they had a limitation: If your USK-Link was very old, freenet would have to check hundreds or even thousands of URLs to find the newest version. And this would naturally be very, very slow. Due to the distributed nature of Freenet, it is also not possible to just list all files under a given Key. You can only check for directories - the sitenames.

Also files in Freenet only stay available when people access them - but checking to see whether some file might still be accessible isn’t a defined problem: The data to that file could be on the computer of someone who is currently offline. When he or she comes online again, the file could suddenly be available, so determining whether a file does not exist isn’t actually possible.

A timeline of versions could look like this:

200920102011201220132014
1,2,34,567,8,9,10,11,12,13,141516,17,18

Now imagine that you find a link on a site which was added in 2010. It would for example link to version 4 of the site. If you access this site in 2014, freenet has to check versions 5,6,7,8...18 to find the most recent version. That requires 13 downloads - and for normal freesites the versions can be as high as 1200.

But remember that you can upload to arbitrary filenames. So what if the author of the site gave you a hint of the first version in 2014? With that, freenet would only have to start at version 16 - just 3 versions to check, and the hint.

Why the first? Remember that files cannot be overwritten, so the author cannot give you the most recent version in 2014.

And this is just what the freenet developers did: Date-Hints are simply files in freenet which contain the information about the most recent version of the site at some point in time.

The datehint keys look like this: SSK@[key]/[sitename]-DATEHINT-[year]

The file found at this key is a simple plain text file with content like the following:

HINT
46
2013-7-5

The first line is the identifier, the second is the most recent version at the time of insert (the first version in the year) and the last is the date of the upload of that version.

A yearly date-hint speeds up getting the most recent version a lot. But since sites in freenet have hundreds of versions rather then tens, it is a bit too coarse. It can still leave you with 20 or 30 possible new versions. So it actually provides additional date hints on a monthly, weekly and daily basis:

  • SSK@[key]/[sitename]-DATEHINT-[year]
  • SSK@[key]/[sitename]-DATEHINT-[year]-WEEK-[week]
  • SSK@[key]/[sitename]-DATEHINT-[year]-[month]
  • SSK@[key]/[sitename]-DATEHINT-[year]-[month]-[day]

If you give freenet a USK-link, it starts on the order of 10 requests: 4 date hints with the current date and requests for versions following the version in the link. Normally it gets a result in under 10 seconds.

The algorithmic cost should be 4 additional inserts per insert, and at least 4 fetches (current year, month, week, day) followed by N fetches (with N the uploads since the last found DATEHINT) to find the most recent version.

In case of strictly periodical uploads N should be capped at the number of uploads per day, or 7 (days per week) or 4 (weeks per month) or 12 (months per year), so Freenet would need to start at most 16 fetches to get the most recent version of a USK.

Conclusion

With USKs and Date-Hints Freenet implements updatable sites with acceptable performance in its anonymous datastore with effectively immutable data.

If you want to see it for yourself, come to freenetproject.org and install freenet. It’s free software and available for Windows, GNU/Linux and MacOSX.


  1. If you try to upload to a given key twice, you can get collisions. In that case, it isn’t clear which data a client will retrieve - similar to race conditions in threaded programs. That’s why we do not write to the same key twice in practice (though there is a key-type which can be used for passwords or simple file-names. It is called KSK and was the first key-type freenet provided. That led to wars on overwriting files like gpl.txt - similar to the edit-wars we nowadays get on Wikipedia, but with real anonymity thrown in ☺). 

AnhangGröße
technophob-activelink.png5.25 KB
freenet-logo.png2.26 KB

What can Freenet do well already?

From the #freenet IRC channel at freenode.net:

toad_1: what can freenet do well already?

  • sharing and retrieving files asynchronously, freemail, IRC2, publishing sites without need of a central server, sharing code repositories

  • I can simply go online, upload a file, send the key to a friend and go offline. the friend can then retrieve the file, even though I am already offline without needing a central server.

  • and nobody can eavesdrop.

  • it might be kinda slow, but it actually makes it easy to publish stuff: via jSite, floghelper and others.

  • floghelper is cool: spam-resistant anonymous blogging without central server

  • and freereader is, too (even though it needs lots of polish): forward RSS feeds into freenet

  • you can actually exchange passwords in a safe way via freemail: anonymous email with an integrated web-interface and imap access.

    • Justus and me coordinated the upload of the social networking site onto my FTP solely over freemail, and I did not have any fear of eavesdropping - different from any other mail I write.

… I think I should store this conversation somewhere

which I hereby did - I hope you enjoyed this little insight into the #freenet channel :)

And if you grew interested, why not install freenet yourself? It only takes a few clicks via webstart and you’re part of the censorship-resistant web.


  1. toad alias Matthew Toseland is the main developer of freenet. He tends to see more of the remaining challenges and fewer of the achievements than me - which is a pretty good trait for someone who builds a system to which we might have to entrust our basic right of free speech if the world goes on like this. From a PR perspective it is a pretty horrible trait, though, because he tends to forget to tell people what freenet can already do well :) 

  2. To setup the social networking features of Freenet, have a look at the social networking guide 

Wrapup: Make Sone scale - fast, anonymous, decentral microblogging over freenet

Sone1 allows fast, identi.ca-style microblogging in Freenet. This is my wrapup on a discussion on the steps to take until Sone can become an integral part of Freenet.

Current state

  • Is close to realtime.

  • Downloads all IDs and all their posts and replies → polling which won’t scale; short term local breakage.

  • Uploads all posts on every update → Can displace lots of content. Effective Size: X*M, X = revisions which did not drop out, M = total number of your messages. Long term self-DDoS of freenet.

Future

  • Is close to realtime for those you follow and your usual discussion group.

  • Uploads only recent posts directly and bundles older posts → much reduced storage need: Effective size: B * Z + Y*M; B = posts per bundle, Z = number of bundles which did not drop out, Y = numbers of not yet bundled messages; Z << Y, B << X, Y << X.

  • Downloads only the ones you follow + ones you get told about. Telling others means that you need to include info about people you follow, because you only get information from them.

Telling others about replies, options

  • Include all replies to anyone which I see in my own Sone → size rises massively, since you include all replies of all people you follow in your own Sone.

  • Include all IDs from which you saw replies along with the people they replied to → needs to poll more IDs. Optionally forward that info for several hops → for efficient routing it needs knowledge about the full follower topology, which is a privacy risk.

  • Discovering replies from people you don’t know yet: Add a WoT info: replies. Updated only when you reply to someone you did not reply to before. Poll people’s reply lists based on their WoT rating. Keep a list of people who answered one of your posts and poll these more often. Maybe poll people instantly who solve one of your captchas (your general captcha queue) → new users can enter quickly. When you solve captchas in WoT, preferably solve those from people you follow.
    → four ways to discover a reply:

    1. poll those you follow,
    2. poll the people who posted the latest replies to you (your usual discussion-group),
    3. poll those who solve one of your captchas (get new people in as fast as possible) and
    4. poll the replies-info from everyone with the polling frequency based on their WoT rating.

  1. You can find Sone in Freenet using the key USK@nwa8lHa271k2QvJ8aa0Ov7IHAV-DFOCFgmDt3X6BpCI,DuQSUZiI~agF8c-6tjsFFGuZ8eICrzWCILB60nT8KKo,AQACAAE/sone/38/ 

follow the blue rabbit

========= blue-rabbit =========
follow the blue rabbit
through the looking glass
to find your real self
========= looking glass =========

pyFreenet 0.4.1 with auto-spawn support in fcpupload

I just put up a new pyFreenet release (github):

If you have Python3 and pip >= 8 you can get it with pip3 install -U --user --egg pyFreenet3. It provides a cleaned up fcpupload script with --spawn support (requires GNU/Linux):

pip3 install -U --user --egg pyFreenet3
echo 1 > testfile
fcpupload --spawn --fcpPort 9486 testfile 

add -p 1 (high prio) and -e (realtime) for higher speed

It creates a Freenet node which listens at port 9486 (except if one already exists there), inserts the testfile, waits until the upload finishes, gives you a CHK link to the file and stops the node afterwards.

Also fcpupload now works again when used with a remote node.

This is tested by doublec, but still has rough edges (For example pip3 install can fail with error: option --single-version-externally-managed not recognized). But it works: people who have Java and Python3 installed on GNU/Linux can now upload files into Freenet without having to worry about Freenet at all — even without ever seeing it.

If you experience problems, please tell me on FMS (in Freenet) on GNU social or on twitter.

This article is also available on my Sharesite in Freenet: random_babcom: pyFreenet 0.4.1 with auto-spawn support in fcpupload

the zen of tolerance

  • You are entitled to voice your opinion.
  • You are not entitled to force it upon everyone.
  • You are not entitled to force it upon a subgroup repeatedly.
  • You are also not entitled to hurl hate towards participants, since that would disrupt communication.
  • If you cannot stay respectful and friendly after being asked to, I will unsee you and advise others to do the same with a clear and brief explanation, so they can take an informed decision.

I will use technical means to realize the zen of tolerance.

Tolerance for intolerance is self-defeating. Continuous disruption of communication is censorship.

Constant outrage disrupts communication. As does constant mocking.

This could also be called the paradox of free speech: your freedom of speech is worth as much as mine. It ends where it impedes on mine. And vice versa.

In Freenet, the decentralized FMS forums and the WebOfTrust plugin implement a technical method which can be used to realize this.

First published on random_babcom, my Freenet Sharesite.

“regarding B.S. like SOPA, PIPA, … freenet seems like a good idea after all!”

“Some years ago, I had a look at freenet and wasn't really convinced, now I'm back - a lot has changed, it grew bigger and insanely fast (in freenet terms), like it a lot, maybe this time I'll keep it. Especially regarding B.S. like SOPA, PIPA and other internet-crippling movements, freenet seems like a good idea after all!”
— sparky in Sone

So, if you know freenet and it did not work out for you in the past, it might be time to give it another try: freenetproject.org

This quote just grabbed me, and sparky gave me permission to cite it.

Freenet: WoT, database error, recovery patch

I just had a database error in WoT (the Freenet generic Web of Trust plugin) and couldn’t access one of my identities anymore (plus I didn’t have a backup of its private keys though it told me to keep backups – talk about carelessness :) ).

I asked p0s on IRC and he helped me patch together a WoT which doesn’t access the context for editing the ID (and in turn misses some functionality). This allowed me to regain my IDs private key and with that redownload my ID from freenet.

I didn’t want that patch rotting on my drive, so I uploaded it here: disable-context-checks-regain-keys.path

Applied to revision 4f84492d277e25618003e0e5a0cb14159a50535d of WoT staging.

Essentially it just comments out some stuff.

AnhangGröße
disable-context-checks-regain-keys.path3.79 KB