Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Radius authentication passphrase length

    Scheduled Pinned Locked Moved Captive Portal
    45 Posts 4 Posters 22.3k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B Offline
      buraglio
      last edited by

      In reading the RFC (http://www.faqs.org/rfcs/rfc2865.html Section 5.2), it sounds like it's skipping the second step to me:

      If the password is longer than 16 characters, a second one-way MD5
            hash is calculated over a stream of octets consisting of the
            shared secret followed by the result of the first xor.  That hash
            is XORed with the second 16 octet segment of the password and
            placed in the second 16 octets of the String field of the User-
            Password Attribute.

      If necessary, this operation is repeated, with each xor result
            being used along with the shared secret to generate the next hash
            to xor the next segment of the password, to no more than 128
            characters.

      This isn't really my core competency so I may be wrong.

      https://www.forwardingplane.net/

      1 Reply Last reply Reply Quote 0
      • S Offline
        sullrich
        last edited by

        @buraglio:

        In reading the RFC (http://www.faqs.org/rfcs/rfc2865.html Section 5.2), it sounds like it's skipping the second step to me:       
             
              If the password is longer than 16 characters, a second one-way MD5
              hash is calculated over a stream of octets consisting of the
              shared secret followed by the result of the first xor.  That hash
              is XORed with the second 16 octet segment of the password and
              placed in the second 16 octets of the String field of the User-
              Password Attribute.

        If necessary, this operation is repeated, with each xor result
              being used along with the shared secret to generate the next hash
              to xor the next segment of the password, to no more than 128
              characters.

        This isn't really my core competency so I may be wrong.

        Heh.  We'll definately want to get these fixes back to m0n0wall once this is settled.

        1 Reply Last reply Reply Quote 0
        • B Offline
          buraglio
          last edited by

          I'm going to do more reading on it.  Do you believe that the asumption that it is skipping the second step (as referenced above) is correct?

          https://www.forwardingplane.net/

          1 Reply Last reply Reply Quote 0
          • S Offline
            sullrich
            last edited by

            @buraglio:

            I'm going to do more reading on it.  Do you believe that the asumption that it is skipping the second step (as referenced above) is correct?

            Yep.

            1 Reply Last reply Reply Quote 0
            • B Offline
              billm
              last edited by

              OK, I have something for you to test - it's not complete, but it'll allow you (hopefully) to test passwords up to 32 chars.  If it works, I'll clean it up a bit and make it support the full 128 chars we should.

              http://www.pfsense.org/~billm/radius_auth.diff

              –Bill

              pfSense core developer
              blog - http://www.ucsecurity.com/
              twitter - billmarquette

              1 Reply Last reply Reply Quote 0
              • B Offline
                buraglio
                last edited by

                Excellent, I'll patch and have some results for you by early tomorrow.

                nb

                https://www.forwardingplane.net/

                1 Reply Last reply Reply Quote 0
                • B Offline
                  billm
                  last edited by

                  Just updated the patch - should work up to 128 chars now.  I'll run some quick tests through it myself.

                  –Bill

                  pfSense core developer
                  blog - http://www.ucsecurity.com/
                  twitter - billmarquette

                  1 Reply Last reply Reply Quote 0
                  • B Offline
                    buraglio
                    last edited by

                    What version are you patching this against?  I'm running BETA2 (BETA4 has issues booting on my dell 2850's) and had some errors with redirection after applying the patch.  I updated to the /usr/local/captiveportal in CVS (as well as added the authLDAP.inc that it requires) but still have some errors.  I'd like to mirror what you have been testing on if possible to rule out any version issues.

                    https://www.forwardingplane.net/

                    1 Reply Last reply Reply Quote 0
                    • B Offline
                      billm
                      last edited by

                      @buraglio:

                      What version are you patching this against?  I'm running BETA2 (BETA4 has issues booting on my dell 2850's) and had some errors with redirection after applying the patch.  I updated to the /usr/local/captiveportal in CVS (as well as added the authLDAP.inc that it requires) but still have some errors.  I'd like to mirror what you have been testing on if possible to rule out any version issues.

                      I don't have the box in front of my now that I'm at work, but it should apply cleanly against revision 1.12.2.1 of radius_authentication.inc:
                      http://pfsense.com/cgi-bin/cvsweb.cgi/pfSense/usr/local/captiveportal/radius_authentication.inc?rev=1.12.2.1;content-type=text%2Fplain

                      Here's the patched Encrypt() function (all I changed)

                      
                      /*
                       * $password = users password
                       * $key = shared secret
                       * $RA = Request Authenticator (random value it seems like)
                       */
                      function Encrypt($password,$key,$RA) {
                              global $debug;
                      
                              if ($debug)
                                  echo "
                      key: $key
                      password: $password
                      
                      * * *
                      
                      \n";
                      
                              $output="";
                              $passlen = strlen($password);
                              /* figure out the number of xor rounds we need to run through */
                              for ($i=16; $i <= 128; $i += 16) {
                                      if ($len <= $i) {
                                              $rounds = $i/16;
                                              break;
                                      }
                              }
                      
                              $z = 0; // How many chars have we xor'd
                              for ($x=1; $x<=$rounds; $x++) {
                                      $keyRA=$key.$RA;
                                      $md5checksum=md5($keyRA);
                      
                                      // Loop 16 times (md5() output / 2)
                                      // This limits the effective password to 16 characters - is this really in the radius spec???
                                      for ($i=0;$i<=15;$i++) {
                                              // Convert md5 hex output to decimal (md5 lengths are 32 chars)
                                              if (2*$i>32) $m=0; else $m=hexdec(substr($md5checksum,2*$i,2));
                                              // get the decimal character value for this character in the password
                                              if ($z>$passlen-1) $p=0; else $p=ord(substr($password,$z,1));
                                              // xor the md5 character with the password character
                                              $c=$m^$p;
                                              // Convert back to 8-bit output
                                              $output.=chr($c);
                                              $z++;
                                      }
                                      $RA=$output;
                              }
                      
                              return $output;
                      }
                      
                      

                      –Bill

                      pfSense core developer
                      blog - http://www.ucsecurity.com/
                      twitter - billmarquette

                      1 Reply Last reply Reply Quote 0
                      • B Offline
                        buraglio
                        last edited by

                        OK, I got it all cleaned up and patched it.  It is yielding the same error from the debug info.  From the debug output it looks liek it's grabbing 16 characters.

                        "username is blahblah with len 8 encryptedpassword is …........with len 16 ........"

                        https://www.forwardingplane.net/

                        1 Reply Last reply Reply Quote 0
                        • B Offline
                          billm
                          last edited by

                          Any debug from the Encrypt() function?  I tested it with 15-17 character passwords and it seemed to do the right thing there.  I don't have a way to test against RADIUS, but the function looks good now :-/

                          –Bill

                          pfSense core developer
                          blog - http://www.ucsecurity.com/
                          twitter - billmarquette

                          1 Reply Last reply Reply Quote 0
                          • B Offline
                            buraglio
                            last edited by

                            No real debug info from the Encrypt() function.  I can dig a little deeper.  I can also give you access to the box if you'd like.

                            https://www.forwardingplane.net/

                            1 Reply Last reply Reply Quote 0
                            • B Offline
                              buraglio
                              last edited by

                              So it does allow for shorter paswords but generates some errors:

                              
                              radius-port: 1812
                              radius-host: 10.10.102.2
                              username: blahblah
                              
                              key: TestRadiusKey
                              password: testpasswd
                              username is blahblah with len 8 encryptedpassword is šJ»[à6%¤2ÍǃhÄ with len 10 nasHostname is portal-a.lab.local with len 18 
                              writing 95 bytes
                              
                              Warning: Cannot modify header information - headers already sent by (output started at /usr/local/captiveportal/radius_authentication.inc:48) in /usr/local/captiveportal/index.php on line 335 
                              radius-port: 1813
                              radius-host: 10.10.2.25
                              username: blahblah
                              
                              username is blahblah with len 8 nasHostname is portal-a.lab.local with len 18 
                              writing 113 bytes
                              [/code]
                              
                              The errors on the RADIUS server for a >16 char passphrase are as i'd expect for an incorrect passphrase.  
                              
                              

                              https://www.forwardingplane.net/

                              1 Reply Last reply Reply Quote 0
                              • B Offline
                                billm
                                last edited by

                                @buraglio:

                                No real debug info from the Encrypt() function.  I can dig a little deeper.  I can also give you access to the box if you'd like.

                                It'd be helpful to be able to point at a radius server with an account that has a 17 (or larger) character password.  I've got no way of testing that I'm following the RFC correctly - 16 and under still work with the new code I assume?

                                –Bill

                                pfSense core developer
                                blog - http://www.ucsecurity.com/
                                twitter - billmarquette

                                1 Reply Last reply Reply Quote 0
                                • B Offline
                                  buraglio
                                  last edited by

                                  It authenticates with the new code with a RADIUS box with >=16 passwords but the redirection after fails with some php errors.  I assume that is a cosmetic fix and not critical.  I can work on getting a radius box up probably tomorrow if that'd be helpful.

                                  https://www.forwardingplane.net/

                                  1 Reply Last reply Reply Quote 0
                                  • B Offline
                                    billm
                                    last edited by

                                    @buraglio:

                                    It authenticates with the new code with a RADIUS box with >=16 passwords but the redirection after fails with some php errors.  I assume that is a cosmetic fix and not critical.  I can work on getting a radius box up probably tomorrow if that'd be helpful.

                                    So it now authenticates accounts with > 16 char passwords?  And authenticates accounts with < 16 char passwords?  Only a PHP error to cleanup?  Good news.  Maybe the PHP error is coming from the $debug define.

                                    –Bill

                                    pfSense core developer
                                    blog - http://www.ucsecurity.com/
                                    twitter - billmarquette

                                    1 Reply Last reply Reply Quote 0
                                    • B Offline
                                      buraglio
                                      last edited by

                                      @billm:

                                      @buraglio:

                                      It authenticates with the new code with a RADIUS box with >=16 passwords but the redirection after fails with some php errors.  I assume that is a cosmetic fix and not critical.  I can work on getting a radius box up probably tomorrow if that'd be helpful.

                                      So it now authenticates accounts with > 16 char passwords?  And authenticates accounts with < 16 char passwords?  Only a PHP error to cleanup?  Good news.  Maybe the PHP error is coming from the $debug define.

                                      –Bill

                                      Actually it only authenticates 16 char or below passwords.  I mistyped.  Sorry.

                                      https://www.forwardingplane.net/

                                      1 Reply Last reply Reply Quote 0
                                      • B Offline
                                        buraglio
                                        last edited by

                                        Has anyone else noticed this behavior?  Would it be beneficial for me to set up a RADIUS box and give you access to test against?

                                        https://www.forwardingplane.net/

                                        1 Reply Last reply Reply Quote 0
                                        • S Offline
                                          sullrich
                                          last edited by

                                          @buraglio:

                                          Has anyone else noticed this behavior?  Would it be beneficial for me to set up a RADIUS box and give you access to test against?

                                          Yes, please do.  Bill does not have access to a tesitng environment for this.

                                          1 Reply Last reply Reply Quote 0
                                          • B Offline
                                            billm
                                            last edited by

                                            @buraglio:

                                            Has anyone else noticed this behavior?  Would it be beneficial for me to set up a RADIUS box and give you access to test against?

                                            If you can provide me a radius target I can test this myself.

                                            –Bill

                                            pfSense core developer
                                            blog - http://www.ucsecurity.com/
                                            twitter - billmarquette

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.