Skip to content
This repository has been archived by the owner on Aug 23, 2020. It is now read-only.

Commit

Permalink
Snapshot: added signature
Browse files Browse the repository at this point in the history
  • Loading branch information
Paul D Handy committed Aug 8, 2017
1 parent c23298f commit 9d4abe2
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 6 deletions.
34 changes: 31 additions & 3 deletions src/main/java/com/iota/iri/Snapshot.java
@@ -1,21 +1,25 @@
package com.iota.iri;
import com.iota.iri.hash.Curl;
import com.iota.iri.hash.ISS;
import com.iota.iri.hash.SpongeFactory;
import com.iota.iri.model.Hash;
import com.iota.iri.controllers.TransactionViewModel;
import com.iota.iri.utils.Converter;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;


public class Snapshot {
private static final Logger log = LoggerFactory.getLogger(Snapshot.class);
private static String snapshotPubKey = "BRUTUMFFJVCXEPKHZBKBHWDKARQEYCUVSCUUESJWBSSAMHAWRVHZZGROIIOETMWDKRFODD9NMC9TPOWGD";

public static final Map<Hash, Long> initialState = new HashMap<>();
public static final Snapshot initialSnapshot;
Expand All @@ -25,8 +29,15 @@ public class Snapshot {
InputStream in = Snapshot.class.getResourceAsStream("/Snapshot.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
Curl curl = SpongeFactory.create(SpongeFactory.Mode.KERL);
int[] trit_value;
int[] trits = new int[Curl.HASH_LENGTH*3];
try {
while((line = reader.readLine()) != null) {
trit_value = Converter.trits(Converter.asciiToTrytes(line));
System.arraycopy(trit_value, 0, trits, 0, trit_value.length);
curl.absorb(trits, 0, trits.length);
Arrays.fill(trits, 0);
String[] parts = line.split(":", 2);
if (parts.length >= 2)
{
Expand All @@ -35,6 +46,23 @@ public class Snapshot {
initialState.put(new Hash(key), Long.valueOf(value));
}
}
{ // Check snapshot signature
trits = new int[Curl.HASH_LENGTH];
curl.squeeze(trits, 0, Curl.HASH_LENGTH);
int[] digests = new int[0];
int[] bundle = ISS.normalizedBundle(trits);
int i = 0;
in = Snapshot.class.getResourceAsStream("/Snapshot.sig");
reader = new BufferedReader(new InputStreamReader(in));
while((line = reader.readLine()) != null) {
digests = ArrayUtils.addAll(digests, ISS.digest(SpongeFactory.Mode.KERL, Arrays.copyOfRange(bundle, i*ISS.NORMALIZED_FRAGMENT_LENGTH, (i+1)*ISS.NORMALIZED_FRAGMENT_LENGTH), Converter.trits(line)));
i++;
}

if(!Arrays.equals(Converter.trits(snapshotPubKey), ISS.address(SpongeFactory.Mode.KERL, digests))) {
throw new RuntimeException("Snapshot signature failed.");
}
}
} catch (IOException e) {
System.out.println("Failed to load snapshot.");
System.exit(-1);
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/iota/iri/hash/ISS.java
Expand Up @@ -8,12 +8,13 @@
public class ISS {

public static final int NUMBER_OF_FRAGMENT_CHUNKS = 27;
private static final int FRAGMENT_LENGTH = Curl.HASH_LENGTH * NUMBER_OF_FRAGMENT_CHUNKS;
public static final int FRAGMENT_LENGTH = Curl.HASH_LENGTH * NUMBER_OF_FRAGMENT_CHUNKS;
private static final int NUMBER_OF_SECURITY_LEVELS = 3;

private static final int MIN_TRIT_VALUE = -1, MAX_TRIT_VALUE = 1;
private static final int TRYTE_WIDTH = 3;
public static final int TRYTE_WIDTH = 3;
private static final int MIN_TRYTE_VALUE = -13, MAX_TRYTE_VALUE = 13;
public static final int NORMALIZED_FRAGMENT_LENGTH = Curl.HASH_LENGTH / TRYTE_WIDTH / NUMBER_OF_SECURITY_LEVELS;

public static int[] subseed(SpongeFactory.Mode mode, final int[] seed, int index) {

Expand Down Expand Up @@ -152,7 +153,7 @@ public static int[] normalizedBundle(final int[] bundle) {

public static int[] signatureFragment(SpongeFactory.Mode mode, final int[] normalizedBundleFragment, final int[] keyFragment) {

if (normalizedBundleFragment.length != Curl.HASH_LENGTH / TRYTE_WIDTH / NUMBER_OF_SECURITY_LEVELS) {
if (normalizedBundleFragment.length != NORMALIZED_FRAGMENT_LENGTH) {
throw new RuntimeException("Invalid normalized bundleValidator fragment length: " + normalizedBundleFragment.length);
}
if (keyFragment.length != FRAGMENT_LENGTH) {
Expand Down
3 changes: 3 additions & 0 deletions src/main/resources/Snapshot.sig
@@ -0,0 +1,3 @@
ZXVDDEQ9TOPOCDCVKXG9DSADKBOWKGFKKJAKIXHMKDABOZMDZSDVLUEAJXRXJLMLLHECEJBLCTPWHWMEDBPCCZCOXCLELUGJPIAYVDRUWDW9QYZAEEZDAVHZXSYSRQCZYGPYYFXRYAQOTK9AHKGKOERETBJDIFLKMBRWAHISBODDXM9DYNKYQNBX9AIMYTNVBBFEJTLC9QQBVSHLBGBQWJJPDQZHCKTCLMNYZRGLIOQTADNDC9DQHHTUTT9HPNTVHCQQHRANJCQMZIDMIZPUUZIENWPJZMBDMJXVEAWAEVQAQIXGMAQCU9KERXZGIB9UBTKACHKHNPVLNGEBGGI9NFYCZTSOD9LZFKPIIGIQGQTSQQNONGWRICZHVKFBLHQPT9WSNTPGEROSVAOZRYWTA9OBEV9R9MKBNCOWCRHCBCMODZATWHQAM9MSTVOKWXLB9BIWVBYAVJMFZBWPBBQJUATFNDPARKACZURTCDMFFPCVFDJVHAAIBEHAHZ9TSPZXOZYSWIEBRMDCLUKWKDGOLMDQUBVYKCRBXHWJWPBTLANKOWIOMKKESSXBXTHWJB9WTDGKQJAOEGTW9POLPESINPXVTPWFRQACHGUGAFUMZDYIDPBQN9IQJFTHJRMDCRKFULWLEGRBHOVXYFCFF9CCRYTUKCNYQCRWLXGIGNEHHQQEROUKADJRBBWKGB9FFPEAGFBISTKWCTVZNRBTZITTQZCBWCEQBOVLKRK9QYEWBBDAGSGG9NLIAFLRJPMHTSODKWKWQ9RSZTARIDRKVPMZWXBTVU9IHTWMSUWKMGCNKWCKNNOGLWZLXJFFQUNXGLSJAZSL9IIIBCMFMEPIZLUZMT9SKXHYYYQBJLKGYVIJEVEYOBPSMBZNBRWACUXGTALGBKBREBSNZJOTJFXXFLNJPCUBCBEDWZDYUNNNBBXBGOYAMGQCRYHNDYDAUJDVYR9LDI9XIYYFFVTWAHJBWTIVABG9ROPAFTRKBWNFUFPXNVQEZOZYNTFIJWVYSANMCQML9MZQZBRSXAM9JOQVA9VNQXVH9RDPXCVBRERBSZEMXVZHMFZBKAAPVKHQHTYYOPGFVZBCUXT9QUBXDTVYNUZSPBLOTQXPGCRGXYIGN9VVICTTQZXVMXEUNVQH9KZLM9LJZGBGENDLIGOQDBWOJUTCKFAQLRAAITGGAUSPEFXSPNGBAATECHTBEYPHDPSK9YAMAXYPLZOFLQVYQMBHKMXJRRTOJRSDSTICRPFDPRENYYJUJEMH9PRVEHZBGVYRSXUMATZUZHMCPOUFZLVYYEZOERTOWEE9SXNGFFPZTTCOFVASQ9BUXZKREMHAKY9LZPCKOIKNJCVHFFGRRMOFIREULHQDCJMLLMHXYDUYWRYZBCLGOILJCXRKZMKKCQVB9TNFWHCIKWGTBLLOSX9GMQOOSTITCPV9YKOIJXEEGGUSANSSECICVCBUUOLUUZMTPRJAACEXZ9LRNSTF9THULCVVXBGOYFKNGHAODDTZRRVEIV9WLENUPMVVHHWQQKQHYSKDCADXIYTE9HZOZMWBJZXTCAVMHEQKDGNCQTTVLNEUSJPAPTSOSAHKIAPPUJMPQGQBTKNERITLLWRHFECEYPEYTZFKSLNDHGTD9FYPNCDUPZFVGVUMACIMP9GZQTQBUMYAGRGXNXRIONLMDDQWWGVCIDHRO9CTOWOAXZGA9HUZOLD9KYXOGOOHKPZANVCOWFOJHXCRZPAPEQPIDFHIYSHURFQNJVVJCZBFMMALSXLIXZGLNJ9KSHLSOZCDTFUGHCDRHKRYJMYWTMNTNBXIRAYIWFRNGBLHADWL9NA9DYXVLUHUKEPCFSHATPGII9YXOYSNQLZZIFADHGBVTNCDGFENBDQGAMVFEANRQMUVXKVPMFGJDEFJIEETNKZDWLGASKYWGHELXHCSBZPJECNHUTQQSBODJYOHXWXIRPRCDHCHWOPJHCNFXIHVJRZVVPGYULKCGKDORBSLZKZGQUCGPASMYZVEC9LXQPHEMTIQGYEDZ9KXQRNEFKDAJQVXRKZTMXMKGFONANJKCWLWM9JHJWGXVEIOYGSYLAUQIPOZEVJT9YBOKPCMGZJINFFPBWFPICZJRGS9KOOEANWSTDSZDWTXPPJFTQCDNJXTJGUASXYZPTPWBGRTLJUEYGTMXYKJK9FHFIGJEUQS9PA
QKGICKIZKUWUQLRAKFCJQ9BASZGUSOBRRKUDMXWLAFFOZPZQHBXOKJPJFZSGCHCEQQXEDXFVJAIUDZHNAQBF9UTGIQSNLFVHVMATRDJQDENQIOIKZCGHGPP9CYBNXXIFZOPEAUVTNURZF9PIVTTLIUEBJWSEIZADZWGGAJIYJUKKIQMDQCDPELJDWZKGDRRIHJPFKCOBAJ9DXCMQJ9AHUYUOPWDZBSLEKT9FBZFYVIWWJIVTTZCQOISZNBQMRYZRLIXDMBMOEOH9ILRO9XEJEYLNJ99ARV9J9EENDWFBKPROKJULIRM9PLNP9XLTRGRIRVJCAYDNGFLRXYGAUKOCW9ALIO9GNTYEISX9HTXMZMLSYJBRBNVSLQXHCIYPZOJTFZXUTZXOWMGJMCEFIURVBUDFWBIRFMD9HZHIHZSXFVFPEXJLSHAFDJZYBJDIMPUNTMNCCZURRBZHWUQKAHEFPETFMBYIQ9REXAEUCAUIJJMEBIRPENGKCGFUBNZMDSYTBILKTUNBBXEKYGXHERYSHZC9BFFTU9IJEQHYTZOBCBPVDQPVDWPJHJBTNYAEPXBEJIKVCJMESUONXLFY9ESMAEUWTCIMRZFEDUPSGQRNHSCAHLJZSIEYJCTOFLLWJ9KSSSHSOFI9XUFOTRSWXD99BCZASH9O9YDZMVMVVQSFOWGCABFPTCFQK9GLCTTZGXUUQMRFDLQHYQRAKXOOXDVURMT9CFYCQOHE9YDAZV9YILKHXOKSJENTHVIQJMLLMZVSAOUTXAGIKYS9CLVPCQZDZKLVEFUAFYSPYBCSSCUSVAAJJEFE9INEVZUIGPGPTGZMPDBTFRVDTRTBQNMWTXVIIWADHXG9JOQMSAEODXTFFJFAUXBKFGEFXLAFMJZI9IMGYXCDIFYSAIFPBVPHKDVNEORXXBLXJQQHDH9W9EE9PZE9QQAHNIBHTXTNDJIHLGDFKORIUCWYSQNDUOZTOWGCWNYKR9FBGNCXCEGRQLS9H9XKZM9YPENDFWIYCJORPRMSD9WGAKMEWBUHVPGNNTSZGRHIKWUGCVLDKAUSDZQUXUEJAGLLXOXITJTDOKZKWYIG9QNJMMC9BGIDYROSTCOUWETPEDYMIJPPFTYKRMMVJUOWW9PDVVLYUZBL9LCDOMUWWSQRIOJEMHMVFQOBVUNXQRSQHHVAAMBRMBHJJDFDVAXSHKKRUAQVDHOIRYHWZODBFBWICSLGUFMYQJRITEPBE9BTVIOQIMXJASLLMQOVLSPIXJWYXUBBUCDMDXRHDZWKQPPOHWUXPULBCWSCVVHEUBYVOHKFPTDE9EBRUSZVQSFKMBHXXBBPIZEBZCFXMV9ZQHNZBQRZLZKNCEMDXTBFBKIMUOTUJMKJXXVHGMIJIDAVECPJCCWCMCRYZRHSIDKMURRHRKUG99NZJDZXSBYMGXQBKFVZMCZLHLBMQXLJIJKRBHKEBXCQNOFLTKVCTY9SGTFHTWJGSAVOG9RBLSBPKFLSS9QGODIHQHUW9OB9IEI9PMTQQX9WAEYPZITNPTPUKIDPCSYFNXWGFKNMDMIDRIWM9STPNYE9OJYAC9JHENGHSLTLJHJWHQGKIWYTYWIXOADFOHQOJBLDDPMXZAGCPPAFGLYSZLJDZACCWVNKWG9QBWPXOIADTUMUYPAFYHXSTAPSJCFBSOVEQAOXVRVQ9QAAJUIKZCCYWYYAYJIPADWYKSJWUNQYPSGZMRQGYBUROUVHGJCLQBPILUDWH9IHAKMDEEJTMFZPWWFQEOQQORMMPNKCBM9MDCYHPNRDPQJCWCATWWYKSJYGPIIALYZJKQZYI9WMMUZOHTPEEOWBTMMAQHXDFWXJU9ZDEHIHPAEVUQATKRZS9MXKKHQHALUROSPWKJCMXFQXCNRZULRKIMDBEJBDOOWLRNLDJGLYBLQHRKJBZGGV9XELBRBYKXDNRAD9PPVTCGRM9NPHDLDMJOSDGPNDAFEIABHLRLEUIMD9UJVWAKZRHZIJMGMPNVNCEXBHWFKYIMVCPEAJ9AQVWAUVGSCDGXCFAOZETLOKNBCPWTKUCD9MNOGKUJVFZACVY9RSS9KJTELUZPYJFYPQHJCRZI9GMRCNXHKSTWUZRRVWBRQ9GSFRYRRCDJWGDFRUXPRMZYAY9AQWCATTJBQFQBECNMCSCASBNLTDJYQQCNSAZ9DXCBWNBNC
LIMDUDEGNMNPBSTPAHDXZSCJVQBPAUY9TVWEYNESFJSW9XBEURZTDRODT9QBPUCDXMBRX9LECRARFVKMBUZIJLTPDKPYDUUVUZVYEGZ9EUHNWNUADVMJZRQGVMKGPWMQQSIZXJNVVFXOUNHMOVRS9BOWJNB9CBPTBCZAHZBQYQYJQLAZF9PLINYXCWZDODLWAQUGLDOWZYBZTLZQJ9WQFG9ZJUPIDGCQONQLS9FZBYPQZPPOZRWYYOGQIIQMBIXDTULIUUDHOFCAUJRACMKITCMXSPOOPSNVKODDWAFNT9AHKFKPBFUPSUJVTXSQMJAHPRUCZUIPBAKCYOSBM9DQNLTOZBNIXDTEX9MHF9ZLGKSAFETXESLFJFORAVKNUSMUUDKWPNBLREQ9CZIB9WHUW9FFTIKEVUYUXLFJEJKTZZLZJLQLSNVGSVDAZHZEVPMVPJYSOT9ZUMJEHGVZWGVCKRDU9MSMXCHMHIQGGDTDLLJECKFSVQWGLAAQVNGQYHUSEKQBKAWCSSQGXWMJQWAFRUKYVDHPBPHRQNQYAPGMDVZUQOCVRU9GDRZRCZHJITNCYWQKRYTYSOC9VBYAHYOVUJZ9LLIRI9RHGYJKITPWWISXXUOVYDKABROHYQOPYFORFYLEYXKA9GVEUOSGHDHJEKFPZQAGKTCGEFLWRWUVJQXR9UGXSDGWENEUL9TKZFDVEJR99UIWJENQMDUWTBDDNPAWDXMUUPXDJNWWNTPASCXWEYURYEOKHAUDNGBOCRGBLHSWCFMEJHAXMVCTOYJNEZUYNDWAJP99DMY9WGOAGZJHITOSUVTJFYFEPJSBFTCCQ9P9GHLBVIVOYEVTQFLYLMKSZEVLXPXHZILPQFJKBFVUF9UKFYMHEYNWLRXJTZKFMUJCUNYPBUIUWVQRNNHYYDFHMLWIIESNZP9OGEPYBRNBKDSBQYZOHGJWWZYYFWXHXVT9AIJHQTLWRAG9JBGRCIFPPMQIAQXEGTXXDDHUFJC9AIFUMTMCHHTL9CSGNWCOPAIFKLOJJJBAQBNSRFWIJITLQURRCUGSZCOOVOJRBCGOCLOETRFNUK9CNSFRYGLSQZIJNMLFBFORHUNPDKQ9AYMENLSOETVKWVHYJOWBOWSNXDEJAVKTCNGGFTHJNDNLEHFSICPX9MKEHXTSQNFQNMXYG9ZSNBLHK9PZCKQIG9GOVCLRADWSFWAOJBPU9ODGNIVQBPYJPMQKTHWZLTZJHDLBRJVJDTTJZETWTIDWIQWBXMGKRPIR9AQMFTWE9KIVSWZBRWIOWBXNYQSWUGK9KSEEBWGNPGEWFRR9PJIWNNPJZSEGLDJZWWWFPSOZBXDZJFWEOORJPD9SG9VHVVVWHCLMESAYXCVHATZKGAJMW9BPONYFAQLIRCFSWIPPMWNFECBLPETXRUOSDBTPGE9XGDJVCYNDGIIOAWPMZHBYHWCDX9GB99PI9NITVUTXBHXMOGDOK9VTSMRDYTDTGRC9BORZXFOXZK9ELMAMILNLNBMIGRQJCTVPFNQOCJYTXPQRWPZK9OLOWASWYKHPMEVICBKRFNQCBRQYWFVYFBH9AOGZPC9PYAZXGYXODDAMGVHPMHOBPZSIMPHAPWQKYPWBEKQJBNNJNDQHXOXYBADSFXYYHIIUDPUYOGYAKIJOCOJQNJGAKSFEKNEUUVYVKFNSVJOEKUZVVRHUXUEVDXYL9RLMWMERDHBJ9TCYTYDNBLANLWNBJMULFTPPSHSUESNEDNF9XVBB9RXWYNEPCW99KVIJISUMNUXOLCXPMBGDSHUTJDCSMSXKMGQFWFTWWQAXZFCBNAKY9TNJSP9DLLQGAAHRJIZKSVRLBQHURG9RJIERVZVDQBWSUGEXPJTOIOXMTPYTOLNIOQ9DRZCVFKAZATVU9JFZFJXEPMS9PVTHQVTKMHNPBIOVZNMJQWKDKJQUFEPADTT9ACI9TQTK9OAXBNAKZTOUDCJGKQWKGWPWCJVJGYLWMNXAAXYHUWN9GKVYNLFWQKNCXY99SKUNSYZOBBAUBDHKBSPZDRWKVAYMUKY9IQWDNHF99TMNVOKPFRCZZOH9YWBRFZLJHBX9SXBBYBGYMGJYK9U9TBZQXXMECJ9RTXYMUPVUYENXYQNZGCGEKYBKHJGHOU9LNQYRALJSGMJVZ9TDZNKJFNWBAW99CZEYKSO9VAN9UZC

0 comments on commit 9d4abe2

Please sign in to comment.