1 2 29 30 package com.jcraft.jsch.jcraft; 31 32 import java.security.*; 33 34 class HMAC{ 35 36 46 private static final int B=64; 47 private byte[] k_ipad=null; 48 private byte[] k_opad=null; 49 50 private MessageDigest md=null; 51 52 private int bsize=0; 53 54 protected void setH(MessageDigest md){ 55 this.md=md; 56 bsize=md.getDigestLength(); 57 } 58 59 public int getBlockSize(){return bsize;}; 60 public void init(byte[] key) throws Exception { 61 if(key.length>bsize){ 62 byte[] tmp=new byte[bsize]; 63 System.arraycopy(key, 0, tmp, 0, bsize); 64 key=tmp; 65 } 66 67 68 if(key.length>B){ 69 md.update(key, 0, key.length); 70 key=md.digest(); 71 } 72 73 k_ipad=new byte[B]; 74 System.arraycopy(key, 0, k_ipad, 0, key.length); 75 k_opad=new byte[B]; 76 System.arraycopy(key, 0, k_opad, 0, key.length); 77 78 79 for(int i=0; i<B; i++) { 80 k_ipad[i]^=(byte)0x36; 81 k_opad[i]^=(byte)0x5c; 82 } 83 84 md.update(k_ipad, 0, B); 85 } 86 87 private final byte[] tmp=new byte[4]; 88 public void update(int i){ 89 tmp[0]=(byte)(i>>>24); 90 tmp[1]=(byte)(i>>>16); 91 tmp[2]=(byte)(i>>>8); 92 tmp[3]=(byte)i; 93 update(tmp, 0, 4); 94 } 95 96 public void update(byte foo[], int s, int l){ 97 md.update(foo, s, l); 98 } 99 100 public void doFinal(byte[] buf, int offset){ 101 byte[] result=md.digest(); 102 md.update(k_opad, 0, B); 103 md.update(result, 0, bsize); 104 try{md.digest(buf, offset, bsize);}catch(Exception e){} 105 md.update(k_ipad, 0, B); 106 } 107 } 108 | Popular Tags |