LCOV - code coverage report
Current view: top level - tests/cmocka - test_authtok.c (source / functions) Hit Total Coverage
Test: .coverage.total Lines: 276 279 98.9 %
Date: 2015-10-19 Functions: 14 14 100.0 %

          Line data    Source code
       1             : /*
       2             :     SSSD
       3             : 
       4             :     authtok - Utilities tests
       5             : 
       6             :     Authors:
       7             :         Pallavi Jha <pallavikumarijha@gmail.com>
       8             : 
       9             :     Copyright (C) 2013 Red Hat
      10             : 
      11             :     This program is free software; you can redistribute it and/or modify
      12             :     it under the terms of the GNU General Public License as published by
      13             :     the Free Software Foundation; either version 3 of the License, or
      14             :     (at your option) any later version.
      15             : 
      16             :     This program is distributed in the hope that it will be useful,
      17             :     but WITHOUT ANY WARRANTY; without even the implied warranty of
      18             :     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19             :     GNU General Public License for more details.
      20             : 
      21             :     You should have received a copy of the GNU General Public License
      22             :     along with this program.  If not, see <http://www.gnu.org/licenses/>.
      23             : */
      24             : 
      25             : #include <string.h>
      26             : #include <popt.h>
      27             : 
      28             : #include "tests/cmocka/common_mock.h"
      29             : 
      30             : #include "util/authtok.h"
      31             : 
      32             : 
      33             : struct test_state {
      34             :     struct sss_auth_token *authtoken;
      35             : };
      36             : 
      37          11 : static int setup(void **state)
      38             : {
      39          11 :     struct test_state *ts = NULL;
      40             : 
      41          11 :     assert_true(leak_check_setup());
      42             : 
      43          11 :     ts = talloc(global_talloc_context, struct test_state);
      44          11 :     assert_non_null(ts);
      45             : 
      46          11 :     ts->authtoken = sss_authtok_new(ts);
      47          11 :     assert_non_null(ts->authtoken);
      48             : 
      49          11 :     check_leaks_push(ts);
      50          11 :     *state = (void *)ts;
      51          11 :     return 0;
      52             : }
      53             : 
      54          11 : static int teardown(void **state)
      55             : {
      56          11 :     struct test_state *ts = talloc_get_type_abort(*state, struct test_state);
      57             : 
      58          11 :     assert_non_null(ts);
      59             : 
      60          11 :     assert_true(check_leaks_pop(ts));
      61          11 :     talloc_free(ts);
      62          11 :     assert_true(leak_check_teardown());
      63          11 :     return 0;
      64             : }
      65             : 
      66           1 : static void test_sss_authtok_new(void **state)
      67             : {
      68           1 :     struct test_state *ts = talloc_get_type_abort(*state, struct test_state);
      69             :     struct sss_auth_token *authtoken;
      70             : 
      71           1 :     authtoken = sss_authtok_new(ts);
      72           1 :     assert_non_null(authtoken);
      73             : 
      74           1 :     talloc_free(authtoken);
      75           1 : }
      76             : 
      77             : /* @test_authtok_type_x : tests following functions for different value of type
      78             :  * sss_authtok_set
      79             :  * sss_authtok_get_type
      80             :  * sss_authtok_get_size
      81             :  * sss_authtok_get_data
      82             :  * sss_authtok_get_password
      83             :  * sss_authtok_get_ccfile
      84             :  *
      85             :  * @test_authtok_type_password : type => SSS_AUTHTOK_TYPE_PASSWORD
      86             :  * @test_authtok_type_ccfile   : type => SSS_AUTHTOK_TYPE_CCFILE
      87             :  * @test_authtok_type_empty    : type => SSS_AUTHTOK_TYPE_EMPTY
      88             :  */
      89             : 
      90             : /* Test when type has value SSS_AUTHTOK_TYPE_PASSWORD */
      91           1 : static void test_sss_authtok_password(void **state)
      92             : {
      93             :     size_t len;
      94             :     errno_t ret;
      95             :     char *data;
      96             :     size_t ret_len;
      97             :     const char *pwd;
      98             :     struct test_state *ts;
      99             :     enum sss_authtok_type type;
     100             : 
     101           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     102           1 :     data = talloc_strdup(ts, "password");
     103           1 :     assert_non_null(data);
     104             : 
     105           1 :     len = strlen(data) + 1;
     106           1 :     type = SSS_AUTHTOK_TYPE_PASSWORD;
     107           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *)data, len);
     108             : 
     109           1 :     assert_int_equal(ret, EOK);
     110           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     111           1 :     assert_int_equal(len, sss_authtok_get_size(ts->authtoken));
     112           1 :     assert_string_equal(data, sss_authtok_get_data(ts->authtoken));
     113             : 
     114           1 :     ret = sss_authtok_get_password(ts->authtoken, &pwd, &ret_len);
     115             : 
     116           1 :     assert_int_equal(ret, EOK);
     117           1 :     assert_string_equal(data, pwd);
     118           1 :     assert_int_equal(len - 1, ret_len);
     119             : 
     120           1 :     ret = sss_authtok_set_password(ts->authtoken, data, len);
     121           1 :     assert_int_equal(ret, EOK);
     122             : 
     123           1 :     ret = sss_authtok_get_password(ts->authtoken, &pwd, &ret_len);
     124           1 :     assert_int_equal(ret, EOK);
     125           1 :     assert_string_equal(data, pwd);
     126           1 :     assert_int_equal(len - 1, ret_len);
     127             : 
     128           1 :     talloc_free(data);
     129           1 :     sss_authtok_set_empty(ts->authtoken);
     130           1 : }
     131             : 
     132             : /* Test when type has value SSS_AUTHTOK_TYPE_CCFILE */
     133           1 : static void test_sss_authtok_ccfile(void **state)
     134             : {
     135             :     size_t len;
     136             :     errno_t ret;
     137             :     char *data;
     138             :     size_t ret_len;
     139             :     const char *pwd;
     140             :     struct test_state *ts;
     141             :     enum sss_authtok_type type;
     142             : 
     143           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     144           1 :     data = talloc_strdup(ts, "path/to/cc_file");
     145           1 :     assert_non_null(data);
     146             : 
     147           1 :     len = strlen(data) + 1;
     148           1 :     type = SSS_AUTHTOK_TYPE_CCFILE;
     149           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *)data, len);
     150             : 
     151           1 :     assert_int_equal(ret, EOK);
     152           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     153           1 :     assert_int_equal(len, sss_authtok_get_size(ts->authtoken));
     154           1 :     assert_string_equal(data, sss_authtok_get_data(ts->authtoken));
     155             : 
     156           1 :     ret = sss_authtok_get_ccfile(ts->authtoken, &pwd, &ret_len);
     157             : 
     158           1 :     assert_int_equal(ret, EOK);
     159           1 :     assert_string_equal(data, pwd);
     160           1 :     assert_int_equal(len - 1, ret_len);
     161             : 
     162           1 :     ret = sss_authtok_set_ccfile(ts->authtoken, data, len);
     163             : 
     164           1 :     assert_int_equal(ret, EOK);
     165             : 
     166           1 :     ret = sss_authtok_get_ccfile(ts->authtoken, &pwd, &ret_len);
     167             : 
     168           1 :     assert_int_equal(ret, EOK);
     169           1 :     assert_string_equal(data, pwd);
     170           1 :     assert_int_equal(len - 1, ret_len);
     171             : 
     172             : 
     173           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *) data, 0);
     174             : 
     175           1 :     assert_int_equal(ret, EOK);
     176           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     177           1 :     assert_int_equal(len, sss_authtok_get_size(ts->authtoken));
     178           1 :     assert_string_equal(data, sss_authtok_get_data(ts->authtoken));
     179             : 
     180           1 :     ret = sss_authtok_get_ccfile(ts->authtoken, &pwd, &ret_len);
     181             : 
     182           1 :     assert_int_equal(ret, EOK);
     183           1 :     assert_string_equal(data, pwd);
     184           1 :     assert_int_equal(len - 1, ret_len);
     185             : 
     186           1 :     talloc_free(data);
     187           1 :     sss_authtok_set_empty(ts->authtoken);
     188           1 : }
     189             : 
     190             : /* Test when type has value SSS_AUTHTOK_TYPE_EMPTY */
     191           1 : static void test_sss_authtok_empty(void **state)
     192             : {
     193             :     errno_t ret;
     194             :     size_t ret_len;
     195             :     const char *pwd;
     196             :     struct test_state *ts;
     197             :     enum sss_authtok_type type;
     198             : 
     199           1 :     type = SSS_AUTHTOK_TYPE_EMPTY;
     200           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     201           1 :     ret = sss_authtok_set(ts->authtoken, type, NULL, 0);
     202             : 
     203           1 :     assert_int_equal(ret, EOK);
     204           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     205           1 :     assert_int_equal(0, sss_authtok_get_size(ts->authtoken));
     206           1 :     assert_null(sss_authtok_get_data(ts->authtoken));
     207             : 
     208           1 :     ret = sss_authtok_get_password(ts->authtoken, &pwd, &ret_len);
     209             : 
     210           1 :     assert_int_equal(ret, ENOENT);
     211             : 
     212           1 :     ret = sss_authtok_get_ccfile(ts->authtoken, &pwd, &ret_len);
     213             : 
     214           1 :     assert_int_equal(ret, ENOENT);
     215             : 
     216           1 :     sss_authtok_set_empty(ts->authtoken);
     217             : 
     218           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     219           1 :     assert_int_equal(0, sss_authtok_get_size(ts->authtoken));
     220           1 :     assert_null(sss_authtok_get_data(ts->authtoken));
     221             : 
     222           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t*)"", 0);
     223           1 :     assert_int_equal(ret, EOK);
     224             : 
     225           1 :     assert_int_equal(type, sss_authtok_get_type(ts->authtoken));
     226           1 :     assert_int_equal(EOK, sss_authtok_get_size(ts->authtoken));
     227           1 :     assert_null(sss_authtok_get_data(ts->authtoken));
     228             : 
     229           1 :     ret = sss_authtok_get_password(ts->authtoken, &pwd, &ret_len);
     230             : 
     231           1 :     assert_int_equal(ret, ENOENT);
     232             : 
     233           1 :     ret = sss_authtok_get_ccfile(ts->authtoken, &pwd, &ret_len);
     234             : 
     235           1 :     assert_int_equal(ret, ENOENT);
     236           1 : }
     237             : 
     238           1 : static void test_sss_authtok_wipe_password(void **state)
     239             : {
     240             :     size_t len;
     241             :     errno_t ret;
     242             :     char *data;
     243             :     size_t ret_len;
     244             :     const char *pwd;
     245             :     struct test_state *ts;
     246             :     enum sss_authtok_type type;
     247             : 
     248           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     249           1 :     data = talloc_strdup(ts, "password");
     250           1 :     assert_non_null(data);
     251             : 
     252           1 :     len = strlen(data) + 1;
     253           1 :     type = SSS_AUTHTOK_TYPE_PASSWORD;
     254           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *)data, len);
     255             : 
     256           1 :     assert_int_equal(ret, EOK);
     257             : 
     258           1 :     sss_authtok_wipe_password(ts->authtoken);
     259             : 
     260           1 :     ret = sss_authtok_get_password(ts->authtoken, &pwd, &ret_len);
     261             : 
     262           1 :     assert_int_equal(ret, EOK);
     263           1 :     assert_string_equal(pwd, "");
     264           1 :     assert_int_equal(len - 1, ret_len);
     265             : 
     266           1 :     sss_authtok_set_empty(ts->authtoken);
     267           1 :     talloc_free(data);
     268           1 : }
     269             : 
     270           1 : static void test_sss_authtok_copy(void **state)
     271             : {
     272             :     size_t len;
     273             :     errno_t ret;
     274             :     char *data;
     275             :     struct test_state *ts;
     276             :     enum sss_authtok_type type;
     277             :     struct sss_auth_token *dest_authtoken;
     278             : 
     279           1 :     ts= talloc_get_type_abort(*state, struct test_state);
     280             : 
     281           1 :     dest_authtoken = sss_authtok_new(ts);
     282           1 :     assert_non_null(dest_authtoken);
     283             : 
     284           1 :     data = talloc_strdup(ts, "password");
     285           1 :     assert_non_null(data);
     286             : 
     287           1 :     len = strlen(data) + 1;
     288           1 :     type = SSS_AUTHTOK_TYPE_EMPTY;
     289           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *)data, len);
     290             : 
     291           1 :     assert_int_equal(ret, EOK);
     292           1 :     assert_int_equal(EOK, sss_authtok_copy(ts->authtoken, dest_authtoken));
     293           1 :     assert_int_equal(type, sss_authtok_get_type(dest_authtoken));
     294             : 
     295           1 :     sss_authtok_set_empty(dest_authtoken);
     296           1 :     type = SSS_AUTHTOK_TYPE_PASSWORD;
     297           1 :     ret = sss_authtok_set(ts->authtoken, type, (const uint8_t *)data, len);
     298             : 
     299           1 :     assert_int_equal(ret, EOK);
     300             : 
     301           1 :     ret = sss_authtok_copy(ts->authtoken, dest_authtoken);
     302             : 
     303           1 :     assert_int_equal(ret, EOK);
     304           1 :     assert_int_equal(type, sss_authtok_get_type(dest_authtoken));
     305           1 :     assert_string_equal(data, sss_authtok_get_data(dest_authtoken));
     306           1 :     assert_int_equal(len, sss_authtok_get_size(dest_authtoken));
     307             : 
     308           1 :     sss_authtok_set_empty(dest_authtoken);
     309           1 :     talloc_free(dest_authtoken);
     310           1 :     sss_authtok_set_empty(ts->authtoken);
     311           1 :     talloc_free(data);
     312           1 : }
     313             : 
     314           1 : void test_sss_authtok_2fa(void **state)
     315             : {
     316             :     int ret;
     317             :     const char *fa1;
     318             :     size_t fa1_size;
     319             :     const char *fa2;
     320             :     size_t fa2_size;
     321             :     struct test_state *ts;
     322             : 
     323           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     324             : 
     325           1 :     ret = sss_authtok_set_2fa(NULL, "a", 0, "b", 0);
     326           1 :     assert_int_equal(ret, EINVAL);
     327             : 
     328             :     /* Test missing first factor */
     329           1 :     ret = sss_authtok_set_2fa(ts->authtoken, NULL, 1, "b", 1);
     330           1 :     assert_int_equal(ret, EINVAL);
     331             :     /* Test missing second factor */
     332           1 :     ret = sss_authtok_set_2fa(ts->authtoken, "a", 1, NULL, 1);
     333           1 :     assert_int_equal(ret, EINVAL);
     334             :     /* Test wrong first factor length */
     335           1 :     ret = sss_authtok_set_2fa(ts->authtoken, "ab", 1, "b", 1);
     336           1 :     assert_int_equal(ret, EINVAL);
     337             :     /* Test wrong second factor length */
     338           1 :     ret = sss_authtok_set_2fa(ts->authtoken, "a", 1, "bc", 1);
     339           1 :     assert_int_equal(ret, EINVAL);
     340             : 
     341           1 :     ret = sss_authtok_set_2fa(ts->authtoken, "a", 1, "bc", 2);
     342           1 :     assert_int_equal(ret, EOK);
     343           1 :     assert_int_equal(sss_authtok_get_size(ts->authtoken),
     344             :                      2 * sizeof(uint32_t) + 5);
     345           1 :     assert_int_equal(sss_authtok_get_type(ts->authtoken), SSS_AUTHTOK_TYPE_2FA);
     346             : #if __BYTE_ORDER == __LITTLE_ENDIAN
     347           1 :     assert_memory_equal(sss_authtok_get_data(ts->authtoken),
     348             :                         "\2\0\0\0\3\0\0\0a\0bc\0",
     349             :                         2 * sizeof(uint32_t) + 5);
     350             : #else
     351             :     assert_memory_equal(sss_authtok_get_data(ts->authtoken),
     352             :                         "\0\0\0\2\0\0\0\3a\0bc\0",
     353             :                         2 * sizeof(uint32_t) + 5);
     354             : #endif
     355             : 
     356           1 :     ret = sss_authtok_get_2fa(ts->authtoken, &fa1, &fa1_size, &fa2, &fa2_size);
     357           1 :     assert_int_equal(ret, EOK);
     358           1 :     assert_int_equal(fa1_size, 1);
     359           1 :     assert_string_equal(fa1, "a");
     360           1 :     assert_int_equal(fa2_size, 2);
     361           1 :     assert_string_equal(fa2, "bc");
     362             : 
     363           1 :     sss_authtok_set_empty(ts->authtoken);
     364             : 
     365             :     /* check return code of empty token */
     366           1 :     ret = sss_authtok_get_2fa(ts->authtoken, &fa1, &fa1_size, &fa2, &fa2_size);
     367           1 :     assert_int_equal(ret, ENOENT);
     368             : 
     369             :     /* check return code for other token type */
     370           1 :     ret = sss_authtok_set_password(ts->authtoken, "abc", 0);
     371           1 :     assert_int_equal(ret, EOK);
     372             : 
     373           1 :     ret = sss_authtok_get_2fa(ts->authtoken, &fa1, &fa1_size, &fa2, &fa2_size);
     374           1 :     assert_int_equal(ret, EACCES);
     375             : 
     376           1 :     sss_authtok_set_empty(ts->authtoken);
     377             : 
     378             :     /* check return code for garbage */
     379           1 :     ret = sss_authtok_set(ts->authtoken, SSS_AUTHTOK_TYPE_2FA,
     380             :                           (const uint8_t *) "1111222233334444", 16);
     381           1 :     assert_int_equal(ret, EINVAL);
     382             : 
     383           1 :     sss_authtok_set_empty(ts->authtoken);
     384           1 : }
     385             : 
     386           1 : void test_sss_authtok_2fa_blobs(void **state)
     387             : {
     388             :     int ret;
     389             :     struct test_state *ts;
     390             :     size_t needed_size;
     391             :     uint8_t *buf;
     392             :     char *fa1;
     393             :     size_t fa1_len;
     394             :     char *fa2;
     395             :     size_t fa2_len;
     396             : 
     397           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     398             : 
     399           1 :     ret = sss_auth_pack_2fa_blob(NULL, 0, "defg", 0, NULL, 0, &needed_size);
     400           1 :     assert_int_equal(ret, EINVAL);
     401             : 
     402           1 :     ret = sss_auth_pack_2fa_blob("abc", 0, NULL, 0, NULL, 0, &needed_size);
     403           1 :     assert_int_equal(ret, EINVAL);
     404             : 
     405           1 :     ret = sss_auth_pack_2fa_blob("", 0, "defg", 0, NULL, 0, &needed_size);
     406           1 :     assert_int_equal(ret, EINVAL);
     407             : 
     408           1 :     ret = sss_auth_pack_2fa_blob("abc", 0, "", 0, NULL, 0, &needed_size);
     409           1 :     assert_int_equal(ret, EINVAL);
     410             : 
     411           1 :     ret = sss_auth_pack_2fa_blob("abc", 0, "defg", 0, NULL, 0, &needed_size);
     412           1 :     assert_int_equal(ret, EAGAIN);
     413             : 
     414           1 :     buf = talloc_size(ts, needed_size);
     415           1 :     assert_non_null(buf);
     416             : 
     417           1 :     ret = sss_auth_pack_2fa_blob("abc", 0, "defg", 0, buf, needed_size,
     418             :                                  &needed_size);
     419           1 :     assert_int_equal(ret, EOK);
     420             : 
     421             : #if __BYTE_ORDER == __LITTLE_ENDIAN
     422           1 :     assert_memory_equal(buf, "\4\0\0\0\5\0\0\0abc\0defg\0", needed_size);
     423             : #else
     424             :     assert_memory_equal(buf, "\0\0\0\4\0\0\0\5abc\0defg\0", needed_size);
     425             : #endif
     426             : 
     427           1 :     ret = sss_auth_unpack_2fa_blob(ts, buf, needed_size, &fa1, &fa1_len, &fa2,
     428             :                                    &fa2_len);
     429           1 :     assert_int_equal(ret, EOK);
     430           1 :     assert_int_equal(fa1_len, 3);
     431           1 :     assert_string_equal(fa1, "abc");
     432           1 :     assert_int_equal(fa2_len, 4);
     433           1 :     assert_string_equal(fa2, "defg");
     434             : 
     435           1 :     talloc_free(buf);
     436           1 :     talloc_free(fa1);
     437           1 :     talloc_free(fa2);
     438           1 : }
     439             : 
     440             : #define MISSING_NULL_CHECK do { \
     441             :     assert_int_equal(ret, EOK); \
     442             :     assert_int_equal(fa1_len, 3); \
     443             :     assert_string_equal(fa1, "abc"); \
     444             :     assert_int_equal(fa2_len, 4); \
     445             :     assert_string_equal(fa2, "defg"); \
     446             :  \
     447             :     talloc_free(fa1); \
     448             :     talloc_free(fa2); \
     449             : } while (0)
     450             : 
     451           1 : void test_sss_authtok_2fa_blobs_missing_null(void **state)
     452             : {
     453             :     int ret;
     454             :     struct test_state *ts;
     455             :     char *fa1;
     456             :     size_t fa1_len;
     457             :     char *fa2;
     458             :     size_t fa2_len;
     459             : #if __BYTE_ORDER == __LITTLE_ENDIAN
     460           1 :     uint8_t b0[] = {0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 'a', 'b', 'c', 0x00, 'd', 'e', 'f', 'g', 0x00};
     461           1 :     uint8_t b1[] = {0x03, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 0x00};
     462           1 :     uint8_t b2[] = {0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 'a', 'b', 'c', 0x00, 'd', 'e', 'f', 'g'};
     463           1 :     uint8_t b3[] = {0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 'a', 'b', 'c', 'd', 'e', 'f', 'g'};
     464             : #else
     465             :     uint8_t b0[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 'a', 'b', 'c', 0x00, 'd', 'e', 'f', 'g', 0x00};
     466             :     uint8_t b1[] = {0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 0x00};
     467             :     uint8_t b2[] = {0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 'a', 'b', 'c', 0x00, 'd', 'e', 'f', 'g'};
     468             :     uint8_t b3[] = {0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 'a', 'b', 'c', 'd', 'e', 'f', 'g'};
     469             : #endif
     470             : 
     471             : 
     472           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     473             : 
     474           1 :     ret = sss_auth_unpack_2fa_blob(ts, b0, sizeof(b0), &fa1, &fa1_len, &fa2,
     475             :                                    &fa2_len);
     476           1 :     MISSING_NULL_CHECK;
     477             : 
     478           1 :     ret = sss_auth_unpack_2fa_blob(ts, b1, sizeof(b1), &fa1, &fa1_len, &fa2,
     479             :                                    &fa2_len);
     480           1 :     MISSING_NULL_CHECK;
     481             : 
     482           1 :     ret = sss_auth_unpack_2fa_blob(ts, b2, sizeof(b2), &fa1, &fa1_len, &fa2,
     483             :                                    &fa2_len);
     484           1 :     MISSING_NULL_CHECK;
     485             : 
     486           1 :     ret = sss_auth_unpack_2fa_blob(ts, b3, sizeof(b3), &fa1, &fa1_len, &fa2,
     487             :                                    &fa2_len);
     488           1 :     MISSING_NULL_CHECK;
     489           1 : }
     490             : 
     491           1 : void test_sss_authtok_sc_keypad(void **state)
     492             : {
     493             :     struct test_state *ts;
     494             : 
     495           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     496             : 
     497           1 :     sss_authtok_set_sc_keypad(NULL);
     498             : 
     499           1 :     sss_authtok_set_sc_keypad(ts->authtoken);
     500           1 :     assert_int_equal(sss_authtok_get_type(ts->authtoken),
     501             :                      SSS_AUTHTOK_TYPE_SC_KEYPAD);
     502           1 :     assert_int_equal(sss_authtok_get_size(ts->authtoken), 0);
     503           1 :     assert_null(sss_authtok_get_data(ts->authtoken));
     504           1 : }
     505             : 
     506           1 : void test_sss_authtok_sc_pin(void **state)
     507             : {
     508             :     struct test_state *ts;
     509             :     int ret;
     510             :     size_t size;
     511             :     const char *pin;
     512             :     size_t len;
     513             : 
     514           1 :     ts = talloc_get_type_abort(*state, struct test_state);
     515             : 
     516           1 :     ret = sss_authtok_set_sc_pin(NULL, NULL, 0);
     517           1 :     assert_int_equal(ret, EFAULT);
     518             : 
     519           1 :     ret = sss_authtok_set_sc_pin(ts->authtoken, NULL, 0);
     520           1 :     assert_int_equal(ret, EINVAL);
     521             : 
     522           1 :     ret = sss_authtok_set_sc_pin(ts->authtoken, "12345678", 0);
     523           1 :     assert_int_equal(ret, EOK);
     524           1 :     assert_int_equal(sss_authtok_get_type(ts->authtoken),
     525             :                      SSS_AUTHTOK_TYPE_SC_PIN);
     526           1 :     size = sss_authtok_get_size(ts->authtoken);
     527           1 :     assert_int_equal(size, 9);
     528           1 :     assert_memory_equal(sss_authtok_get_data(ts->authtoken), "12345678\0",
     529             :                                              size);
     530             : 
     531           1 :     ret = sss_authtok_set_sc_pin(ts->authtoken, "12345678", 5);
     532           1 :     assert_int_equal(ret, EOK);
     533           1 :     assert_int_equal(sss_authtok_get_type(ts->authtoken),
     534             :                      SSS_AUTHTOK_TYPE_SC_PIN);
     535           1 :     size = sss_authtok_get_size(ts->authtoken);
     536           1 :     assert_int_equal(size, 6);
     537           1 :     assert_memory_equal(sss_authtok_get_data(ts->authtoken), "12345\0",
     538             :                                              size);
     539             : 
     540           1 :     ret = sss_authtok_get_sc_pin(ts->authtoken, &pin, &len);
     541           1 :     assert_int_equal(ret, EOK);
     542           1 :     assert_int_equal(len, 5);
     543           1 :     assert_string_equal(pin, "12345");
     544             : 
     545           1 :     sss_authtok_set_empty(ts->authtoken);
     546             : 
     547           1 :     ret = sss_authtok_get_sc_pin(ts->authtoken, &pin, &len);
     548           1 :     assert_int_equal(ret, ENOENT);
     549             : 
     550           1 :     ret = sss_authtok_set_password(ts->authtoken, "12345", 0);
     551           1 :     assert_int_equal(ret, EOK);
     552             : 
     553           1 :     ret = sss_authtok_get_sc_pin(ts->authtoken, &pin, &len);
     554           1 :     assert_int_equal(ret, EACCES);
     555             : 
     556           1 :     sss_authtok_set_empty(ts->authtoken);
     557             : 
     558           1 :     ret = sss_authtok_get_sc_pin(NULL, &pin, &len);
     559           1 :     assert_int_equal(ret, EFAULT);
     560           1 : }
     561             : 
     562           1 : int main(int argc, const char *argv[])
     563             : {
     564             :     poptContext pc;
     565             :     int opt;
     566           6 :     struct poptOption long_options[] = {
     567             :         POPT_AUTOHELP
     568           5 :         SSSD_DEBUG_OPTS
     569             :         POPT_TABLEEND
     570             :     };
     571             : 
     572           1 :     const struct CMUnitTest tests[] = {
     573             :         cmocka_unit_test_setup_teardown(test_sss_authtok_new,
     574             :                                         setup, teardown),
     575             :         cmocka_unit_test_setup_teardown(test_sss_authtok_password,
     576             :                                         setup, teardown),
     577             :         cmocka_unit_test_setup_teardown(test_sss_authtok_ccfile,
     578             :                                         setup, teardown),
     579             :         cmocka_unit_test_setup_teardown(test_sss_authtok_empty,
     580             :                                         setup, teardown),
     581             :         cmocka_unit_test_setup_teardown(test_sss_authtok_wipe_password,
     582             :                                         setup, teardown),
     583             :         cmocka_unit_test_setup_teardown(test_sss_authtok_copy,
     584             :                                         setup, teardown),
     585             :         cmocka_unit_test_setup_teardown(test_sss_authtok_2fa,
     586             :                                         setup, teardown),
     587             :         cmocka_unit_test_setup_teardown(test_sss_authtok_2fa_blobs,
     588             :                                         setup, teardown),
     589             :         cmocka_unit_test_setup_teardown(test_sss_authtok_2fa_blobs_missing_null,
     590             :                                         setup, teardown),
     591             :         cmocka_unit_test_setup_teardown(test_sss_authtok_sc_keypad,
     592             :                                         setup, teardown),
     593             :         cmocka_unit_test_setup_teardown(test_sss_authtok_sc_pin,
     594             :                                         setup, teardown),
     595             :     };
     596             : 
     597             :     /* Set debug level to invalid value so we can deside if -d 0 was used. */
     598           1 :     debug_level = SSSDBG_INVALID;
     599             : 
     600           1 :     pc = poptGetContext(argv[0], argc, argv, long_options, 0);
     601           1 :     while((opt = poptGetNextOpt(pc)) != -1) {
     602             :         switch(opt) {
     603             :         default:
     604           0 :             fprintf(stderr, "\nInvalid option %s: %s\n\n",
     605             :                     poptBadOption(pc, 0), poptStrerror(opt));
     606           0 :             poptPrintUsage(pc, stderr, 0);
     607           0 :             return 1;
     608             :         }
     609             :     }
     610           1 :     poptFreeContext(pc);
     611             : 
     612           1 :     DEBUG_CLI_INIT(debug_level);
     613             : 
     614           1 :     return cmocka_run_group_tests(tests, NULL, NULL);
     615             : }

Generated by: LCOV version 1.10