| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742 |
- /*
- *********************************************************************************************************
- * uC/Common
- * Common Features for Micrium Stacks
- *
- * Copyright 2013-2020 Silicon Laboratories Inc. www.silabs.com
- *
- * SPDX-License-Identifier: APACHE-2.0
- *
- * This software is subject to an open source license and is distributed by
- * Silicon Laboratories Inc. pursuant to the terms of the Apache License,
- * Version 2.0 available at www.apache.org/licenses/LICENSE-2.0.
- *
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- *
- * uC/Common - Authentication Module (Auth)
- *
- * Filename : auth.c
- * Version : V1.02.00
- *********************************************************************************************************
- * Note(s) : (1) 'goto' statements were used in this software module. Their usage
- * is restricted to cleanup purposes in exceptional program flow (e.g.
- * error handling), in compliance with CERT MEM12-C and MISRA C:2012
- * rules 15.2, 15.3 and 15.4.
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- *********************************************************************************************************
- */
- #include <lib_str.h>
- #include "kal.h"
- #include "auth.h"
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * LOCAL DATA TYPES
- *********************************************************************************************************
- *********************************************************************************************************
- */
- typedef struct auth_user_credentials { /* --------------- AUTH USER CREDENTIALS -------------- */
- AUTH_USER User; /* User structure. */
- CPU_CHAR Pwd[AUTH_PWD_MAX_LENGTH]; /* Password for this user. */
- } AUTH_USER_CREDENTIALS;
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * GLOBAL VARIABLES
- *********************************************************************************************************
- *********************************************************************************************************
- */
- AUTH_USER Auth_RootUser = {
- { 'r', 'o', 'o', 't', '\0' },
- AUTH_RIGHT_ROOT
- };
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * LOCAL GLOBAL VARIABLES
- *********************************************************************************************************
- *********************************************************************************************************
- */
- static KAL_LOCK_HANDLE Auth_LockHandle;
- static CPU_SIZE_T Auth_UserNbr = 1;
- static AUTH_USER_CREDENTIALS Auth_UsersCredentials[AUTH_NB_USERS_MAX] = {
- {
- {
- { 'r', 'o', 'o', 't', '\0' },
- AUTH_RIGHT_ROOT
- },
- { 'a', 'd', 'm', 'i', 'n', '\0' }
- }
- };
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * LOCAL FUNCTION PROTOTYPES
- *********************************************************************************************************
- *********************************************************************************************************
- */
- static CPU_BOOLEAN Auth_GetUserHandler (const CPU_CHAR *p_name,
- AUTH_USER *p_user,
- RTOS_ERR *p_err);
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * GLOBAL FUNCTIONS
- *********************************************************************************************************
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * Auth_Init()
- *
- * Description : (1) Initialize Authentication module:
- *
- * (a) Create Lock.
- *
- * Argument(s) : p_err Pointer to variable that will receive the return error code from this function :
- *
- * --------------- RETURNED BY KAL_LockCreate() --------------
- * See KAL_LockCreate() for additional return error codes.
- *
- * Return(s) : DEF_OK, if initialization was successful.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_Init (RTOS_ERR *p_err)
- {
- CPU_BOOLEAN res = DEF_OK;
- Auth_LockHandle = KAL_LockCreate("Auth Lock",
- KAL_OPT_CREATE_NONE,
- p_err);
- if (*p_err != RTOS_ERR_NONE) {
- res = DEF_FAIL;
- }
- return (res);
- }
- /*
- *********************************************************************************************************
- * Auth_CreateUser()
- *
- * Description : Create a user and fill the user structure provided.
- *
- * Argument(s) : p_name Pointer to user name string.
- *
- * p_pwd Pointer to password string.
- *
- * p_user Pointer to user object to fill.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_INVALID_STR_LEN
- * RTOS_ERR_NO_MORE_RSRC
- * RTOS_ERR_ALREADY_EXISTS
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * Return(s) : DEF_OK, if user created successfully.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : None.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_CreateUser (const CPU_CHAR *p_name,
- const CPU_CHAR *p_pwd,
- AUTH_USER *p_user,
- RTOS_ERR *p_err)
- {
- AUTH_USER_CREDENTIALS *p_user_cred;
- CPU_SIZE_T name_len;
- CPU_SIZE_T pwd_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result = DEF_FAIL;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit;
- }
- name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
- pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
- if (name_len > AUTH_NAME_MAX_LENGTH) {
- *p_err = RTOS_ERR_INVALID_STR_LEN;
- goto exit_release;
- }
- if (pwd_len > AUTH_PWD_MAX_LENGTH) {
- *p_err = RTOS_ERR_INVALID_STR_LEN;
- goto exit_release;
- }
- if (Auth_UserNbr >= AUTH_NB_USERS_MAX) {
- *p_err = RTOS_ERR_NO_MORE_RSRC;
- goto exit_release;
- }
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_name, name_len);
- if (cmp_result == 0) {
- *p_err = RTOS_ERR_ALREADY_EXISTS;
- goto exit_release;
- }
- }
- p_user_cred = &Auth_UsersCredentials[Auth_UserNbr];
- ++Auth_UserNbr;
- name_len = DEF_MIN(name_len + 1, AUTH_NAME_MAX_LENGTH);
- pwd_len = DEF_MIN(pwd_len + 1, AUTH_PWD_MAX_LENGTH);
- (void)Str_Copy_N(p_user_cred->User.Name,
- p_name,
- name_len);
- (void)Str_Copy_N(p_user_cred->Pwd,
- p_pwd,
- pwd_len);
- p_user_cred->User.Rights = AUTH_RIGHT_NONE;
- (void)Str_Copy_N(p_user->Name,
- p_name,
- name_len);
- p_user->Rights = AUTH_RIGHT_NONE;
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- exit_release:
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- /*
- *********************************************************************************************************
- * Auth_ChangePassword()
- *
- * Description : Change the user's password.
- *
- * Argument(s) : p_user Pointer to user object.
- *
- * p_pwd Pointer to the new password.
- *
- * p_as_user Pointer to user that have the permission level to do the action.
- * Must be the same as p_user or the ROOT user.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_INVALID_STR_LEN
- * RTOS_ERR_PERMISSION
- * RTOS_ERR_NOT_FOUND
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * Return(s) : DEF_OK, if password changed successfully.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- #if 0
- CPU_BOOLEAN Auth_ChangePassword ( AUTH_USER *p_user,
- const CPU_CHAR *p_pwd,
- const AUTH_USER *p_as_user,
- RTOS_ERR *p_err)
- {
- CPU_SIZE_T name_len;
- CPU_SIZE_T pwd_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result = DEF_FAIL;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit;
- }
- name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
- pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
- if (pwd_len > AUTH_PWD_MAX_LENGTH) {
- *p_err = RTOS_ERR_INVALID_STR_LEN;
- goto exit_release;
- }
- if ((Str_Cmp(p_as_user->Name, p_user->Name) != 0) &&
- (DEF_BIT_IS_CLR(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_YES)) {
- *p_err = RTOS_ERR_PERMISSION;
- goto exit_release;
- }
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
- if (cmp_result == 0) {
- (void)Str_Copy_N(Auth_UsersCredentials[i].Pwd,
- p_pwd,
- pwd_len);
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- goto exit_release;
- }
- }
- *p_err = RTOS_ERR_NOT_FOUND;
- exit_release:
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- #endif
- /*
- *********************************************************************************************************
- * Auth_GetUser()
- *
- * Description : Get the user structure with the given name.
- *
- * Argument(s) : p_name Pointer to user name string to retrieve.
- *
- * p_user Pointer to user object that will be filled with the data retrieved.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * ------------ RETURNED BY Auth_GetUserHandler() ------------
- * See Auth_GetUserHandler() for additional return error codes.
- *
- * Return(s) : DEF_OK, if user was successfully found.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_GetUser (const CPU_CHAR *p_name,
- AUTH_USER *p_user,
- RTOS_ERR *p_err)
- {
- CPU_BOOLEAN result;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- result = DEF_FAIL;
- goto exit;
- }
- result = Auth_GetUserHandler(p_name, p_user, p_err);
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- /*
- *********************************************************************************************************
- * Auth_ValidateCredentials()
- *
- * Description : Validates the user and password tuple with known users.
- *
- * Argument(s) : p_name Pointer to user name string.
- *
- * p_pwd Pointer to password string.
- *
- * p_user Pointer to user object that will be filled with the data retrieved.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_INVALID_STR_LEN
- * RTOS_ERR_INVALID_CREDENTIALS
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * Return(s) : DEF_OK, if credentials are valid.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_ValidateCredentials (const CPU_CHAR *p_name,
- const CPU_CHAR *p_pwd,
- AUTH_USER *p_user,
- RTOS_ERR *p_err)
- {
- CPU_SIZE_T name_len;
- CPU_SIZE_T pwd_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result = DEF_FAIL;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit;
- }
- name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
- pwd_len = Str_Len_N(p_pwd, AUTH_PWD_MAX_LENGTH + 1);
- if (name_len > AUTH_NAME_MAX_LENGTH) {
- *p_err = RTOS_ERR_INVALID_STR_LEN;
- goto exit_release;
- }
- if (pwd_len > AUTH_PWD_MAX_LENGTH) {
- *p_err = RTOS_ERR_INVALID_STR_LEN;
- goto exit_release;
- }
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_name, name_len);
- if (cmp_result == 0) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].Pwd, p_pwd, pwd_len);
- if (cmp_result == 0) {
- (void)Str_Copy_N(p_user->Name, p_name, name_len);
- p_user->Rights = Auth_UsersCredentials[i].User.Rights;
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- goto exit_release;
- }
- break;
- }
- }
- *p_err = RTOS_ERR_INVALID_CREDENTIALS;
- exit_release:
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- /*
- *********************************************************************************************************
- * Auth_GrantRight()
- *
- * Description : Grants a right to a user as another user (limits the rights granted).
- *
- * Argument(s) : right New right to grant.
- *
- * p_user Pointer to user object that will received the new right.
- *
- * p_as_user Pointer to user that has the permission level to do the action.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_PERMISSION
- * RTOS_ERR_NOT_FOUND
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * ------------ RETURNED BY Auth_GetUserHandler() ------------
- * See Auth_GetUserHandler() for additional return error codes.
- *
- * Return(s) : DEF_OK, if right was granted successfully.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_GrantRight (AUTH_RIGHT right,
- AUTH_USER *p_user,
- AUTH_USER *p_as_user,
- RTOS_ERR *p_err)
- {
- CPU_SIZE_T name_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result = DEF_FAIL;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit;
- }
- (void)Auth_GetUserHandler(p_as_user->Name, p_as_user, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit_release;
- }
- if (((DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_MNG) == DEF_NO) ||
- (DEF_BIT_IS_SET(p_as_user->Rights, right) == DEF_NO)) &&
- (DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_NO)) {
- *p_err = RTOS_ERR_PERMISSION;
- goto exit_release;
- }
- name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
- if (cmp_result == 0) {
- DEF_BIT_SET(Auth_UsersCredentials[i].User.Rights, right);
- p_user->Rights = Auth_UsersCredentials[i].User.Rights;
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- goto exit_release;
- }
- }
- *p_err = RTOS_ERR_NOT_FOUND;
- exit_release:
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- /*
- *********************************************************************************************************
- * Auth_RevokeRight()
- *
- * Description : Revokes the right of a specified user.
- *
- * Argument(s) : right Right to revoke.
- *
- * p_user Pointer to user object which right will be revoked.
- *
- * p_as_user Pointer to user that has the permission level to do the action.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_PERMISSION
- * RTOS_ERR_NOT_FOUND
- *
- * ----------- RETURNED BY KAL_LockAcquire/Release() ---------
- * See KAL_LockAcquire/Release() for additional return error codes.
- *
- * ------------ RETURNED BY Auth_GetUserHandler() ------------
- * See Auth_GetUserHandler() for additional return error codes.
- *
- * Return(s) : DEF_OK, if right was revoked successfully.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- CPU_BOOLEAN Auth_RevokeRight (AUTH_RIGHT right,
- AUTH_USER *p_user,
- AUTH_USER *p_as_user,
- RTOS_ERR *p_err)
- {
- CPU_SIZE_T name_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result = DEF_FAIL;
- RTOS_ERR local_err;
- KAL_LockAcquire(Auth_LockHandle, KAL_OPT_PEND_NONE, KAL_TIMEOUT_INFINITE, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit;
- }
- (void)Auth_GetUserHandler(p_as_user->Name, p_as_user, p_err);
- if (*p_err != RTOS_ERR_NONE) {
- goto exit_release;
- }
- /* This implementation allows the ROOT user ... */
- /* ... to revoke it's own ROOT right. */
- if (((DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_MNG) == DEF_NO) ||
- (DEF_BIT_IS_SET(p_as_user->Rights, right) == DEF_NO) ) &&
- (DEF_BIT_IS_SET(p_as_user->Rights, AUTH_RIGHT_ROOT) == DEF_NO ) ) {
- *p_err = RTOS_ERR_PERMISSION;
- goto exit_release;
- }
- name_len = Str_Len_N(p_user->Name, AUTH_NAME_MAX_LENGTH + 1);
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
- if (cmp_result == 0) {
- DEF_BIT_CLR(Auth_UsersCredentials[i].User.Rights, right);
- p_user->Rights = Auth_UsersCredentials[i].User.Rights;
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- goto exit_release;
- }
- }
- *p_err = RTOS_ERR_NOT_FOUND;
- exit_release:
- KAL_LockRelease(Auth_LockHandle, &local_err);
- (void)local_err;
- exit:
- return (result);
- }
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * LOCAL FUNCTIONS
- *********************************************************************************************************
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * Auth_GetUserHandler()
- *
- * Description : Get the user structure with the given name.
- *
- * Argument(s) : p_name Pointer to user name string to retrieve.
- *
- * p_user Pointer to user object that will be filled with the data retrieved.
- *
- * p_err Pointer to variable that will receive the return error code from this function :
- *
- * RTOS_ERR_NONE
- * RTOS_ERR_NOT_FOUND
- *
- * Return(s) : DEF_OK, if user was successfully found.
- * DEF_FAIL, otherwise.
- *
- * Note(s) : None.
- *********************************************************************************************************
- */
- static CPU_BOOLEAN Auth_GetUserHandler (const CPU_CHAR *p_name,
- AUTH_USER *p_user,
- RTOS_ERR *p_err)
- {
- CPU_SIZE_T name_len;
- CPU_SIZE_T i;
- CPU_INT16S cmp_result;
- CPU_BOOLEAN result;
- name_len = Str_Len_N(p_name, AUTH_NAME_MAX_LENGTH + 1);
- for (i = 0; i < Auth_UserNbr; ++i) {
- cmp_result = Str_Cmp_N(Auth_UsersCredentials[i].User.Name, p_user->Name, name_len);
- if (cmp_result == 0) {
- (void)Str_Copy_N(p_user->Name,
- Auth_UsersCredentials[i].User.Name,
- name_len);
- p_user->Rights = Auth_UsersCredentials[i].User.Rights;
- result = DEF_OK;
- *p_err = RTOS_ERR_NONE;
- goto exit;
- }
- }
- result = DEF_FAIL;
- *p_err = RTOS_ERR_NOT_FOUND;
- exit:
- return (result);
- }
|