001: /*
002: * Copyright (c) 2001 Silvere Martin-Michiellot All Rights Reserved.
003: *
004: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
005: * royalty free, license to use, modify and redistribute this
006: * software in source and binary code form,
007: * provided that i) this copyright notice and license appear on all copies of
008: * the software; and ii) Licensee does not utilize the software in a manner
009: * which is disparaging to Silvere Martin-Michiellot.
010: *
011: * This software is provided "AS IS," without a warranty of any kind. ALL
012: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
013: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
014: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
015: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
016: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
017: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
018: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
019: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
020: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
021: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
022: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
023: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
024: *
025: * This software is not designed or intended for use in on-line control of
026: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
027: * the design, construction, operation or maintenance of any nuclear
028: * facility. Licensee represents and warrants that it will not use or
029: * redistribute the Software for such purposes.
030: *
031: * @Author: Silvere Martin-Michiellot
032: *
033: */
034:
035: package com.db.utils.signatures;
036:
037: import java.io.*;
038: import java.security.*;
039: import java.security.spec.*;
040:
041: /**
042: * Verify a DSA signature from files
043: */
044: public class VerifySignature {
045:
046: public static boolean VerifySignature(String publicKeyFileName,
047: String signatureFileName, String dataFileName) {
048:
049: try {
050:
051: /* import encoded public key */
052:
053: FileInputStream keyfis = new FileInputStream(
054: publicKeyFileName);
055: byte[] encKey = new byte[keyfis.available()];
056: keyfis.read(encKey);
057:
058: keyfis.close();
059:
060: X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(
061: encKey);
062:
063: KeyFactory keyFactory = KeyFactory
064: .getInstance("DSA", "SUN");
065: PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
066:
067: /* input the signature bytes */
068: FileInputStream sigfis = new FileInputStream(
069: signatureFileName);
070: byte[] sigToVerify = new byte[sigfis.available()];
071: sigfis.read(sigToVerify);
072:
073: sigfis.close();
074:
075: /* create a Signature object and initialize it with the public key */
076: Signature sig = Signature.getInstance("SHA1withDSA", "SUN");
077: sig.initVerify(pubKey);
078:
079: /* Update and verify the data */
080:
081: FileInputStream datafis = new FileInputStream(dataFileName);
082: BufferedInputStream bufin = new BufferedInputStream(datafis);
083:
084: byte[] buffer = new byte[1024];
085: int len;
086: while (bufin.available() != 0) {
087: len = bufin.read(buffer);
088: sig.update(buffer, 0, len);
089: }
090: ;
091:
092: bufin.close();
093:
094: return sig.verify(sigToVerify);
095:
096: } catch (Exception e) {
097:
098: return false;
099:
100: }
101:
102: }
103:
104: }
|