{
  $Project$
  $Workfile$
  $Revision$
  $DateUTC$
  $Id$

  This file is part of the Indy (Internet Direct) project, and is offered
  under the dual-licensing agreement described on the Indy website.
  (http://www.indyproject.org/)

  Copyright:
   (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
  $Log$
}
{
  Rev 1.9    2004.02.07 5:03:08 PM  czhower
  .net fixes.

  Rev 1.8    2004.02.03 5:45:42 PM  czhower
  Name changes

  Rev 1.7    30/1/2004 4:48:52 PM  SGrobety
  Fix problem in win32 version. Now works in both world

  Rev 1.6    1/30/2004 11:57:42 AM  BGooijen
  Compiles in D7

  Rev 1.5    29/1/2004 6:08:58 PM  SGrobety
  Now with extra crunchy DotNet compatibility!

  Rev 1.4    1/21/2004 3:31:18 PM  JPMugaas
  InitComponent

  Rev 1.3    10/19/2003 5:57:14 PM  DSiders
  Added localization comments.

  Rev 1.2    5/15/2003 10:24:04 PM  BGooijen
  Added IdGlobal to uses for pbyte on D5

  Rev 1.1    11/5/2003 10:58:54 AM  SGrobety
  Indy implementation of the CRAM-MD5 authentication protocol

  Rev 1.0    10/5/2003 10:00:00 AM  SGrobety
  Indy implementation of the CRAM-MD5 authentication protocol

  S.G. 9/5/2003: First implementation of the CRAM-MD5 authentication algorythm
}

unit IdSASL_CRAM_MD5;

{
  Refs: RFC 1321 (MD5)
  RFC 2195 (IMAP/POP3 AUTHorize Extension for Simple Challenge/Response)
  IETF draft draft-ietf-ipsec-hmac-md5-txt.00
}

interface
{$i IdCompilerDefines.inc}

uses
  IdSASL,
  IdSASL_CRAMBase,
  IdSASLUserPass;

type

  TIdSASLCRAMMD5 = class(TIdSASLCRAMBase)
  public
    class function BuildKeydAuth(const APassword, AChallenge: string): string; override;
    class function ServiceName: TIdSASLServiceName; override;
    function IsReadyToStart: Boolean; override;
  end;

implementation

uses
  IdFIPS,
  IdGlobal,
  IdGlobalProtocols,
  IdHMACMD5,
  SysUtils;

class function TIdSASLCRAMMD5.BuildKeydAuth(const APassword, AChallenge: string): string;
var
 LHash:TIdHMACMD5;
 LBuffer:TIdBytes;
begin
 LHash:=TIdHMACMD5.Create;
 try
   LHash.Key:=ToBytes(APassword);
   LBuffer:=ToBytes(AChallenge);
   LBuffer:=LHash.HashValue(LBuffer);
   Result:=LowerCase(ToHex(LBuffer));
 finally
  FreeAndNil(LHash);
 end;
end;

function TIdSASLCRAMMD5.IsReadyToStart: Boolean;
begin
  Result := not GetFIPSMode;
end;

class function TIdSASLCRAMMD5.ServiceName: TIdSASLServiceName;
begin
  result := 'CRAM-MD5'; {do not localize}
end;

end.
