CRAM.pm
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:3k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. #  OpenKore - CRAM: Challenge Response Authentication Mechanism
  2. #
  3. #  Copyright (c) 2006 OpenKore Development Team
  4. #
  5. #  This software is open source, licensed under the GNU General Public
  6. #  License, version 2.
  7. #  Basically, this means that you're allowed to modify and distribute
  8. #  this software. However, if you distribute modified versions, you MUST
  9. #  also distribute the source code.
  10. #  See http://www.gnu.org/licenses/gpl.html for the full license.
  11. #########################################################################
  12. ##
  13. # MODULE DESCRIPTION: Challenge Response Authentication Mechanism
  14. #
  15. package Utils::CRAM;
  16. use strict;
  17. use Utils;
  18. # ppm install Digest-SHA-PurePerl
  19. # $digest = hmac_sha256_hex($data, $key);
  20. use Digest::SHA::PurePerl qw(hmac_sha256_hex);
  21. sub new {
  22. my ($class) = @_;
  23. my %self;
  24. return bless %self, $class;
  25. }
  26. #########################################################################
  27. #
  28. # Server functions
  29. #
  30. ##
  31. # String CRAM::challengeString(String accountName, int length)
  32. # accountName: the account name, as it exists in the server's database
  33. # length: the length of the challenge string to be made
  34. # Requires: defined($response)
  35. #
  36. # Returns a randomly generated challenge string
  37. sub challengeString {
  38. my ($self, $accountName, $length) = @_;
  39. $length = 32 unless ($length);
  40. # NOTE: preferably other random-string generators would be used here
  41. my $challengeString = vocalString($length);
  42. # store the challenge string into a hash element for later retrieval
  43. # NOTE: a database entry may also be used here
  44. $self->{$accountName} = $challengeString;
  45. return $challengeString;
  46. }
  47. ##
  48. # boolean CRAM::authenticate(String response)
  49. # response: the response as sent by the party being challenged
  50. # Requires: defined($response)
  51. #
  52. # Returns true if the digest computed matches the digest sent by the party being challenged
  53. sub authenticate {
  54. my ($self, $response) = @_;
  55. my ($accountName, $digest) = split(/ /, $response);
  56. my $challengeString = $self->{$accountName};
  57. # get password from database
  58. my $password = "poseidon"; # temporarily hardcoded - ideally grabbed from a database
  59. # calculate our own notion  of the digest using the provided account name, the password
  60. # as retrieved from the database, and the challengeString that was sent before
  61. my $ownDigest = hmac_sha256_hex($challengeString, $password);
  62. return ($ownDigest eq $digest);
  63. }
  64. #########################################################################
  65. #
  66. # Client functions
  67. #
  68. ##
  69. # String CRAM::encrypt(String accountName, String password, String challengeString)
  70. # accountName: the account name, as it exists in the server's database
  71. # password: the password matching the account name
  72. # challengeString: the challenge string, as sent by the server
  73. # Requires:
  74. # defined($accountName)
  75. # defined($password)
  76. # defined($challengeString)
  77. # Ensures: defined($response)
  78. #
  79. # Encrypt the challenge string sent by the server using the accout name and password.
  80. # Returns a string in this format: <accountName><space><challenge string hashed using the password>
  81. sub encrypt {
  82. my ($self, $accountName, $password, $challengeString) = @_;
  83. # calculate a digest using the password as the key
  84. my $digest = hmac_sha256_hex($challengeString, $password);
  85. # prepend the account name and a space to the digest
  86. my $response = $accountName . ' ' . $digest;
  87. return ($response);
  88. }
  89. 1;