Почему мой массив stati c установлен, но мой указатель stati c после вызова функции установлен в NULL? - PullRequest
0 голосов
/ 22 апреля 2020

Итак, у меня есть 3 переменные stati c:

static char sys_salt[PWORD_SALT_LEN];
static char sys_hash[PWORD_HASH_LEN];
static char *sys_encoded_password;

И я посылаю эти 3 переменные stati c в эту функцию:

set_hash_and_salt_for_pword(
    pword, sys_hash, sys_salt, sys_encoded_password);

Внутри этой функции,

  1. соль устанавливается путем вызова:

    arc4random_buf(pword_salt, PWORD_SALT_LEN);

  2. sys_hash успешно установлен и остается установленным после того, как мой set_hash_and_salt_for_pword называется. Это делается внутри этой функции: argon2_hash(...)

  3. Я бы ожидал, что static char *sys_encoded_password; будет установлено точно так же, как установлено sys_hash: внутри argon_2hash, и это действительно потому, что я вызываю NSLog(...) внутри функции. (Да, я также использую Obejctive- C. Но после того, как моя функция возвращается ... указатель снова становится NULL.

Что происходит? Почему этот указатель не сохраняется ?

Примечание: я вижу 2 различия между sys_hash и sys_encoded_password:

  1. sys_encoded_password типа static char* и sys_hash типа : static char sys_hash[PWORD_HASH_LEN]; (AKA - размер предопределен определением макроса, что приводит ко второму различию:

  2. Я установил размер sys_encoded_password внутри set_hash_and_salt_for_pword, выполнив следующее malloc вызов:

    encoded_password = malloc(encoded_password_length + 1);

Вывод выглядит следующим образом:

2020-04-22 11:09:16.837705-0400 InsecureApp[31502:3180622] pword inside set_hash_and_salt_for_pword: openSesame
2020-04-22 11:09:16.838315-0400 InsecureApp[31502:3180622] salt inside set_hash_and_salt_for_pword:: \M-}b.\M-1T?\M-4\M^QW#\M^J\M-3\M-y\M-2\^V\M-O\M-E\M-p5\M-M\^R\M^Qii_<L\M-?H\M^F \M-_
2020-04-22 11:09:16.838371-0400 InsecureApp[31502:3180622] hash inside set_hash_and_salt_for_pword:: \M^K)Ϸ\M-R5}v\M-`\^FB&\^W\M^H$'\M-}b.\M-1T?\M-4\M^QW#\M^J\M-3\M-y\M-2\^V\M-O\M-E\M-p5\M-M\^R\M^Qii_<L\M-?H\M^F \M-_
2020-04-22 11:09:16.838435-0400 InsecureApp[31502:3180622] encod inside set_hash_and_salt_for_pword: $argon2id$v=19$m=65536,t=2,p=1$/WIusVQ/tJFXI4qz+bIWz8XwNc0SkWlpXzxMv0iGIN8$iynPt9I1fXbgBkImF4gkJw
2020-04-22 11:09:16.838505-0400 InsecureApp[31502:3180622] pword out: openSesame
2020-04-22 11:09:16.838550-0400 InsecureApp[31502:3180622] salt out:: \M-}b.\M-1T?\M-4\M^QW#\M^J\M-3\M-y\M-2\^V\M-O\M-E\M-p5\M-M\^R\M^Qii_<L\M-?H\M^F \M-_
2020-04-22 11:09:16.838598-0400 InsecureApp[31502:3180622] hash out:: \M^K)Ϸ\M-R5}v\M-`\^FB&\^W\M^H$'\M-}b.\M-1T?\M-4\M^QW#\M^J\M-3\M-y\M-2\^V\M-O\M-E\M-p5\M-M\^R\M^Qii_<L\M-?H\M^F \M-_
2020-04-22 11:09:16.898853-0400 InsecureApp[31502:3180622] encod out: (null)

PS - Это совершенно небезопасное локальное приложение - но я 1) учусь C и 2) играю с API argon2.

Соответствующий код:

#define PWORD_SALT_LEN 32
#define PWORD_HASH_LEN 16
static char sys_salt[PWORD_SALT_LEN];
static char sys_hash[PWORD_HASH_LEN];
static char *sys_encoded_password;


int set_hash_and_salt_for_pword(
      const char *pword
    , char pword_hash[PWORD_SALT_LEN]
    , char pword_salt[PWORD_HASH_LEN]
    , char *encoded_password
){
    arc4random_buf(pword_salt, PWORD_SALT_LEN);


    uint8_t  *pword_for_argon = (uint8_t*)strdup(pword);
    uint32_t  pword_len       = (uint32_t)strlen((char*)pword_for_argon);

    uint32_t t_cost = 2;            // 1-pass computation
    uint32_t m_cost = (1<<16);      // 64 mebibytes memory usage
    uint32_t lanes  = 1;            // number of threads and lanes

    argon2_type hash_type = Argon2_id;

    size_t encoded_password_length;
    argon2_version version = ARGON2_VERSION_NUMBER;

    encoded_password_length
        = argon2_encodedlen(
              t_cost
            , m_cost
            , lanes
            , (uint32_t)PWORD_SALT_LEN
            , PWORD_HASH_LEN
            , hash_type);

    encoded_password = malloc(encoded_password_length + 1);

    if (!encoded_password) {
        // clear_internal_memory(pword_for_argon, pword_len);
        NSLog(@"could not allocate memory for hash");
    }

    // argon2id_hash_encoded(
    argon2_hash(
          t_cost
        , m_cost
        , lanes
        , pword_for_argon
        , pword_len
        , pword_salt
        , PWORD_SALT_LEN
        , pword_hash               // EXTRA
        , PWORD_HASH_LEN
        , encoded_password
        , encoded_password_length  // )
        , hash_type                // EXTRA
        , version);                // EXTRA


     NSLog(@"pword inside set_hash_and_salt_for_pword: %s", pword);
     NSLog(@"salt inside set_hash_and_salt_for_pword:: %s", pword_salt);
     NSLog(@"hash inside set_hash_and_salt_for_pword:: %s", pword_hash);
     NSLog(@"encod inside set_hash_and_salt_for_pword: %s", encoded_password);

    return 0;
}

int main(){
    /* BLAH CODE */
    char *pword = "openSesame";

    set_hash_and_salt_for_pword(
        pword, sys_hash, sys_salt, sys_encoded_password);

    NSLog(@"pword out: %s", pword);
    NSLog(@"salt out:: %s", sys_salt);
    NSLog(@"hash out:: %s", sys_hash);
    NSLog(@"encod out: %s", sys_encoded_password);

    cleanup();    

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...