13 Commits
Author SHA1 Message Date
Xiao 16149a8dec README.md aktualisieren 2026-08-07 03:12:54 +08:00
Xiao 3f93b73ea0 README.md aktualisieren 2026-08-07 03:11:27 +08:00
Xiao 02aa2c8776 Update isNull.java (#44)
ez
2026-07-14 16:10:38 -04:00
Xiao c8e9b50883 fix leak (#43)
- add SLF4J as a dependency in pom.xml
- replace System.out.println with log.warn (prevent leak)
2026-07-14 16:03:52 -04:00
Xiao 273f10a987 Update XACryptoException.java (#41)
#SIMPLEST FIX EVER lmao
2026-07-14 15:50:25 -04:00
Xiao 999c99f166 Update Factories.java (#40) 2026-07-14 15:46:49 -04:00
Xiao f54b14cc9c Update README.md 2026-07-09 22:32:50 -04:00
Xiao 62b2848ab2 this is why you test things, before commiting to main, kids. 2026-07-05 14:08:16 -04:00
Xiao 06504b83d5 whoops! 2026-07-05 14:03:30 -04:00
xiao 9566323ac7 Update pom.xml
i forgot to update this before erelease lol, i changed this right before i compiled but not before commit!
2026-07-04 14:44:27 -04:00
Xiao X c7fe6cc704 Java mirror fix (#20)
* Update ARIAGCM.java

removed reflection-only exceptions

* desc

bulk remove reflection-only

* Update Factories.java

more removal!

* desc

camellia - add block cipher implements + encryptBlock XACryptoException
twofish- add implement for blockcipher

* lot stuff + cleanup
2026-07-04 12:55:11 -04:00
Xiao X c5a5325f19 whoop (#18) 2026-07-04 00:46:25 -04:00
Xiao X ed2e3cd233 forgot2 remove 2026-06-19 21:48:21 -04:00
15 changed files with 112 additions and 76 deletions
+5 -3
View File
@@ -1,7 +1,9 @@
A multi-purpose Cryptography library in Java. Working on it day by day, slowly. Someday this will be complete, today is not that day. A multi-purpose Cryptography library in Java. Working on it day by day, slowly. Someday this will be complete, today is not that day.
To be clear, this is **NOT** mean't to be a replacement/alternative to BouncyCastle. Instead, it is meant to include what BouncyCastle does not have. No code was taken from OpenSSL or BouncyCastle for that reason. To be clear, this is **NOT** mean't to be a replacement/alternative to BouncyCastle. Instead, it is meant to include what BouncyCastle does not have. No code was taken from OpenSSL or BouncyCastle for that reason.
### Current Objective: ZekerRijndael (custom encryption sub-library) We are (soon to be) DMCA-protected: https://www.dmca.com/r/8e2yr97
Yes. We will advertise Microsoft products for free via variable names.
Use `setopt interactivecomments` (zsh only) to allow using `#` for comments if you see errors like `zsh: command not found: #` Use `setopt interactivecomments` (zsh only) to allow using `#` for comments if you see errors like `zsh: command not found: #`
@@ -13,6 +15,6 @@ To compile (these commands should work universally):
1. git clone https://github.com/Geprivilegieerde-Anonimiteit-BV/XACrypto.git # download the git repository 1. git clone https://github.com/Geprivilegieerde-Anonimiteit-BV/XACrypto.git # download the git repository
2. cd XACrypto # enter the directory 2. cd XACrypto # enter the directory
3. mvn clean package # compile the package cleanly 3. mvn clean package # first clean the directory, then package it into a jar
You should find the built jar at target/XACrypto-1.0-SNAPSHOT.jar You should find the built jar at target/xacrypto-\<version\>.jar
+8 -2
View File
@@ -8,7 +8,7 @@
<groupId>de.caydenno1.xacrypto</groupId> <groupId>de.caydenno1.xacrypto</groupId>
<artifactId>xacrypto</artifactId> <artifactId>xacrypto</artifactId>
<version>2026.06.19_R1</version> <version>2026.07.04_R1</version>
<name>XACrypto</name> <name>XACrypto</name>
<description>A multi-purpose Cryptography library in Java.</description> <description>A multi-purpose Cryptography library in Java.</description>
@@ -55,6 +55,12 @@
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<dependency> <dependency>
<groupId>org.junit.jupiter</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId> <artifactId>junit-jupiter-api</artifactId>
@@ -144,4 +150,4 @@
</plugins> </plugins>
</build> </build>
</project> </project>
@@ -1,6 +1,8 @@
package de.caydenno1.xacrypto.hash.sha; package de.caydenno1.xacrypto.hash.sha;
import de.caydenno1.xacrypto.misc.Constants; import de.caydenno1.xacrypto.misc.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@@ -8,9 +10,10 @@ import static de.caydenno1.xacrypto.hash.sha.Shared.INT2BYTE;
import static de.caydenno1.xacrypto.hash.sha.Shared.hex; import static de.caydenno1.xacrypto.hash.sha.Shared.hex;
public class SHA0 { public class SHA0 {
// we really only need one file. very simple code private static final Logger log = LoggerFactory.getLogger(SHA0.class);
public static byte[] hash(byte[] data){ public static byte[] hash(byte[] data){
System.out.println("Beware, SHA0 is deprecated and cryptographically broken. Use at your own risk."); log.warn("SHA0 is deprecated and cryptographically broken. Use at your own risk.");
byte[] padded = Shared.pad(data); byte[] padded = Shared.pad(data);
int a0 = Constants.SHA_H[0], a1 = Constants.SHA_H[1], a2 = Constants.SHA_H[2], a3 = Constants.SHA_H[3], a4 = Constants.SHA_H[4]; int a0 = Constants.SHA_H[0], a1 = Constants.SHA_H[1], a2 = Constants.SHA_H[2], a3 = Constants.SHA_H[3], a4 = Constants.SHA_H[4];
@@ -17,7 +17,7 @@ public class XACryptoException extends Exception {
} }
public XACryptoException(String res, int iid) { public XACryptoException(String res, int iid) {
super(res); super(res);
this.id = iid; this.id = iid & 0xFF;
} }
public XACryptoException(String[] pnts, byte id){ public XACryptoException(String[] pnts, byte id){
super(String.join("|", pnts)); super(String.join("|", pnts));
@@ -10,13 +10,6 @@ public class isNull {
return Objects.isNull(v) || v == null || v == alt; return Objects.isNull(v) || v == null || v == alt;
} }
public static boolean isValidText(String s) { public static boolean isValidText(String s) {
if (s.isBlank() || s.trim().isEmpty()) return false; return !isNull(s) && !s.isBlank();
switch (s) {
case "":
case null:
return false;
default:
return true;
}
}; };
} }
@@ -7,37 +7,72 @@ import de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionle
import de.caydenno1.xacrypto.zekerrijndael.GCM.AES; import de.caydenno1.xacrypto.zekerrijndael.GCM.AES;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM; import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM;
import de.caydenno1.xacrypto.zekerrijndael.GCM.ciphers.*; import de.caydenno1.xacrypto.zekerrijndael.GCM.ciphers.*;
import de.caydenno1.xacrypto.zekerrijndael.Global.Aria;
import de.caydenno1.xacrypto.zekerrijndael.Global.Camellia; import de.caydenno1.xacrypto.zekerrijndael.Global.Camellia;
import java.lang.reflect.InvocationTargetException;
public class Factories { public class Factories {
public static class GCM { public static class GCM {
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM AES128(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new AES(key, 128)); } public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM AES128(byte[] key) throws XACryptoException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new AES(key, 128)); }
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM SM4GCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new SM4GCM(key)); } public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM SM4GCM(byte[] key) throws XACryptoException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new SM4GCM(key)); }
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM Camellia(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new Camellia(key)); } public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM Camellia(byte[] key) throws XACryptoException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new Camellia(key)); }
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM AESGCM() throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new AESGCM()); } public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM ARIAGCM(byte[] key) throws XACryptoException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new Aria(true, key)); }
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM ARIAGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new ARIAGCM(key)); } public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM SerpentGCM(byte[] key) throws XACryptoException { return new SerpentGCM(key); }
public static de.caydenno1.xacrypto.zekerrijndael.GCM.GCM SerpentGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { return new de.caydenno1.xacrypto.zekerrijndael.GCM.GCM(new SerpentGCM(key)); }
} }
private static volatile boolean ecbOptIn = false;
/**
* Enables the use of ECB mode.
*
* <p><strong>Warning:</strong> ECB mode is insecure for
* almost all applications because identical plaintext blocks
* produce identical ciphertext blocks, leaking data patterns.
*
* <p>This method exists solely for backwards compatibility.
* Prefer {@link Factories.GCM} or another secure encryption mode.
* The contributor that has written this wishes to remain anonymous.
*/
public static void allowInsecureECB() {
ecbOptIn = true;
}
private static void checkECBenabled() throws XACryptoException {
if (!ecbOptIn) {
throw new XACryptoException(
"ECB mode is not secure because it can leak data patterns. Call Factories.allowInsecureECB() before using ECB."
);
}
}
/**
* Provides ECB mode cipher factories.
*
* <p><strong>Warning:</strong> ECB mode is insecure because identical
* plaintext blocks produce identical ciphertext blocks, leaking data patterns.
*
* <p>This class requires opt-in using
* {@link Factories#allowInsecureECB()} and exists only for backwards compatibility.
*
* @deprecated Use GCM or another secure encryption mode instead.
*/
@Deprecated
public static class ECB { public static class ECB {
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless Blowfish(byte[] key) throws XACryptoException { return new BlowfishECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless Blowfish(byte[] key) throws XACryptoException { checkECBenabled(); return new BlowfishECB(key); }
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB Aria(byte[] key) throws XACryptoException { return new AriaECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB Aria(byte[] key) throws XACryptoException { checkECBenabled(); return new AriaECB(key); }
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless SM4(byte[] key) throws XACryptoException { return new SM4ECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless SM4(byte[] key) throws XACryptoException { checkECBenabled(); return new SM4ECB(key); }
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB AES(byte[] key) throws XACryptoException { return new AESECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB AES(byte[] key) throws XACryptoException { checkECBenabled(); return new AESECB(key); }
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB Twofish(byte[] key) throws XACryptoException { return new TwofishECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB Twofish(byte[] key) throws XACryptoException { checkECBenabled(); return new TwofishECB(key); }
public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB RC6ECB(byte[] key) throws XACryptoException { return new RC6ECB(key); } public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECB RC6ECB(byte[] key) throws XACryptoException { checkECBenabled(); return new RC6ECB(key); }
//public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless CamelliaECB(byte[] key) throws XACryptoException { return new CamelliaECB(key); } //public static de.caydenno1.xacrypto.zekerrijndael.ECB.ciphers.interfaces.ECBExceptionless CamelliaECB(byte[] key) throws XACryptoException { return new CamelliaECB(key); }
} }
} }
@@ -1,28 +1,26 @@
package de.caydenno1.xacrypto.zekerrijndael.GCM; package de.caydenno1.xacrypto.zekerrijndael.GCM;
import de.caydenno1.xacrypto.misc.ToM; import de.caydenno1.xacrypto.misc.ToM;
import de.caydenno1.xacrypto.misc.XACryptoException; import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.misc.isNull; import de.caydenno1.xacrypto.misc.isNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
public class GCM { public class GCM {
private final Object cip; private static final Logger log = LoggerFactory.getLogger(GCM.class);
private final BlockCipher cip;
private final GHASH gh; private final GHASH gh;
private final Method encryptor;
public GCM(Object cip) throws XACryptoException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { public GCM(BlockCipher cip) throws XACryptoException {
this.cip = cip; this.cip = cip;
this.encryptor = cip.getClass().getMethod("encryptBlock", byte[].class); byte[] H = cip.encryptBlock(new byte[16]);
byte[] H = (byte[]) this.encryptor.invoke(cip, (Object) new byte[16]);
this.gh = new GHASH(H); this.gh = new GHASH(H);
} }
public Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException, InvocationTargetException, IllegalAccessException { public Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException {
if (iv.length <= 0) throw new XACryptoException("iv does not have data or is corrupted :["); if (iv.length <= 0) throw new XACryptoException("iv does not have data or is corrupted :[");
if (pln == null) pln = new byte[0]; if (pln == null) pln = new byte[0];
if (aad == null) aad = new byte[0]; if (aad == null) aad = new byte[0];
@@ -38,23 +36,23 @@ public class GCM {
return new Result(packaged,tag); return new Result(packaged,tag);
} }
public byte[] decrypt(Result res, byte[] aad) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad) throws XACryptoException {
return dec(res, aad, 12, false); return dec(res, aad, 12, false);
} }
public byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException {
return dec(res, aad, 12, Objects.equals(optflag, "-override")); return dec(res, aad, 12, Objects.equals(optflag, "-override"));
} }
public byte[] decrypt(Result res, byte[] aad, int ivLen) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad, int ivLen) throws XACryptoException {
return dec(res, aad, ivLen, false); return dec(res, aad, ivLen, false);
} }
public byte[] decrypt(Result res, byte[] aad, int ivLen, String optflag) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad, int ivLen, String optflag) throws XACryptoException {
return dec(res, aad, ivLen, Objects.equals(optflag, "-override")); return dec(res, aad, ivLen, Objects.equals(optflag, "-override"));
} }
private byte[] dec(Result res, byte[] aad, int ivLen, boolean override) throws XACryptoException, InvocationTargetException, IllegalAccessException { private byte[] dec(Result res, byte[] aad, int ivLen, boolean override) throws XACryptoException {
if (res.cip().length < 12) throw new XACryptoException("ciptext min len is 12 char"); if (res.cip().length < 12) throw new XACryptoException("ciptext min len is 12 char");
if (isNull.isNull(aad)) aad = new byte[0]; if (isNull.isNull(aad)) aad = new byte[0];
@@ -69,7 +67,7 @@ public class GCM {
if (!corr && !override) { if (!corr && !override) {
throw new XACryptoException("GCM tag does not match. Use Flag -override to ignore this.",(byte)-1); throw new XACryptoException("GCM tag does not match. Use Flag -override to ignore this.",(byte)-1);
} else if (!corr) { } else if (!corr) {
System.out.println("GCM tag does not match. Overriding..."); log.warn("GCM tag does not match. Overriding...");
} }
return gctr(inc32(J0), ct); return gctr(inc32(J0), ct);
@@ -86,17 +84,17 @@ public class GCM {
} }
} }
private byte[] tag(byte[] aad, byte[] ct, byte[] J0) throws InvocationTargetException, IllegalAccessException { private byte[] tag(byte[] aad, byte[] ct, byte[] J0) throws XACryptoException {
byte[] S = gh.compute(aad, ct); byte[] S = gh.compute(aad, ct);
byte[] EJ0 = (byte[]) this.encryptor.invoke(J0); byte[] EJ0 = cip.encryptBlock(J0);
for (int i = 0; i < 16; i++) S[i] ^= EJ0[i]; for (int i = 0; i < 16; i++) S[i] ^= EJ0[i];
return S; return S;
} }
private byte[] gctr(byte[] icb, byte[] in) throws InvocationTargetException, IllegalAccessException { private byte[] gctr(byte[] icb, byte[] in) throws XACryptoException {
byte[] o = new byte[in.length]; byte[] o = new byte[in.length];
byte[] cnt = Arrays.copyOf(icb, 16); byte[] cnt = Arrays.copyOf(icb, 16);
for (int i = 0 ; i < in.length ; i += 16){ for (int i = 0 ; i < in.length ; i += 16){
byte[] ks = (byte[]) this.encryptor.invoke(cnt); byte[] ks = cip.encryptBlock(cnt);
int len = Math.min(16, in.length -i); int len = Math.min(16, in.length -i);
for (int j = 0; j < len; j++) o[i + j] = (byte)(in[i + j] ^ ks[j]); for (int j = 0; j < len; j++) o[i + j] = (byte)(in[i + j] ^ ks[j]);
if (i+16<in.length) cnt = inc32(cnt); if (i+16<in.length) cnt = inc32(cnt);
@@ -4,6 +4,8 @@ import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GHASH; import de.caydenno1.xacrypto.zekerrijndael.GCM.GHASH;
import de.caydenno1.xacrypto.zekerrijndael.GCM.AES; import de.caydenno1.xacrypto.zekerrijndael.GCM.AES;
import de.caydenno1.xacrypto.zekerrijndael.GCM.Result; import de.caydenno1.xacrypto.zekerrijndael.GCM.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Objects; import java.util.Objects;
@@ -16,8 +18,10 @@ interface AESCipher {
} }
public class AESGCM implements AESCipher { public class AESGCM implements AESCipher {
private static final Logger log = LoggerFactory.getLogger(AESGCM.class);
public Result encryptBlock(byte[] pln, byte[] key, byte[] nonce, byte[] aad) throws XACryptoException { public Result encryptBlock(byte[] pln, byte[] key, byte[] nonce, byte[] aad) throws XACryptoException {
System.out.println("WARNING! AESGCM may not be fully functional and partially broken. I am unsure if it fully works or not."); log.warn("AESGCM may not be fully functional and partially broken. I am unsure if it fully works or not.");
AES aes = new AES(key, getKeySize(key)); AES aes = new AES(key, getKeySize(key));
byte[] H = aes.encryptBlock(new byte[16]); byte[] H = aes.encryptBlock(new byte[16]);
GHASH gh = new GHASH(H); GHASH gh = new GHASH(H);
@@ -82,7 +86,7 @@ public class AESGCM implements AESCipher {
if (!ToM(tag, expectedTag) && !flag) { if (!ToM(tag, expectedTag) && !flag) {
throw new XACryptoException("Tag does not match. USE flag \"-override\" to ignore this."); throw new XACryptoException("Tag does not match. USE flag \"-override\" to ignore this.");
} else if (!ToM(tag,expectedTag) && flag) { } else if (!ToM(tag,expectedTag) && flag) {
System.out.println("Continuing in insecure mode."); log.warn("Continuing in insecure mode.");
} }
return aes.encryptCTR(cip, J0); return aes.encryptCTR(cip, J0);
@@ -5,12 +5,10 @@ import de.caydenno1.xacrypto.zekerrijndael.Global.Aria;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM; import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM;
import de.caydenno1.xacrypto.zekerrijndael.GCM.Result; import de.caydenno1.xacrypto.zekerrijndael.GCM.Result;
import java.lang.reflect.InvocationTargetException;
interface AriaCipher { interface AriaCipher {
Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException, InvocationTargetException, IllegalAccessException; Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException;
byte[] decrypt(Result res, byte[] aad) throws XACryptoException, InvocationTargetException, IllegalAccessException; byte[] decrypt(Result res, byte[] aad) throws XACryptoException;
byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException, InvocationTargetException, IllegalAccessException; byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException;
} }
public class ARIAGCM implements AriaCipher { public class ARIAGCM implements AriaCipher {
@@ -18,19 +16,19 @@ public class ARIAGCM implements AriaCipher {
// i basically wrote the entire thing in Aria.java already lol. just inheriting it here // i basically wrote the entire thing in Aria.java already lol. just inheriting it here
private final GCM engine; private final GCM engine;
public ARIAGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { public ARIAGCM(byte[] key) throws XACryptoException {
Aria aria = new Aria(true, key); Aria aria = new Aria(true, key);
this.engine = new GCM(aria); this.engine = new GCM(aria);
} }
public Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException, InvocationTargetException, IllegalAccessException { public Result encrypt(byte[] pln, byte[] aad, byte[] iv) throws XACryptoException {
return engine.encrypt(pln, aad,iv); return engine.encrypt(pln, aad,iv);
} }
public byte[] decrypt(Result res, byte[] aad) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad) throws XACryptoException {
return engine.decrypt(res, aad); return engine.decrypt(res, aad);
} }
public byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException, InvocationTargetException, IllegalAccessException { public byte[] decrypt(Result res, byte[] aad, String optflag) throws XACryptoException {
return engine.decrypt(res, aad, optflag); return engine.decrypt(res, aad, optflag);
} }
} }
@@ -4,10 +4,8 @@ import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM; import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM;
import de.caydenno1.xacrypto.zekerrijndael.Global.Camellia; import de.caydenno1.xacrypto.zekerrijndael.Global.Camellia;
import java.lang.reflect.InvocationTargetException;
public class CamelliaGCM extends GCM { public class CamelliaGCM extends GCM {
public CamelliaGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { public CamelliaGCM(byte[] key) throws XACryptoException {
super(new Camellia(key)); super(new Camellia(key));
} }
} }
@@ -4,8 +4,6 @@ import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM; import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM;
import de.caydenno1.xacrypto.zekerrijndael.Global.Serpent; import de.caydenno1.xacrypto.zekerrijndael.Global.Serpent;
import java.lang.reflect.InvocationTargetException;
public class SerpentGCM extends GCM { public class SerpentGCM extends GCM {
public SerpentGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { super(new Serpent(key)); } public SerpentGCM(byte[] key) throws XACryptoException { super(new Serpent(key)); }
} }
@@ -4,10 +4,8 @@ import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM; import de.caydenno1.xacrypto.zekerrijndael.GCM.GCM;
import de.caydenno1.xacrypto.zekerrijndael.Global.Twofish; import de.caydenno1.xacrypto.zekerrijndael.Global.Twofish;
import java.lang.reflect.InvocationTargetException;
public class TwofishGCM extends GCM { public class TwofishGCM extends GCM {
public TwofishGCM(byte[] key) throws XACryptoException, InvocationTargetException, NoSuchMethodException, IllegalAccessException { public TwofishGCM(byte[] key) throws XACryptoException {
super(new Twofish(key)); super(new Twofish(key));
} }
} }
@@ -1,9 +1,10 @@
package de.caydenno1.xacrypto.zekerrijndael.Global; package de.caydenno1.xacrypto.zekerrijndael.Global;
import de.caydenno1.xacrypto.misc.XACryptoException; import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.BlockCipher;
import de.caydenno1.xacrypto.zekerrijndael.UnchangingData; import de.caydenno1.xacrypto.zekerrijndael.UnchangingData;
public class Aria { public class Aria implements BlockCipher {
// this is NOT a cipher, more or less and encryption type/method // this is NOT a cipher, more or less and encryption type/method
private final int round; private final int round;
private final byte[][] encRK; private final byte[][] encRK;
@@ -1,6 +1,7 @@
package de.caydenno1.xacrypto.zekerrijndael.Global; package de.caydenno1.xacrypto.zekerrijndael.Global;
import de.caydenno1.xacrypto.misc.XACryptoException; import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.BlockCipher;
import de.caydenno1.xacrypto.zekerrijndael.UnchangingData; import de.caydenno1.xacrypto.zekerrijndael.UnchangingData;
import de.caydenno1.xacrypto.hash.ROT; import de.caydenno1.xacrypto.hash.ROT;
@@ -9,7 +10,7 @@ interface CamelliaCipher {
byte[] decryptBlock(byte[] in); byte[] decryptBlock(byte[] in);
} }
public class Camellia implements CamelliaCipher { public class Camellia implements CamelliaCipher, BlockCipher {
private final long[] subkeys; private final long[] subkeys;
public Camellia(byte[] key) throws XACryptoException { public Camellia(byte[] key) throws XACryptoException {
@@ -18,7 +19,7 @@ public class Camellia implements CamelliaCipher {
genKeySchedule(key); genKeySchedule(key);
} }
public byte[] encryptBlock(byte[] in) { public byte[] encryptBlock(byte[] in) throws XACryptoException {
return encryptBlock(in, 0, new byte[16], 0); return encryptBlock(in, 0, new byte[16], 0);
} }
@@ -1,12 +1,13 @@
package de.caydenno1.xacrypto.zekerrijndael.Global; package de.caydenno1.xacrypto.zekerrijndael.Global;
import de.caydenno1.xacrypto.misc.XACryptoException; import de.caydenno1.xacrypto.misc.XACryptoException;
import de.caydenno1.xacrypto.zekerrijndael.GCM.BlockCipher;
import static de.caydenno1.xacrypto.zekerrijndael.UnchangingData.TWOFISH_Q0; import static de.caydenno1.xacrypto.zekerrijndael.UnchangingData.TWOFISH_Q0;
import static de.caydenno1.xacrypto.zekerrijndael.UnchangingData.TWOFISH_Q1; import static de.caydenno1.xacrypto.zekerrijndael.UnchangingData.TWOFISH_Q1;
import static de.caydenno1.xacrypto.zekerrijndael.Global.LE32.*; import static de.caydenno1.xacrypto.zekerrijndael.Global.LE32.*;
public class Twofish { public class Twofish implements BlockCipher {
private final int[] K = new int[40]; private final int[] K = new int[40];
private final int[] S; private final int[] S;
private final int kW; private final int kW;