code: public void
  applyStream(Message m, TSIGRecord old, boolean first) {
  	if (first) {
  		apply(m, old);
  		return;
  	}
  	Date timeSigned = new Date();
  	int fudge;
  	hmac.reset();
  
  	fudge = Options.intValue("tsigfudge");
  	if (fudge < 0 || fudge > 0x7FFF)
  		fudge = FUDGE;
  
  	DNSOutput out = new DNSOutput();
  	out.writeU16(old.getSignature().length);
  	hmac.update(out.toByteArray());
  	hmac.update(old.getSignature());
  
  	/* Digest the message */
  	hmac.update(m.toWire());
  
  	out = new DNSOutput();
  	long time = timeSigned.getTime() / 1000;
  	int timeHigh = (int) (time >> 32);
  	long timeLow = (time & 0xFFFFFFFFL);
  	out.writeU16(timeHigh);
  	out.writeU32(timeLow);
  	out.writeU16(fudge);
  
  	hmac.update(out.toByteArray());
  
  	byte [] signature = hmac.doFinal();
  	byte [] other = null;
  
  	Record r = new TSIGRecord(name, DClass.ANY, 0, alg, timeSigned, fudge,
  				  signature, m.getHeader().getID(),
  				  Rcode.NOERROR, other);
  	m.addRecord(r, Section.ADDITIONAL);
  	m.tsigState = Message.TSIG_SIGNED;
  }
docs: Generates a TSIG record for a message and adds it to the message
  @param m The message
  @param old If this message is a response, the TSIG from the request