Index: perl/lib/Net/Jabber/Key.pm
===================================================================
--- perl/lib/Net/Jabber/Key.pm	(revision 0ff8d110c15c82bd1a982de30adadd5000de850b)
+++ perl/lib/Net/Jabber/Key.pm	(revision 0ff8d110c15c82bd1a982de30adadd5000de850b)
@@ -0,0 +1,176 @@
+##############################################################################
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Library General Public
+#  License as published by the Free Software Foundation; either
+#  version 2 of the License, or (at your option) any later version.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Library General Public License for more details.
+#
+#  You should have received a copy of the GNU Library General Public
+#  License along with this library; if not, write to the
+#  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+#  Boston, MA  02111-1307, USA.
+#
+#  Jabber
+#  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/
+#
+##############################################################################
+
+package Net::Jabber::Key;
+
+=head1 NAME
+
+Net::Jabber::Key - Jabber Key Library
+
+=head1 SYNOPSIS
+
+  Net::Jabber::Key is a module that provides a developer easy access
+  to generating, caching, and comparing keys.
+
+=head1 DESCRIPTION
+
+  Key.pm is a helper module for the Net::Jabber::Transport.  When the
+  Transport talks to a Client it sends a key and expects to get that
+  key back from the Client.  This module provides an API to generate,
+  cache, and then compare the key send from the Client.
+
+=head2 Basic Functions
+
+    $Key = new Net::Jabber::Key();
+
+    $key = $Key->Generate();
+
+    $key = $Key->Create("bob\@jabber.org");
+
+    $test = $Key->Compare("bob\@jabber.org","some key");
+
+=head1 METHODS
+
+=head2 Basic Functions
+
+    new(debug=>string,       - creates the Key object.  debug should
+        debugfh=>FileHandle,   be set to the path for the debug
+        debuglevel=>integer)   log to be written.  If set to "stdout" 
+                               then the debug will go there.  Also, you
+                               can specify a filehandle that already
+                               exists and use that.  debuglevel controls
+                               the amount of debug.  0 is none, 1 is
+                               normal, 2 is all.
+
+    Generate() - returns a key in Digest SHA1 form based on the current
+                 time and the PID.
+
+    Create(cacheString) - generates a key and caches it with the key 
+                          of cacheString.  Create returns the key.
+
+    Compare(cacheString, - compares the key stored in the cache under
+            keyString)     cacheString with the keyString.  Returns 1
+                           if they match, and 0 otherwise.
+
+=head1 AUTHOR
+
+By Ryan Eatmon in May of 2000 for http://jabber.org.
+
+=head1 COPYRIGHT
+
+This module is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+require 5.003;
+use strict;
+use FileHandle;
+use vars qw($VERSION);
+
+$VERSION = "2.0";
+
+sub new
+{
+    srand( time() ^ ($$ + ($$ << 15)));
+
+    my $proto = shift;
+    my $self = { };
+
+    $self->{DEBUG} = new Net::Jabber::Debug(usedefault=>1,
+                      header=>"NJ::Key");
+
+    $self->{VERSION} = $VERSION;
+    
+    $self->{CACHE} = {};
+
+    if (eval "require Digest::SHA1")
+    {
+        $self->{DIGEST} = 1;
+        Digest::SHA1->import(qw(sha1 sha1_hex sha1_base64));
+    }
+    else
+    {
+        print "ERROR:  You cannot use Key.pm unless you have Digest::SHA1 installed.\n";
+        exit(0);
+    }
+
+    bless($self, $proto);
+    return $self;
+}
+
+
+###########################################################################
+#
+# Generate - returns a random string based on the PID and time and a 
+#            random number.  Then it creates an SHA1 Digest of that 
+#            string and returns it.
+#
+###########################################################################
+sub Generate
+{
+    my $self = shift;
+
+    my $string = $$.time.rand(1000000);
+    $string = Digest::SHA1::sha1_hex($string);
+    $self->{DEBUG}->Log1("Generate: key($string)");
+    return $string;
+}
+
+
+##############################################################################
+#
+# Create - Creates a key and caches the id for comparison later.
+#
+##############################################################################
+sub Create
+{
+    my $self = shift;
+    my ($cacheString) = @_;
+
+    $self->{DEBUG}->Log1("Create: cacheString($cacheString)");
+    my $key = $self->Generate();
+    $self->{DEBUG}->Log1("Create: key($key)");
+    $self->{CACHE}->{$cacheString} = $key;
+    return $key;
+}
+
+
+##############################################################################
+#
+# Compare - Compares the key with the key in the cache.
+#
+##############################################################################
+sub Compare
+{
+    my $self = shift;
+    my ($cacheString,$key) = @_;
+
+    $self->{DEBUG}->Log1("Compare: cacheString($cacheString) key($key)");
+    my $cacheKey = delete($self->{CACHE}->{$cacheString});
+    $self->{DEBUG}->Log1("Compare: cacheKey($cacheKey)");
+    return ($key eq $cacheKey);
+}
+
+
+
+1;
