diff options
Diffstat (limited to 'smcc')
-rw-r--r-- | smcc/src/main/java/at/gv/egiz/smcc/SWCard.java | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/smcc/src/main/java/at/gv/egiz/smcc/SWCard.java b/smcc/src/main/java/at/gv/egiz/smcc/SWCard.java index 62f3e3e3..87488f26 100644 --- a/smcc/src/main/java/at/gv/egiz/smcc/SWCard.java +++ b/smcc/src/main/java/at/gv/egiz/smcc/SWCard.java @@ -24,6 +24,8 @@ package at.gv.egiz.smcc; +import iaik.me.asn1.ASN1; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -80,7 +82,7 @@ public class SWCard implements SignatureCard { private static String swCardDir; - private final Logger log = LoggerFactory.getLogger(SWCard.class); + private static final Logger log = LoggerFactory.getLogger(SWCard.class); private KeyStore certifiedKeyStore; @@ -415,21 +417,55 @@ public class SWCard implements SignatureCard { for (byte[] b = new byte[20]; (l = input.read(b)) != -1;) { signature.update(b, 0, l); } - return signature.sign(); + return unwrapSignature(signature.sign(), algorithm); } catch (NoSuchAlgorithmException e) { String msg = "Algorithm + '" + algorithm + "' not supported for signing."; log.info(msg, e); throw new SignatureCardException(msg, e); } catch (SignatureException e) { - String msg = "Signing faild."; + String msg = "Signing failed."; log.info(msg, e); throw new SignatureCardException(msg, e); } catch (InvalidKeyException e) { String msg = "Key not valid for algorithm + '" + algorithm + "'."; log.info(msg, e); throw new SignatureCardException(msg, e); + } catch (IOException e) { + String msg = "Error unwrapping signature value."; + log.info(msg, e); + throw new SignatureCardException(msg, e); } - + } + + private static byte[] unwrapSignature(byte[] signature, String alg) throws IOException { + byte[] ret = signature; + log.debug("Checking if unwrapping necessary for " + alg); + if ("SHA1withECDSA".equals(alg) || + "SHA256withECDSA".equals(alg) || + "RIPEMD160withECDSA".equals(alg)) { + log.debug("Unwrapping signature"); + ASN1 sig = new ASN1(signature); + byte[] r = sig.getElementAt(0).gvBigInteger().toByteArray(); + int r_length = r.length; + int r_start = 0; + if (r[0] == 0) { + //skip leading 0 + --r_length; + ++r_start; + } + byte[] s = sig.getElementAt(1).gvBigInteger().toByteArray(); + int s_length = s.length; + int s_start = 0; + if (s[0] == 0) { + //skip leading 0 + --s_length; + ++s_start; + } + ret = new byte[r_length + s_length]; + System.arraycopy(r, r_start, ret, 0, r_length); + System.arraycopy(s, s_start, ret, r_length, s_length); + } + return ret; } @Override |