01: /* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
02: /*
03: Copyright (c) 2002-2008 ymnk, JCraft,Inc. All rights reserved.
04:
05: Redistribution and use in source and binary forms, with or without
06: modification, are permitted provided that the following conditions are met:
07:
08: 1. Redistributions of source code must retain the above copyright notice,
09: this list of conditions and the following disclaimer.
10:
11: 2. Redistributions in binary form must reproduce the above copyright
12: notice, this list of conditions and the following disclaimer in
13: the documentation and/or other materials provided with the distribution.
14:
15: 3. The names of the authors may not be used to endorse or promote products
16: derived from this software without specific prior written permission.
17:
18: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
19: INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
21: INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
22: INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24: OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
27: EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28: */
29:
30: package com.jcraft.jsch.jce;
31:
32: import java.math.BigInteger;
33: import java.security.*;
34: import java.security.spec.*;
35:
36: public class SignatureRSA implements com.jcraft.jsch.SignatureRSA {
37:
38: java.security.Signature signature;
39: KeyFactory keyFactory;
40:
41: public void init() throws Exception {
42: signature = java.security.Signature.getInstance("SHA1withRSA");
43: keyFactory = KeyFactory.getInstance("RSA");
44: }
45:
46: public void setPubKey(byte[] e, byte[] n) throws Exception {
47: RSAPublicKeySpec rsaPubKeySpec = new RSAPublicKeySpec(
48: new BigInteger(n), new BigInteger(e));
49: PublicKey pubKey = keyFactory.generatePublic(rsaPubKeySpec);
50: signature.initVerify(pubKey);
51: }
52:
53: public void setPrvKey(byte[] d, byte[] n) throws Exception {
54: RSAPrivateKeySpec rsaPrivKeySpec = new RSAPrivateKeySpec(
55: new BigInteger(n), new BigInteger(d));
56: PrivateKey prvKey = keyFactory.generatePrivate(rsaPrivKeySpec);
57: signature.initSign(prvKey);
58: }
59:
60: public byte[] sign() throws Exception {
61: byte[] sig = signature.sign();
62: return sig;
63: }
64:
65: public void update(byte[] foo) throws Exception {
66: signature.update(foo);
67: }
68:
69: public boolean verify(byte[] sig) throws Exception {
70: int i = 0;
71: int j = 0;
72: byte[] tmp;
73:
74: if (sig[0] == 0 && sig[1] == 0 && sig[2] == 0) {
75: j = ((sig[i++] << 24) & 0xff000000)
76: | ((sig[i++] << 16) & 0x00ff0000)
77: | ((sig[i++] << 8) & 0x0000ff00)
78: | ((sig[i++]) & 0x000000ff);
79: i += j;
80: j = ((sig[i++] << 24) & 0xff000000)
81: | ((sig[i++] << 16) & 0x00ff0000)
82: | ((sig[i++] << 8) & 0x0000ff00)
83: | ((sig[i++]) & 0x000000ff);
84: tmp = new byte[j];
85: System.arraycopy(sig, i, tmp, 0, j);
86: sig = tmp;
87: }
88: //System.err.println("j="+j+" "+Integer.toHexString(sig[0]&0xff));
89: return signature.verify(sig);
90: }
91: }
|