auth.c
来自「开放源码实时操作系统源码.」· C语言 代码 · 共 505 行 · 第 1/2 页
C
505 行
/* =================================================================
*
* auth.c
*
* Handles basic authentication.
*
* =================================================================
* ####ECOSGPLCOPYRIGHTBEGIN####
* -------------------------------------------
* This file is part of eCos, the Embedded Configurable Operating
* System.
* Copyright (C) 2005 eCosCentric Ltd.
*
* eCos is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 or (at your option)
* any later version.
*
* eCos 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with eCos; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* As a special exception, if other files instantiate templates or
* use macros or inline functions from this file, or you compile this
* file and link it with other works to produce a work based on this
* file, this file does not by itself cause the resulting work to be
* covered by the GNU General Public License. However the source code
* for this file must still be made available in accordance with
* section (3) of the GNU General Public License.
*
* This exception does not invalidate any other reasons why a work
* based on this file might be covered by the GNU General Public
* License.
*
* -------------------------------------------
* ####ECOSGPLCOPYRIGHTEND####
* =================================================================
* #####DESCRIPTIONBEGIN####
*
* Author(s): Anthony Tonizzo (atonizzo@gmail.com)
* Contributors:
* Date: 2006-06-12
* Purpose:
* Description:
*
* ####DESCRIPTIONEND####
*
* =================================================================
*/
#include <pkgconf/hal.h>
#include <pkgconf/kernel.h>
#include <cyg/kernel/kapi.h> // Kernel API.
#include <cyg/hal/hal_tables.h>
#include <stdio.h>
#include <network.h>
#include <string.h>
#include <cyg/athttpd/http.h>
#include <cyg/athttpd/md5.h>
// This is a string that contains the domain that is currently authorized.
cyg_uint8 *cyg_httpd_current_authName;
CYG_HAL_TABLE_BEGIN(cyg_httpd_auth_table, httpd_auth_table );
CYG_HAL_TABLE_END(cyg_httpd_auth_table_end, httpd_auth_table );
__externC cyg_httpd_auth_table_entry cyg_httpd_auth_table[];
__externC cyg_httpd_auth_table_entry cyg_httpd_auth_table_end[];
// Variables used for authorization.
char cyg_httpd_md5_nonce[33];
char cyg_httpd_md5_digest[33];
char cyg_httpd_md5_response[33];
char cyg_httpd_md5_cnonce[33];
char cyg_httpd_md5_noncecount[9];
char cyg_httpd_md5_ha2[HASHHEXLEN+1] = {'\0'};
char cyg_httpd_md5_ha1[HASHHEXLEN+1];
char b64string[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
cyg_httpd_auth_table_entry*
cyg_httpd_auth_entry_from_path(char *authPath)
{
cyg_httpd_auth_table_entry *entry = cyg_httpd_auth_table;
if (strcmp(authPath, "/") != 0)
while (entry != cyg_httpd_auth_table_end)
{
if (strncmp(entry->auth_dirname,
authPath,
strlen(entry->auth_dirname)) == 0)
return entry;
entry++;
}
else
while (entry != cyg_httpd_auth_table_end)
{
if (strcmp(entry->auth_dirname, authPath) == 0)
return entry;
entry++;
}
return (cyg_httpd_auth_table_entry *)0;
}
cyg_httpd_auth_table_entry*
cyg_httpd_auth_entry_from_domain(char *authDomain)
{
cyg_httpd_auth_table_entry *entry = cyg_httpd_auth_table;
while (entry != cyg_httpd_auth_table_end)
{
if (!strncmp((const char*)authDomain,
entry->auth_domainname,
strlen(entry->auth_domainname)))
return entry;
entry++;
}
return (cyg_httpd_auth_table_entry *)0;
}
cyg_int32
cyg_httpd_base64_encode(char* to, char* from, cyg_uint32 len )
{
char *fromp = from;
char *top = to;
char cbyte;
char obyte;
cyg_int8 end[3];
for (; len >= 3; len -= 3)
{
cbyte = *fromp++;
*top++ = b64string[(int)(cbyte >> 2)];
obyte = (cbyte << 4) & 0x30;
cbyte = *fromp++;
obyte |= (cbyte >> 4);
*top++ = b64string[(cyg_int32)obyte];
obyte = (cbyte << 2) & 0x3C;
cbyte = *fromp++;
obyte |= (cbyte >> 6);
*top++ = b64string[(cyg_int32)obyte];
*top++ = b64string[(cyg_int32)(cbyte & 0x3F)];
}
if (len)
{
end[0] = *fromp++;
if (--len )
end[1] = *fromp++;
else
end[1] = 0;
end[2] = 0;
cbyte = end[0];
*top++ = b64string[(cyg_int32)(cbyte >> 2)];
obyte = (cbyte << 4) & 0x30;
cbyte = end[1];
obyte |= (cbyte >> 4);
*top++ = b64string[(cyg_int32)obyte];
obyte = (cbyte << 2) & 0x3C;
if (len )
*top++ = b64string[(cyg_int32)obyte];
else
*top++ = '=';
*top++ = '=';
}
*top = 0;
return top - to;
}
cyg_int32
cyg_httpd_base64_decode(char* to, char* from, cyg_uint32 len )
{
char *fromp = from;
char *top = to;
char *p;
char cbyte;
char obyte;
cyg_int32 padding = 0;
for (; len >= 4; len -= 4)
{
if ((cbyte = *fromp++) == '=')
cbyte = 0;
else
{
if (badchar(cbyte, p ) )
return -1;
cbyte = (p - b64string);
}
obyte = cbyte << 2;
if ((cbyte = *fromp++) == '=')
cbyte = 0;
else
{
if (badchar(cbyte, p))
return -1;
cbyte = p - b64string;
}
obyte |= cbyte >> 4;
*top++ = obyte;
obyte = cbyte << 4;
if ((cbyte = *fromp++) == '=')
{
cbyte = 0;
padding++;
}
else
{
padding = 0;
if (badchar(cbyte, p))
return -1;
cbyte = p - b64string;
}
obyte |= cbyte >> 2;
*top++ = obyte;
obyte = cbyte << 6;
if ((cbyte = *fromp++) == '=')
{
cbyte = 0;
padding++;
}
else
{
padding = 0;
if (badchar(cbyte, p))
return -1;
cbyte = p - b64string;
}
obyte |= cbyte;
*top++ = obyte;
}
*top = 0;
if (len)
return -1;
return (top - to) - padding;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?