mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
Scribunto: Add HashLibrary [#589]
This commit is contained in:
@@ -1,145 +0,0 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
import java.math.BigInteger;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import gplx.core.consoles.*; import gplx.core.ios.streams.*; /*IoStream*/
|
||||
import gplx.core.texts.*; /*Base32Converter*/ import gplx.core.progs.*;
|
||||
public class Hash_algo_ {
|
||||
public static Hash_algo New__md5() {return new Hash_algo__md5();}
|
||||
public static Hash_algo New__sha1() {return new Hash_algo__sha1();}
|
||||
public static Hash_algo New__sha2_256() {return new Hash_algo__sha2_256();}
|
||||
public static Hash_algo New__tth_192() {return new Hash_algo__tth_192();}
|
||||
public static Hash_algo New_by_tid(byte tid) {
|
||||
switch (tid) {
|
||||
case Tid__md5: return New__md5();
|
||||
case Tid__sha1: return New__sha1();
|
||||
case Tid__sha2_256: return New__sha2_256();
|
||||
case Tid__tth_192: return New__tth_192();
|
||||
default: throw Err_.new_unhandled_default(tid);
|
||||
}
|
||||
}
|
||||
public static Hash_algo New(String key) {
|
||||
if (key == Hash_algo__md5.KEY) return New__md5();
|
||||
else if (key == Hash_algo__sha1.KEY) return New__sha1();
|
||||
else if (key == Hash_algo__sha2_256.KEY) return New__sha2_256();
|
||||
else if (key == Hash_algo__tth_192.KEY) return New__tth_192();
|
||||
else throw Err_.new_unhandled(key);
|
||||
}
|
||||
public static final byte Tid__md5 = 0, Tid__sha1 = 1, Tid__sha2_256 = 2, Tid__tth_192 = 3;
|
||||
}
|
||||
abstract class Hash_algo_base implements Hash_algo {
|
||||
private final MessageDigest md;
|
||||
private final byte[] trg_bry;
|
||||
private byte[] tmp_bfr; private final int tmp_bfr_len = 4096;
|
||||
public Hash_algo_base(MessageDigest md, int trg_bry_len) {
|
||||
this.md = md; this.trg_bry = new byte[trg_bry_len];
|
||||
}
|
||||
public String Hash_bry_as_str(byte[] src) {return String_.new_a7(Hash_bry_as_bry(src));}
|
||||
public byte[] Hash_bry_as_bry(byte[] src) {
|
||||
Hash_algo_utl_.Hash_bry(md, src, src.length, trg_bry);
|
||||
return Bry_.Copy(trg_bry); // NOTE: must copy to return different instances to callers; else callers may hash same instance with different values
|
||||
}
|
||||
public String Hash_stream_as_str(Console_adp console, IoStream stream) {return String_.new_a7(Hash_stream_as_bry(console, stream));}
|
||||
public byte[] Hash_stream_as_bry(Console_adp console, IoStream stream) {
|
||||
if (tmp_bfr == null) tmp_bfr = new byte[4096];
|
||||
Hash_algo_utl_.Hash_stream(console, stream, md, tmp_bfr, tmp_bfr_len, trg_bry);
|
||||
return trg_bry;
|
||||
}
|
||||
public byte[] Hash_stream_as_bry(Gfo_prog_ui prog_ui, IoStream stream) {
|
||||
if (tmp_bfr == null) tmp_bfr = new byte[4096];
|
||||
Hash_algo_utl_.Hash_stream(prog_ui, stream, md, tmp_bfr, tmp_bfr_len, trg_bry);
|
||||
return trg_bry;
|
||||
}
|
||||
protected static MessageDigest Get_message_digest(String key) {
|
||||
try {return MessageDigest.getInstance(key);}
|
||||
catch (NoSuchAlgorithmException e) {throw Err_.new_missing_key(key);}
|
||||
}
|
||||
}
|
||||
class Hash_algo__md5 extends Hash_algo_base {
|
||||
public Hash_algo__md5() {super(Get_message_digest_instance(), 32);}
|
||||
public String Key() {return KEY;} public static final String KEY = "md5";
|
||||
|
||||
private static MessageDigest Get_message_digest_instance() {
|
||||
if (md__md5 == null)
|
||||
md__md5 = Get_message_digest(KEY);
|
||||
return md__md5;
|
||||
} private static MessageDigest md__md5;
|
||||
}
|
||||
class Hash_algo__sha1 extends Hash_algo_base {
|
||||
public Hash_algo__sha1() {super(Get_message_digest_instance(), 40);}
|
||||
public String Key() {return KEY;} public static final String KEY = "sha1";
|
||||
|
||||
private static MessageDigest Get_message_digest_instance() {
|
||||
if (md__sha1 == null)
|
||||
md__sha1 = Get_message_digest(KEY);
|
||||
return md__sha1;
|
||||
} private static MessageDigest md__sha1;
|
||||
}
|
||||
class Hash_algo__sha2_256 extends Hash_algo_base {
|
||||
public Hash_algo__sha2_256() {super(Get_message_digest_instance(), 64);}
|
||||
public String Key() {return KEY;} public static final String KEY = "sha-256";
|
||||
|
||||
private static MessageDigest Get_message_digest_instance() {
|
||||
if (md__sha2_256 == null)
|
||||
md__sha2_256 = Get_message_digest(KEY);
|
||||
return md__sha2_256;
|
||||
} private static MessageDigest md__sha2_256;
|
||||
}
|
||||
class Hash_algo_utl_ {
|
||||
public static void Hash_bry(MessageDigest md, byte[] src_bry, int src_len, byte[] trg_bry) {
|
||||
int pos = 0;
|
||||
while (true) {
|
||||
if (pos == src_len) break;
|
||||
int len = 4096;
|
||||
if (pos + len > src_len) {
|
||||
len = src_len - pos;
|
||||
}
|
||||
md.update(src_bry, pos, len);
|
||||
pos += len;
|
||||
}
|
||||
byte[] md_bry = md.digest();
|
||||
gplx.core.encoders.Hex_utl_.Encode_bry(md_bry, trg_bry);
|
||||
}
|
||||
public static void Hash_stream(Console_adp dialog, IoStream stream, MessageDigest md, byte[] tmp_bfr, int tmp_bfr_len, byte[] trg_bry) {
|
||||
// long pos = 0, len = stream.Len(); // pos and len must be long, else will not hash files > 2 GB
|
||||
while (true) {
|
||||
int read = stream.Read(tmp_bfr, 0, tmp_bfr_len); // read stream into tmp_bfr
|
||||
if (read < 1) break;
|
||||
md.update(tmp_bfr, 0, read);
|
||||
// pos += read;
|
||||
}
|
||||
byte[] md_bry = md.digest();
|
||||
gplx.core.encoders.Hex_utl_.Encode_bry(md_bry , trg_bry);
|
||||
}
|
||||
public static void Hash_stream(Gfo_prog_ui prog_ui, IoStream stream, MessageDigest md, byte[] tmp_bfr, int tmp_bfr_len, byte[] trg_bry) {
|
||||
long pos = prog_ui.Prog_data_cur(), len = prog_ui.Prog_data_end(); // pos and len must be long, else will not hash files > 2 GB
|
||||
try {
|
||||
while (true) {
|
||||
int read = stream.Read(tmp_bfr, 0, tmp_bfr_len); // read stream into tmp_bfr
|
||||
if (read < 1) break;
|
||||
md.update(tmp_bfr, 0, read);
|
||||
if (prog_ui.Prog_notify_and_chk_if_suspended(pos, len)) return;
|
||||
pos += read;
|
||||
}
|
||||
}
|
||||
finally {stream.Rls();}
|
||||
byte[] md_bry = md.digest();
|
||||
gplx.core.encoders.Hex_utl_.Encode_bry(md_bry , trg_bry);
|
||||
}
|
||||
public static String To_base_32_str(byte[] ary) {return Base32Converter.Encode(ary);}
|
||||
}
|
||||
66
100_core/src/gplx/core/security/Security_utl_.java
Normal file
66
100_core/src/gplx/core/security/Security_utl_.java
Normal file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.Provider;
|
||||
import java.security.Security;
|
||||
import java.security.Provider.Service;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
public class Security_utl_ {
|
||||
private static final void List_algos(Provider prov, Class<?> typeClass) {
|
||||
String type = typeClass.getSimpleName();
|
||||
|
||||
List<Service> algos = new ArrayList<Service>();
|
||||
|
||||
Set<Service> services = prov.getServices();
|
||||
for (Service service : services) {
|
||||
if (service.getType().equalsIgnoreCase(type)) {
|
||||
algos.add(service);
|
||||
}
|
||||
}
|
||||
|
||||
if (!algos.isEmpty()) {
|
||||
System.out.printf(" --- Provider %s, version %.2f --- %n", prov.getName(), prov.getVersion());
|
||||
for (Service service : algos) {
|
||||
String algo = service.getAlgorithm();
|
||||
System.out.printf("Algorithm name: \"%s\"%n", algo);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// --- find aliases (inefficiently)
|
||||
Set<Object> keys = prov.keySet();
|
||||
for (Object key : keys) {
|
||||
final String prefix = "Alg.Alias." + type + ".";
|
||||
if (key.toString().startsWith(prefix)) {
|
||||
String value = prov.get(key.toString()).toString();
|
||||
System.out.printf("Alias: \"%s\" -> \"%s\"%n",
|
||||
key.toString().substring(prefix.length()),
|
||||
value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
Provider[] providers = Security.getProviders();
|
||||
for (Provider provider : providers) {
|
||||
List_algos(provider, MessageDigest.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,11 +13,10 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
public interface Hash_algo {
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
public interface Hash_algo {// THREAD.UNSAFE
|
||||
String Key();
|
||||
byte[] Hash_bry_as_bry(byte[] src);
|
||||
String Hash_bry_as_str(byte[] src);
|
||||
String Hash_stream_as_str(gplx.core.consoles.Console_adp console, gplx.core.ios.streams.IoStream src_stream);
|
||||
byte[] Hash_stream_as_bry(gplx.core.progs.Gfo_prog_ui prog_ui, gplx.core.ios.streams.IoStream src_stream);
|
||||
void Update_digest(byte[] src, int bgn, int end);
|
||||
byte[] To_hash_bry();
|
||||
Hash_algo Clone_hash_algo(); // factory method; note that MessageDigest's are member variables, so always create a new instance
|
||||
}
|
||||
41
100_core/src/gplx/core/security/algos/Hash_algo_.java
Normal file
41
100_core/src/gplx/core/security/algos/Hash_algo_.java
Normal file
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
import gplx.core.consoles.*; import gplx.core.ios.streams.*; /*IoStream*/
|
||||
import gplx.core.security.algos.jre.*; import gplx.core.security.algos.gplx_crypto.*;
|
||||
public class Hash_algo_ {
|
||||
public static Hash_algo New__md5() {return Jre_hash_factory.Instance.New_hash_algo(Jre_hash_factory.Key__md5);}
|
||||
public static Hash_algo New__sha1() {return Jre_hash_factory.Instance.New_hash_algo(Jre_hash_factory.Key__sha1);}
|
||||
public static Hash_algo New__sha2_256() {return Jre_hash_factory.Instance.New_hash_algo(Jre_hash_factory.Key__sha2_256);}
|
||||
public static Hash_algo New__tth_192() {return new Hash_algo__tth_192();}
|
||||
public static Hash_algo New_by_tid(byte tid) {
|
||||
switch (tid) {
|
||||
case Tid__md5: return New__md5();
|
||||
case Tid__sha1: return New__sha1();
|
||||
case Tid__sha2_256: return New__sha2_256();
|
||||
case Tid__tth_192: return New__tth_192();
|
||||
default: throw Err_.new_unhandled_default(tid);
|
||||
}
|
||||
}
|
||||
public static Hash_algo New(String key) {
|
||||
if (key == Jre_hash_factory.Key__md5) return New__md5();
|
||||
else if (key == Jre_hash_factory.Key__sha1) return New__sha1();
|
||||
else if (key == Jre_hash_factory.Key__sha2_256) return New__sha2_256();
|
||||
else if (key == Hash_algo__tth_192.KEY) return New__tth_192();
|
||||
else throw Err_.new_unhandled(key);
|
||||
}
|
||||
public static final byte Tid__md5 = 0, Tid__sha1 = 1, Tid__sha2_256 = 2, Tid__tth_192 = 3;
|
||||
}
|
||||
24
100_core/src/gplx/core/security/algos/Hash_algo__fxt.java
Normal file
24
100_core/src/gplx/core/security/algos/Hash_algo__fxt.java
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
public class Hash_algo__fxt {
|
||||
private final Hash_algo algo;
|
||||
public Hash_algo__fxt(Hash_algo algo) {this.algo = algo;}
|
||||
public void Test__hash(String expd, String raw) {
|
||||
Tfds.Eq(expd, Hash_algo_utl.Calc_hash_as_str(algo, Bry_.new_u8(raw)));
|
||||
Tfds.Eq(expd, Hash_algo_utl.Calc_hash_w_prog_as_str(algo, gplx.core.ios.streams.IoStream_.mem_txt_(Io_url_.Empty, raw), gplx.core.consoles.Console_adp_.Noop));
|
||||
}
|
||||
}
|
||||
19
100_core/src/gplx/core/security/algos/Hash_algo_factory.java
Normal file
19
100_core/src/gplx/core/security/algos/Hash_algo_factory.java
Normal file
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
public interface Hash_algo_factory {
|
||||
Hash_algo New_hash_algo(String key);
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
public class Hash_algo_factory__composite implements Hash_algo_factory {
|
||||
private boolean dirty = true;
|
||||
private final Ordered_hash hash = Ordered_hash_.New();
|
||||
private String[] algo_keys;
|
||||
public String[] Algo_keys() {
|
||||
if (dirty) {
|
||||
dirty = false;
|
||||
int len = hash.Len();
|
||||
algo_keys = new String[len];
|
||||
for (int i = 0; i < len; i++) {
|
||||
algo_keys[i] = ((Hash_algo)hash.Get_at(i)).Key();
|
||||
}
|
||||
}
|
||||
return algo_keys;
|
||||
}
|
||||
public Hash_algo New_hash_algo(String key) {
|
||||
Hash_algo rv = (Hash_algo)hash.Get_by(key);
|
||||
if (rv == null) {
|
||||
throw Err_.new_wo_type("hash_algo unknown; key=" + key);
|
||||
}
|
||||
return rv.Clone_hash_algo();
|
||||
}
|
||||
|
||||
public Hash_algo_factory__composite Reg_many(Hash_algo_factory factory, String... algo_keys) {
|
||||
dirty = true;
|
||||
for (String algo_key : algo_keys) {
|
||||
if (hash.Has(algo_key)) {
|
||||
throw Err_.new_wo_type("hash_algo already registered; key=" + algo_key);
|
||||
}
|
||||
hash.Add(algo_key, factory.New_hash_algo(algo_key));
|
||||
}
|
||||
return this;
|
||||
}
|
||||
public Hash_algo_factory__composite Reg_one(Hash_algo_factory factory, String src_key, String trg_key) {
|
||||
if (hash.Has(trg_key)) {
|
||||
throw Err_.new_wo_type("hash_algo already registered; name=" + trg_key);
|
||||
}
|
||||
hash.Add(trg_key, factory.New_hash_algo(src_key));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
59
100_core/src/gplx/core/security/algos/Hash_algo_utl.java
Normal file
59
100_core/src/gplx/core/security/algos/Hash_algo_utl.java
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
import gplx.core.consoles.*; import gplx.core.progs.*; import gplx.core.ios.streams.*;
|
||||
import gplx.core.encoders.*;
|
||||
public class Hash_algo_utl {
|
||||
public static String Calc_hash_as_str(Hash_algo algo, byte[] bry) {return String_.new_u8(Calc_hash_as_bry(algo, bry));}
|
||||
public static byte[] Calc_hash_as_bry(Hash_algo algo, byte[] bry) {
|
||||
if (Type_.Is_assignable_from_by_obj(algo, Hash_algo_w_prog.class)) {
|
||||
Hash_algo_w_prog algo_w_prog = (Hash_algo_w_prog)algo;
|
||||
return Bry_.new_u8(algo_w_prog.Calc_hash_w_prog_as_str(IoStream_.ary_(bry), Console_adp_.Noop));
|
||||
}
|
||||
|
||||
algo.Update_digest(bry, 0, bry.length);
|
||||
return algo.To_hash_bry();
|
||||
}
|
||||
public static String Calc_hash_w_prog_as_str(Hash_algo algo, IoStream stream, Console_adp console) {return String_.new_u8(Calc_hash_w_prog_as_bry(algo, stream, console));}
|
||||
public static byte[] Calc_hash_w_prog_as_bry(Hash_algo algo, IoStream stream, Console_adp console) {
|
||||
if (Type_.Is_assignable_from_by_obj(algo, Hash_algo_w_prog.class)) {
|
||||
Hash_algo_w_prog algo_w_prog = (Hash_algo_w_prog)algo;
|
||||
return Bry_.new_u8(algo_w_prog.Calc_hash_w_prog_as_str(stream, console));
|
||||
}
|
||||
return Calc_hash_w_prog_as_bry(algo, stream, Gfo_prog_ui_.Noop);
|
||||
}
|
||||
public static byte[] Calc_hash_w_prog_as_bry(Hash_algo algo, IoStream stream, Gfo_prog_ui prog_ui) {
|
||||
int tmp_bry_len = 4096;
|
||||
byte[] tmp_bry = new byte[4096];
|
||||
|
||||
// pos and len must be long, else will not hash files > 2 GB
|
||||
long pos = prog_ui.Prog_data_cur();
|
||||
long len = prog_ui.Prog_data_end();
|
||||
|
||||
try {
|
||||
while (true) {
|
||||
int read = stream.Read(tmp_bry, 0, tmp_bry_len); // read stream into tmp_bry
|
||||
if (read < 1) break;
|
||||
algo.Update_digest(tmp_bry, 0, read);
|
||||
if (prog_ui.Prog_notify_and_chk_if_suspended(pos, len)) return null;
|
||||
pos += read;
|
||||
}
|
||||
}
|
||||
finally {stream.Rls();}
|
||||
byte[] rv = algo.To_hash_bry();
|
||||
return rv;
|
||||
}
|
||||
}
|
||||
20
100_core/src/gplx/core/security/algos/Hash_algo_w_prog.java
Normal file
20
100_core/src/gplx/core/security/algos/Hash_algo_w_prog.java
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos; import gplx.*; import gplx.core.*; import gplx.core.security.*;
|
||||
import gplx.core.consoles.*; import gplx.core.ios.streams.*;
|
||||
public interface Hash_algo_w_prog {
|
||||
String Calc_hash_w_prog_as_str(IoStream stream, Console_adp console);
|
||||
}
|
||||
@@ -13,16 +13,16 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.gplx_crypto; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import gplx.core.consoles.*; import gplx.core.ios.streams.*; /*IoStream*/
|
||||
import gplx.core.progs.*;
|
||||
public class Hash_algo__tth_192 implements Hash_algo {
|
||||
public class Hash_algo__tth_192 implements Hash_algo, Hash_algo_w_prog {
|
||||
public String Key() {return KEY;} public static final String KEY = "tth192";
|
||||
public Hash_algo Clone_hash_algo() {return new Hash_algo__tth_192();}
|
||||
public int BlockSize() {return blockSize;} public void BlockSize_set(int v) {blockSize = v;} int blockSize = 1024;
|
||||
public String Hash_bry_as_str(byte[] src) {return String_.new_a7(Hash_bry_as_bry(src));}
|
||||
public byte[] Hash_bry_as_bry(byte[] v) {return Bry_.new_a7(Hash_stream_as_str(Console_adp_.Noop, gplx.core.ios.streams.IoStream_.ary_(v)));}
|
||||
public byte[] Hash_stream_as_bry(Gfo_prog_ui prog_ui, IoStream stream) {return Bry_.new_a7(Hash_stream_as_str(Console_adp_.Noop, stream));}
|
||||
public String Hash_stream_as_str(Console_adp dialog, IoStream stream) {
|
||||
public void Update_digest(byte[] src, int bgn, int end) {throw Err_.new_unimplemented();}
|
||||
public byte[] To_hash_bry() {throw Err_.new_unimplemented();}
|
||||
public String Calc_hash_w_prog_as_str(IoStream stream, Console_adp dialog) {
|
||||
int leafCount = (int)(stream.Len() / blockSize);
|
||||
HashDlgWtr dialogWtr = HashDlgWtr_.Current;
|
||||
dialogWtr.Bgn(dialog, stream.Url(), CalcWorkUnits(stream.Len()));
|
||||
@@ -35,7 +35,7 @@ public class Hash_algo__tth_192 implements Hash_algo {
|
||||
hashMainCount = 0;
|
||||
HashAllBytes(dialogWtr, stream, leafCount);
|
||||
byte[] rv = HashAllHashes(dialogWtr);
|
||||
return Hash_algo_utl_.To_base_32_str(rv);
|
||||
return gplx.core.texts.Base32Converter.Encode(rv);
|
||||
}
|
||||
byte[] CalcHash_next(IoStream stream) {
|
||||
if (blockA == null || blockA.length != blockSize) blockA = new byte[blockSize];
|
||||
@@ -13,7 +13,7 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.gplx_crypto; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*; import gplx.core.consoles.*; import gplx.core.ios.*; /*IoStream*/
|
||||
public class Hash_algo__tth_192__tst { // REF: http://open-content.net/specs/draft-jchapweske-thex-02.html; DC++ 0.698
|
||||
private final Hash_algo__fxt fxt = new Hash_algo__fxt(Hash_algo_.New__tth_192());
|
||||
@@ -13,7 +13,7 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.gplx_crypto; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*;
|
||||
public class Hash_algo__tth_192_tree_tst {
|
||||
@Test public void CalcRecursiveHalves() {
|
||||
@@ -13,27 +13,33 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.gplx_crypto; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*; import gplx.core.consoles.*; import gplx.core.ios.streams.*; /*IoStream*/
|
||||
public class Hash_console_wtr_tst {
|
||||
@Before public void setup() {
|
||||
Hash_algo__tth_192 algo = new Hash_algo__tth_192();
|
||||
algo.BlockSize_set(10);
|
||||
calc = algo;
|
||||
}
|
||||
private final Hash_console_wtr_fxt fxt = new Hash_console_wtr_fxt();
|
||||
@Test public void Basic() {
|
||||
tst_Status(10, stringAry_(" - hash: 100%"));
|
||||
tst_Status(11, stringAry_(" - hash: 66%"));
|
||||
tst_Status(30, stringAry_(" - hash: 40%", " - hash: 60%", " - hash: 100%"));
|
||||
fxt.Test__Status(10, " - hash: 100%");
|
||||
fxt.Test__Status(11, " - hash: 66%");
|
||||
fxt.Test__Status(30, " - hash: 40%", " - hash: 60%", " - hash: 100%");
|
||||
}
|
||||
void tst_Status(int count, String[] expdWritten) {
|
||||
Console_adp__mem dialog = Console_adp_.Dev();
|
||||
}
|
||||
class Hash_console_wtr_fxt {
|
||||
private Hash_algo__tth_192 algo;
|
||||
public Hash_console_wtr_fxt() {
|
||||
this.algo = new Hash_algo__tth_192();
|
||||
algo.BlockSize_set(10);
|
||||
}
|
||||
public void Test__Status(int count, String... expd) {
|
||||
// init
|
||||
Console_adp__mem console = Console_adp_.Dev();
|
||||
|
||||
// exec
|
||||
String data = String_.Repeat("A", count);
|
||||
IoStream stream = IoStream_.mem_txt_(Io_url_.Empty, data);
|
||||
calc.Hash_stream_as_str(dialog, stream);
|
||||
String[] actlWritten = dialog.Written().To_str_ary();
|
||||
Tfds.Eq_ary(actlWritten, expdWritten);
|
||||
algo.Calc_hash_w_prog_as_str(stream, console);
|
||||
|
||||
// test
|
||||
String[] actl = console.Written().To_str_ary();
|
||||
Tfds.Eq_ary(actl, expd);
|
||||
}
|
||||
String[] stringAry_(String... ary) {return ary;}
|
||||
Hash_algo calc;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import java.util.zip.Checksum;
|
||||
public class Jre_checksum_algo implements Hash_algo {
|
||||
private final Jre_checksum_factory factory;
|
||||
private final Checksum checksum;
|
||||
public Jre_checksum_algo(Jre_checksum_factory factory, String key) {
|
||||
this.factory = factory;
|
||||
this.key = key;
|
||||
this.checksum = factory.New_Checksum(key);
|
||||
}
|
||||
public String Key() {return key;} private final String key;
|
||||
public Hash_algo Clone_hash_algo() {return new Jre_checksum_algo(factory, key);}
|
||||
public void Update_digest(byte[] bry, int bgn, int end) {checksum.update(bry, bgn, end - bgn);}
|
||||
public byte[] To_hash_bry() {
|
||||
long val = checksum.getValue();
|
||||
String rv = Long.toHexString(val);
|
||||
return Bry_.new_u8(rv.length() < 8 ? String_.PadBgn(rv, 8, "0") : rv);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import java.util.zip.CRC32;
|
||||
import java.util.zip.Checksum;
|
||||
import java.util.zip.Adler32;
|
||||
public class Jre_checksum_factory implements Hash_algo_factory {
|
||||
public Hash_algo New_hash_algo(String key) {
|
||||
return new Jre_checksum_algo(this, key);
|
||||
}
|
||||
|
||||
public Checksum New_Checksum(String key) {
|
||||
if (String_.Eq(key, Key__adler32)) return new Adler32();
|
||||
else if (String_.Eq(key, Key__crc32)) return new CRC32();
|
||||
else throw Err_.new_unhandled(key);
|
||||
}
|
||||
|
||||
public static String
|
||||
Key__adler32 = "adler32", Key__crc32 = "crc32"
|
||||
;
|
||||
public static final Jre_checksum_factory Instance = new Jre_checksum_factory(); Jre_checksum_factory() {}
|
||||
}
|
||||
33
100_core/src/gplx/core/security/algos/jre/Jre_hash_algo.java
Normal file
33
100_core/src/gplx/core/security/algos/jre/Jre_hash_algo.java
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import java.security.MessageDigest;
|
||||
public class Jre_hash_algo implements Hash_algo {
|
||||
private final Jre_hash_factory factory;
|
||||
private final MessageDigest md;
|
||||
public Jre_hash_algo(Jre_hash_factory factory, String key) {
|
||||
this.factory = factory;
|
||||
this.key = key;
|
||||
this.md = factory.New_algo_under(key);
|
||||
}
|
||||
public String Key() {return key;} private final String key;
|
||||
public Hash_algo Clone_hash_algo() {return new Jre_hash_algo(factory, key);}
|
||||
public void Update_digest(byte[] bry, int bgn, int end) {md.update(bry, bgn, end - bgn);}
|
||||
public byte[] To_hash_bry() {
|
||||
byte[] md_bry = md.digest();
|
||||
return gplx.core.encoders.Hex_utl_.Encode_bry(md_bry);
|
||||
}
|
||||
}
|
||||
@@ -13,9 +13,9 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*;
|
||||
public class Hash_algo__md5__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/hash/md5/Md5-128.unverified.test-vectors
|
||||
public class Jre_hash_algo__md5__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/hash/md5/Md5-128.unverified.test-vectors
|
||||
private final Hash_algo__fxt fxt = new Hash_algo__fxt(Hash_algo_.New__md5());
|
||||
@Test public void Empty() {fxt.Test__hash("d41d8cd98f00b204e9800998ecf8427e", "");}
|
||||
@Test public void a() {fxt.Test__hash("0cc175b9c0f1b6a831c399e269772661", "a");}
|
||||
@@ -29,11 +29,3 @@ public class Hash_algo__md5__tst { // REF: https://www.cosic.esat.kuleuven.be/ne
|
||||
//@Test
|
||||
public void A__x_1million() {fxt.Test__hash("7707d6ae4e027c70eea2a935c2296f21", String_.Repeat("a", 1000000));}
|
||||
}
|
||||
class Hash_algo__fxt {
|
||||
private final Hash_algo algo;
|
||||
public Hash_algo__fxt(Hash_algo algo) {this.algo = algo;}
|
||||
public void Test__hash(String expd, String raw) {
|
||||
Tfds.Eq(expd, algo.Hash_bry_as_str(Bry_.new_u8(raw)));
|
||||
Tfds.Eq(expd, algo.Hash_stream_as_str(gplx.core.consoles.Console_adp_.Noop, gplx.core.ios.streams.IoStream_.mem_txt_(Io_url_.Empty, raw)));
|
||||
}
|
||||
}
|
||||
@@ -13,9 +13,9 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*;
|
||||
public class Hash_algo__sha1__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/
|
||||
public class Jre_hash_algo__sha1__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/
|
||||
private final Hash_algo__fxt fxt = new Hash_algo__fxt(Hash_algo_.New__sha1());
|
||||
@Test public void Empty() {fxt.Test__hash("da39a3ee5e6b4b0d3255bfef95601890afd80709", "");}
|
||||
@Test public void a() {fxt.Test__hash("86f7e437faa5a7fce15d1ddcb9eaeaea377667b8", "a");}
|
||||
@@ -13,9 +13,9 @@ The terms of each license can be found in the source code repository:
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security; import gplx.*; import gplx.core.*;
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import org.junit.*;
|
||||
public class Hash_algo__sha2_256__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/
|
||||
public class Jre_hash_algo__sha2_256__tst { // REF: https://www.cosic.esat.kuleuven.be/nessie/testvectors/
|
||||
private final Hash_algo__fxt fxt = new Hash_algo__fxt(Hash_algo_.New__sha2_256());
|
||||
@Test public void Empty() {fxt.Test__hash("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "");}
|
||||
@Test public void a() {fxt.Test__hash("ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb", "a");}
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
XOWA: the XOWA Offline Wiki Application
|
||||
Copyright (C) 2012-2017 gnosygnu@gmail.com
|
||||
|
||||
XOWA is licensed under the terms of the General Public License (GPL) Version 3,
|
||||
or alternatively under the terms of the Apache License Version 2.0.
|
||||
|
||||
You may use XOWA according to either of these licenses as is most appropriate
|
||||
for your project on a case-by-case basis.
|
||||
|
||||
The terms of each license can be found in the source code repository:
|
||||
|
||||
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
|
||||
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
|
||||
*/
|
||||
package gplx.core.security.algos.jre; import gplx.*; import gplx.core.*; import gplx.core.security.*; import gplx.core.security.algos.*;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
public class Jre_hash_factory implements Hash_algo_factory {
|
||||
public Hash_algo New_hash_algo(String key) {
|
||||
return new Jre_hash_algo(this, key);
|
||||
}
|
||||
|
||||
public MessageDigest New_algo_under(String key) {
|
||||
try {return MessageDigest.getInstance(key);}
|
||||
catch (NoSuchAlgorithmException e) {throw Err_.new_missing_key(key);}
|
||||
}
|
||||
|
||||
public static String
|
||||
Key__md5 = "md5", Key__sha1 = "sha1", Key__sha2_256 = "sha-256"
|
||||
;
|
||||
public static final Jre_hash_factory Instance = new Jre_hash_factory(); Jre_hash_factory() {}
|
||||
}
|
||||
Reference in New Issue
Block a user