Package org.kapott.hbci.manager
Class FlickerCode
- java.lang.Object
-
- org.kapott.hbci.manager.FlickerCode
-
public class FlickerCode extends java.lang.ObjectImplementierung des Flicker-Codes fuer optisches ChipTAN. Basiert auf der Javascript-Implementierung von http://6xq.net/media/00/20/flickercode.html Die Javascript-Implementierung war jedoch nicht mehr aktuell (basiert auf HHD 1.3).
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description classFlickerCode.DEBean fuer die Eigenschaften eines einzelnen DE.static classFlickerCode.EncodingDas Encoding der Nutzdaten.static classFlickerCode.HHDVersionVersionskennung.classFlickerCode.StartcodeBean fuer die Eigenschaften des Startcodes.
-
Field Summary
Fields Modifier and Type Field Description private static intBIT_CONTROLBYTEDie Position des Bits, welches festlegt, ob ein Controlbyte folgt.private static intBIT_ENCODINGDie Position des Bits, welches das Encoding enthaelt.FlickerCode.DEde1Datenelement 1.FlickerCode.DEde2Datenelement 2.FlickerCode.DEde3Datenelement 3.intlcLaenge des gesamten Codes.private static intLC_LENGTH_HHD13Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.3 steht.private static intLC_LENGTH_HHD14Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.4 steht.private static intLDE_LENGTH_DEFAULTDefault-Laenge der LDE-Laengen-Angabe.private static intLDE_LENGTH_SPARDAFallback-Laenge der LDE-Laengen-Angabe bei der Sparda.java.lang.StringrestDer Rest des Codes.FlickerCode.StartcodestartCodeDer Startcode.FlickerCode.HHDVersionversionDie HHD-Version.
-
Constructor Summary
Constructors Constructor Description FlickerCode()ct.FlickerCode(java.lang.String code)ct.FlickerCode(HHDVersion hhd, java.lang.String code)ct.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private java.lang.Stringclean(java.lang.String code)Entfernt das CHLGUC0026....CHLGTEXT aus dem Code, falls vorhanden.private java.lang.StringcreateLuhnChecksum()Berechnet die Luhn-Pruefziffer neu.private java.lang.StringcreatePayload()Generiert den Payload neu.private java.lang.StringcreateXORChecksum(java.lang.String payload)Berechnet die XOR-Checksumme fuer den Code neu.booleanequals(java.lang.Object obj)private static intgetBitSum(int num, int bits)Liefert die Summe der Bit-Wertigkeiten fuer die genannten Bits (beginndend bei 0 und beim kleinsten Bit, angegebens inclusive).private static booleanisBitSet(int num, int bit)Prueft, ob in der genannten Zahl das angegebene Bit gesetzt ist.private voidparse(java.lang.String code, FlickerCode.HHDVersion version)Parst den Code mit der angegebenen HHD-Version.private voidparse(java.lang.String code, FlickerCode.HHDVersion version, int ldeLen)Parst den Code mit der angegebenen HHD-Version.private static intquersumme(int n)Berechnet die Quersumme.java.lang.Stringrender()Rendert den flickerfaehigen Code aus dem Challenge im HHD-Format.private voidreset()Resettet den Code.private static java.lang.StringtoHex(int n, int len)Wandelt die Zahl in Hex-Schreibweise um und fuellt links mit Nullen auf, bis die Laenge "len" erreicht ist.private static java.lang.StringtoHex(java.lang.String s)Wandelt alle Zeichen des String gemaess des jeweiligen ASCII-Wertes in HEX-Codierung um.java.lang.StringtoString()static FlickerCodetryParse(java.lang.String challenge, java.lang.String hhduc)Versucht, aus Challenge und Challenge HHDuc den Flicker-Code zu extrahieren und ihn in einen flickerfaehigen Code umzuwandeln.static FlickerCodetryParse(HHDVersion hhd, java.lang.String challenge, java.lang.String hhduc)Versucht, aus Challenge und Challenge HHDuc den Flicker-Code zu extrahieren und ihn in einen flickerfaehigen Code umzuwandeln.
-
-
-
Field Detail
-
LC_LENGTH_HHD14
private static final int LC_LENGTH_HHD14
Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.4 steht. Bei HHD 1.3 war das noch 2 Zeichen lang. Wenn der Flicker-Code nicht in "Challenge HHDuc" uebertragen wurde sondern direkt im Freitext-Challenge, koennen wir das Problem umgehen, indem wir in clean() einfach eine "0" vorn anhaengen. Wenn er aber tatsaechlich im "Challenge HHDuc" steht, kann man dem Code nicht ansehen, ob es ein HHD 1.3-Code ist. In dem Fall hilft nur Try&Error. Also mit HHD 1.4 parsen. Und wenn das fehlschlaegt, dann HHD 1.3 versuchen.- See Also:
- Constant Field Values
-
LC_LENGTH_HHD13
private static final int LC_LENGTH_HHD13
Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.3 steht.- See Also:
- Constant Field Values
-
LDE_LENGTH_DEFAULT
private static final int LDE_LENGTH_DEFAULT
Default-Laenge der LDE-Laengen-Angabe.- See Also:
- Constant Field Values
-
LDE_LENGTH_SPARDA
private static final int LDE_LENGTH_SPARDA
Fallback-Laenge der LDE-Laengen-Angabe bei der Sparda.- See Also:
- Constant Field Values
-
BIT_ENCODING
private static final int BIT_ENCODING
Die Position des Bits, welches das Encoding enthaelt.- See Also:
- Constant Field Values
-
BIT_CONTROLBYTE
private static final int BIT_CONTROLBYTE
Die Position des Bits, welches festlegt, ob ein Controlbyte folgt.- See Also:
- Constant Field Values
-
version
public FlickerCode.HHDVersion version
Die HHD-Version.
-
lc
public int lc
Laenge des gesamten Codes.
-
startCode
public FlickerCode.Startcode startCode
Der Startcode.
-
de1
public FlickerCode.DE de1
Datenelement 1.
-
de2
public FlickerCode.DE de2
Datenelement 2.
-
de3
public FlickerCode.DE de3
Datenelement 3.
-
rest
public java.lang.String rest
Der Rest des Codes. Mit dem koennen wir nichts anfangen
-
-
Constructor Detail
-
FlickerCode
public FlickerCode()
ct. Parameterloser Konstruktor zum manuellen Zusammenstecken eines Codes.
-
FlickerCode
public FlickerCode(java.lang.String code)
ct. Parst den HHDuc-Code aus dem uebergebenen Code.- Parameters:
code- der zu parsende Code.
-
FlickerCode
public FlickerCode(HHDVersion hhd, java.lang.String code)
ct. Parst den HHDuc-Code aus dem uebergebenen Code.- Parameters:
hhd- die HHD-Version. Kann NULL sein.code- der zu parsende Code.
-
-
Method Detail
-
tryParse
public static FlickerCode tryParse(java.lang.String challenge, java.lang.String hhduc)
Versucht, aus Challenge und Challenge HHDuc den Flicker-Code zu extrahieren und ihn in einen flickerfaehigen Code umzuwandeln. Nur wenn tatsaechlich ein gueltiger Code enthalten ist, der als HHDuc-Code geparst und in einen Flicker-Code umgewandelt werden konnte, liefert die Funktion den Code. Sonst immer NULL.- Parameters:
challenge- der Challenge-Text. Das DE "Challenge HHDuc" gibt es erst seit HITAN4. Einige Banken haben aber schon vorher optisches chipTAN gemacht. Die haben das HHDuc dann direkt im Freitext des Challenge mitgeschickt (mit String-Tokens zum Extrahieren markiert). Die werden vom FlickerCode-Parser auch unterstuetzt.hhduc- das echte Challenge HHDuc.- Returns:
- der geparste Flickercode oder NULL.
-
tryParse
public static FlickerCode tryParse(HHDVersion hhd, java.lang.String challenge, java.lang.String hhduc)
Versucht, aus Challenge und Challenge HHDuc den Flicker-Code zu extrahieren und ihn in einen flickerfaehigen Code umzuwandeln. Nur wenn tatsaechlich ein gueltiger Code enthalten ist, der als HHDuc-Code geparst und in einen Flicker-Code umgewandelt werden konnte, liefert die Funktion den Code. Sonst immer NULL.- Parameters:
hhd- die HHD-Version. Kann NULL sein.challenge- der Challenge-Text. Das DE "Challenge HHDuc" gibt es erst seit HITAN4. Einige Banken haben aber schon vorher optisches chipTAN gemacht. Die haben das HHDuc dann direkt im Freitext des Challenge mitgeschickt (mit String-Tokens zum Extrahieren markiert). Die werden vom FlickerCode-Parser auch unterstuetzt.hhduc- das echte Challenge HHDuc.- Returns:
- der geparste Flickercode oder NULL.
-
parse
private void parse(java.lang.String code, FlickerCode.HHDVersion version)Parst den Code mit der angegebenen HHD-Version.- Parameters:
code- der zu parsende Code.version- die HHD-Version.
-
parse
private void parse(java.lang.String code, FlickerCode.HHDVersion version, int ldeLen)Parst den Code mit der angegebenen HHD-Version.- Parameters:
code- der zu parsende Code.version- die HHD-Version.ldeLen- explizite Angabe der Laenge des LDE.
-
clean
private java.lang.String clean(java.lang.String code)
Entfernt das CHLGUC0026....CHLGTEXT aus dem Code, falls vorhanden. Das sind HHD 1.3-Codes, die nicht im "Challenge HHDuc" uebertragen wurden sondern direkt im Challenge-Freitext,- Parameters:
code-- Returns:
-
render
public java.lang.String render()
Rendert den flickerfaehigen Code aus dem Challenge im HHD-Format.- Returns:
- der neu generierte Flicker-Code.
-
createPayload
private java.lang.String createPayload()
Generiert den Payload neu. Das ist der komplette Code, jedoch ohne Pruefziffern am Ende.- Returns:
- der neu generierte Payload.
-
createXORChecksum
private java.lang.String createXORChecksum(java.lang.String payload)
Berechnet die XOR-Checksumme fuer den Code neu.- Parameters:
der- Payload.- Returns:
- die XOR-Checksumme im Hex-Format.
-
createLuhnChecksum
private java.lang.String createLuhnChecksum()
Berechnet die Luhn-Pruefziffer neu.- Returns:
- die Pruefziffer im Hex-Format.
-
toString
public java.lang.String toString()
- Overrides:
toStringin classjava.lang.Object- See Also:
Object.toString()
-
reset
private void reset()
Resettet den Code.
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equalsin classjava.lang.Object- See Also:
Object.equals(java.lang.Object)
-
toHex
private static java.lang.String toHex(int n, int len)Wandelt die Zahl in Hex-Schreibweise um und fuellt links mit Nullen auf, bis die Laenge "len" erreicht ist.- Parameters:
n- die Zahl.len- die zu erreichende Laenge.- Returns:
- die links mit Nullen aufgefuellte Zahl in HEX-Schreibweise.
-
toHex
private static java.lang.String toHex(java.lang.String s)
Wandelt alle Zeichen des String gemaess des jeweiligen ASCII-Wertes in HEX-Codierung um. Beispiel: Das Zeichen "0" hat den ASCII-Wert "30" in Hexadezimal-Schreibweise.- Parameters:
s- der umzuwandelnde String.- Returns:
- der codierte String.
-
quersumme
private static int quersumme(int n)
Berechnet die Quersumme.- Parameters:
n- die Zahl, deren Quersumme errechnet werden soll.- Returns:
- die Quersumme.
-
getBitSum
private static int getBitSum(int num, int bits)Liefert die Summe der Bit-Wertigkeiten fuer die genannten Bits (beginndend bei 0 und beim kleinsten Bit, angegebens inclusive). Beispiel: num = 156 (-> 10011100) bits = 5 Es wird die Summe der Bitwertigkeiten 2^0 bis 2^5 errechnet. Also der Wert von **011100 = 2^4+2^3+s^2 = 28- Parameters:
num- Zahl, aus der die Summe berechnet werden soll.bits- Anzahl der Bits (beginnend bei 0 und beim kleinsten Bit, angegebenes inclusive), deren Wertigkeit addiert werden soll.- Returns:
- der errechnete Wert.
-
isBitSet
private static boolean isBitSet(int num, int bit)Prueft, ob in der genannten Zahl das angegebene Bit gesetzt ist.- Parameters:
num- die zu pruefende Zahl.bit- die Nummer des zu pruefenden Bits. Wobei "0" das kleinste (rechts) und "7" das groesste (links) Bit ist.- Returns:
- true, wenn das Bit gesetzt ist.
-
-