NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nerozpoznaný externí symbol

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Jak se ti líbí článek?
Před uložením hodnocení, popiš prosím autorovi, co je špatněZnaků 0 z 50-500
Jak se ti kurz líbí?
Tvé hodnocení kurzuZnaků 0 z 50-500
Aktivity
Avatar
Caster
Člen
Avatar
Caster:11.11.2022 21:14

Pracuji na tvorbě programu, který bude pomocí instrukcí AVX2 (256 bitů) počítat na GPU (nemohu použít volání funkcí OpenSSL knihovny) hashe generovaného hesla (funkce PBKDF2_HMAC_SHA1 a HMAC(EVP_sha1()). Chci vyzkoušet generování klasickým způsobem bez použití AVX2 instrukcí.

V odkazu jsem našel program pro generování HMAC_SHA1, mám ale problém ho rozchodit. Při kompilaci dostanu chyby: Nerozpoznaný externí symbol u funkcí CSHA1::Reset(), CSHA1::Update, CSHA1::Final a CSHA1::GetHash v HMAC_SHA1.cpp:

Zkusil jsem: HMAC_SHA1.cpp

#include "HMAC_SHA1.h"
#include <iostream>
#include <memory>


void CHMAC_SHA1::HMAC_SHA1(BYTE* text, int text_len, BYTE* key, int key_len, BYTE* digest)
{
        memset(SHA1_Key, 0, SHA1_BLOCK_SIZE);

        /* repeated 64 times for values in ipad and opad */
        memset(m_ipad, 0x36, sizeof(m_ipad));
        memset(m_opad, 0x5c, sizeof(m_opad));

        /* STEP 1 */
        if (key_len > SHA1_BLOCK_SIZE)
        {
                CSHA1::Reset();
                CSHA1::Update((UINT_8*)key, key_len);
                CSHA1::Final();

                CSHA1::GetHash((UINT_8*)SHA1_Key);
        }
        else
                memcpy(SHA1_Key, key, key_len);

        /* STEP 2 */
        for (size_t i = 0; i < sizeof(m_ipad); i++)
        {
                m_ipad[i] ^= SHA1_Key[i];
        }

        /* STEP 3 */
        memcpy(AppendBuf1, m_ipad, sizeof(m_ipad));
        memcpy(AppendBuf1 + sizeof(m_ipad), text, text_len);

        /* STEP 4 */
        CSHA1::Reset();
        CSHA1::Update((UINT_8*)AppendBuf1, sizeof(m_ipad) + text_len);
        CSHA1::Final();

        CSHA1::GetHash((UINT_8*)szReport);

        /* STEP 5 */
        for (size_t j = 0; j < sizeof(m_opad); j++)
        {
                m_opad[j] ^= SHA1_Key[j];
        }

        /* STEP 6 */
        memcpy(AppendBuf2, m_opad, sizeof(m_opad));
        memcpy(AppendBuf2 + sizeof(m_opad), szReport, SHA1_DIGEST_LENGTH);

        /*STEP 7 */
        CSHA1::Reset();
        CSHA1::Update((UINT_8*)AppendBuf2, sizeof(m_opad) + SHA1_DIGEST_LENGTH);
        CSHA1::Final();

        CSHA1::GetHash((UINT_8*)digest);
}

int main()
{
    std::cout << "Hello World!\n";
}

HMAC_SHA1.h

/*
        100% free public domain implementation of the HMAC-SHA1 algorithm
        by Chien-Chung, Chung (Jim Chung) <jimchung1221@gmail.com>
*/


#ifndef __HMAC_SHA1_H__
#define __HMAC_SHA1_H__

#include "SHA1.h"

typedef unsigned char BYTE;

class CHMAC_SHA1 : public CSHA1
{
private:
        BYTE m_ipad[64];
        BYTE m_opad[64];

        char* szReport;
        char* SHA1_Key;
        char* AppendBuf1;
        char* AppendBuf2;


public:

        enum {
                SHA1_DIGEST_LENGTH = 20,
                SHA1_BLOCK_SIZE = 64,
                HMAC_BUF_LEN = 4096
        };

        CHMAC_SHA1()
                :szReport(new char[HMAC_BUF_LEN]),
                SHA1_Key(new char[HMAC_BUF_LEN]),
                AppendBuf1(new char[HMAC_BUF_LEN]),
                AppendBuf2(new char[HMAC_BUF_LEN])
        {}

        ~CHMAC_SHA1()
        {
                delete[] szReport;
                delete[] AppendBuf1;
                delete[] AppendBuf2;
                delete[] SHA1_Key;
        }

        void HMAC_SHA1(BYTE* text, int text_len, BYTE* key, int key_len, BYTE* digest);
};


#endif /* __HMAC_SHA1_H__ */

SHA1.h

/*
        100% free public domain implementation of the SHA-1 algorithm
        by Dominik Reichl <dominik.reichl@t-online.de>
        Web: http://www.dominik-reichl.de/
        Version 1.6 - 2005-02-07 (thanks to Howard Kapustein for patches)
        - You can set the endianness in your files, no need to modify the
          header file of the CSHA1 class any more
        - Aligned data support
        - Made support/compilation of the utility functions (ReportHash
          and HashFile) optional (useful, if bytes count, for example in
          embedded environments)
        Version 1.5 - 2005-01-01
        - 64-bit compiler compatibility added
        - Made variable wiping optional (define SHA1_WIPE_VARIABLES)
        - Removed unnecessary variable initializations
        - ROL32 improvement for the Microsoft compiler (using _rotl)
        ======== Test Vectors (from FIPS PUB 180-1) ========
        SHA1("abc") =
                A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
        SHA1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq") =
                84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
        SHA1(A million repetitions of "a") =
                34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
*/

#ifndef ___SHA1_HDR___
#define ___SHA1_HDR___

#if !defined(SHA1_UTILITY_FUNCTIONS) && !defined(SHA1_NO_UTILITY_FUNCTIONS)
#define SHA1_UTILITY_FUNCTIONS
#endif

#include <memory.h> // Needed for memset and memcpy

#ifdef SHA1_UTILITY_FUNCTIONS
#include <stdio.h>  // Needed for file access and sprintf
#include <string.h> // Needed for strcat and strcpy
#endif

#ifdef _MSC_VER
#include <stdlib.h>
#endif

// You can define the endian mode in your files, without modifying the SHA1
// source files. Just #define SHA1_LITTLE_ENDIAN or #define SHA1_BIG_ENDIAN
// in your files, before including the SHA1.h header file. If you don't
// define anything, the class defaults to little endian.

#if !defined(SHA1_LITTLE_ENDIAN) && !defined(SHA1_BIG_ENDIAN)
#define SHA1_LITTLE_ENDIAN
#endif

// Same here. If you want variable wiping, #define SHA1_WIPE_VARIABLES, if
// not, #define SHA1_NO_WIPE_VARIABLES. If you don't define anything, it
// defaults to wiping.

#if !defined(SHA1_WIPE_VARIABLES) && !defined(SHA1_NO_WIPE_VARIABLES)
#define SHA1_WIPE_VARIABLES
#endif

/////////////////////////////////////////////////////////////////////////////
// Define 8- and 32-bit variables

#ifndef UINT_32

#ifdef _MSC_VER

#define UINT_8  unsigned __int8
#define UINT_32 unsigned __int32

#else

#define UINT_8 unsigned char

#if (ULONG_MAX == 0xFFFFFFFF)
#define UINT_32 unsigned long
#else
#define UINT_32 unsigned int
#endif

#endif
#endif

/////////////////////////////////////////////////////////////////////////////
// Declare SHA1 workspace

typedef union
{
        UINT_8  c[64];
        UINT_32 l[16];
} SHA1_WORKSPACE_BLOCK;

class CSHA1
{
public:
#ifdef SHA1_UTILITY_FUNCTIONS
        // Two different formats for ReportHash(...)
        enum
        {
                REPORT_HEX = 0,
                REPORT_DIGIT = 1
        };
#endif

        // Constructor and Destructor
        CSHA1();
        ~CSHA1();

        UINT_32 m_state[5];
        UINT_32 m_count[2];
        UINT_32 __reserved1[1];
        UINT_8  m_buffer[64];
        UINT_8  m_digest[20];
        UINT_32 __reserved2[3];

        void Reset();

        // Update the hash value
        void Update(UINT_8* data, UINT_32 len);
#ifdef SHA1_UTILITY_FUNCTIONS
        bool HashFile(char* szFileName);
#endif

        // Finalize hash and report
        void Final();

        // Report functions: as pre-formatted and raw data
#ifdef SHA1_UTILITY_FUNCTIONS
        void ReportHash(char* szReport, unsigned char uReportType = REPORT_HEX);
#endif
        void GetHash(UINT_8* puDest);

private:
        // Private SHA-1 transformation
        void Transform(UINT_32* state, UINT_8* buffer);

        // Member variables
        UINT_8 m_workspace[64];
        SHA1_WORKSPACE_BLOCK* m_block; // SHA1 pointer to the byte array above
};

#endif

Chci docílit: Zkompilovat program bez chyb. Evidentně tam je nějaký problém s voláním funkce definované ve tříde (class).

 
Odpovědět
11.11.2022 21:14
Avatar
LacoS.
Člen
Avatar
LacoS.:12.11.2022 17:47

Nema to byt namiesto:

CSHA1::Reset();

toto ? :

this.Reset();
 
Nahoru Odpovědět
12.11.2022 17:47
Avatar
Caster
Člen
Avatar
Caster:12.11.2022 23:50

Díky, zapomněl jsem přidat soubor SHA1.cpp s definicemi těch funkcí. Už se to přeložilo bez chyb. Musel jsem ještě změnit stringové funkce např. strcat na strcat_s a upravit otevření souboru fopen na fopen_s 😉.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
12.11.2022 23:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.