Package org.kapott.hbci.manager
Class FlickerCode
- java.lang.Object
-
- org.kapott.hbci.manager.FlickerCode
-
public class FlickerCode extends java.lang.Object
Implementierung 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 class
FlickerCode.DE
Bean fuer die Eigenschaften eines einzelnen DE.static class
FlickerCode.Encoding
Das Encoding der Nutzdaten.static class
FlickerCode.HHDVersion
Versionskennung.class
FlickerCode.Startcode
Bean fuer die Eigenschaften des Startcodes.
-
Field Summary
Fields Modifier and Type Field Description private static int
BIT_CONTROLBYTE
Die Position des Bits, welches festlegt, ob ein Controlbyte folgt.private static int
BIT_ENCODING
Die Position des Bits, welches das Encoding enthaelt.FlickerCode.DE
de1
Datenelement 1.FlickerCode.DE
de2
Datenelement 2.FlickerCode.DE
de3
Datenelement 3.int
lc
Laenge des gesamten Codes.private static int
LC_LENGTH_HHD13
Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.3 steht.private static int
LC_LENGTH_HHD14
Die Anzahl der Bytes, in der die Laenge des Challenge bei HHD 1.4 steht.private static int
LDE_LENGTH_DEFAULT
Default-Laenge der LDE-Laengen-Angabe.private static int
LDE_LENGTH_SPARDA
Fallback-Laenge der LDE-Laengen-Angabe bei der Sparda.java.lang.String
rest
Der Rest des Codes.FlickerCode.Startcode
startCode
Der Startcode.FlickerCode.HHDVersion
version
Die 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.String
clean(java.lang.String code)
Entfernt das CHLGUC0026....CHLGTEXT aus dem Code, falls vorhanden.private java.lang.String
createLuhnChecksum()
Berechnet die Luhn-Pruefziffer neu.private java.lang.String
createPayload()
Generiert den Payload neu.private java.lang.String
createXORChecksum(java.lang.String payload)
Berechnet die XOR-Checksumme fuer den Code neu.boolean
equals(java.lang.Object obj)
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).private static boolean
isBitSet(int num, int bit)
Prueft, ob in der genannten Zahl das angegebene Bit gesetzt ist.private void
parse(java.lang.String code, FlickerCode.HHDVersion version)
Parst den Code mit der angegebenen HHD-Version.private void
parse(java.lang.String code, FlickerCode.HHDVersion version, int ldeLen)
Parst den Code mit der angegebenen HHD-Version.private static int
quersumme(int n)
Berechnet die Quersumme.java.lang.String
render()
Rendert den flickerfaehigen Code aus dem Challenge im HHD-Format.private void
reset()
Resettet den Code.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.private static java.lang.String
toHex(java.lang.String s)
Wandelt alle Zeichen des String gemaess des jeweiligen ASCII-Wertes in HEX-Codierung um.java.lang.String
toString()
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.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.
-
-
-
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:
toString
in classjava.lang.Object
- See Also:
Object.toString()
-
reset
private void reset()
Resettet den Code.
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in 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.
-
-