New file |
| | |
| | | eclipse.preferences.version=1 |
| | | org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false |
| | |
| | | SET(CMAKE_DISABLE_SOURCE_CHANGES OFF) |
| | | SET(CMAKE_DISABLE_IN_SOURCE_BUILD ON) |
| | | |
| | | |
| | | SET(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "CMake verbose" FORCE) |
| | | |
| | | project (license++ C CXX) |
| | | SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) |
| | | SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/build/modules/") |
| | | |
| | |
| | | ENDIF(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) |
| | | endif(WIN32) |
| | | |
| | | project (license++ C CXX) |
| | | |
| | | |
| | | if(CMAKE_SIZEOF_VOID_P EQUAL 8) |
| | | SET(HAVE_64BIT_SIZE_T 1) |
| | |
| | | |
| | | if(WIN32) |
| | | add_subdirectory(win) |
| | | else(WIN32) |
| | | add_executable( |
| | | bootstrap |
| | | bootstrap.cpp |
| | | bootstrap_linux.cpp |
| | | ) |
| | | |
| | | ENDIF(WIN32) |
| | | |
| | | SET_TARGET_PROPERTIES(bootstrap PROPERTIES LINK_SEARCH_START_STATIC ON) |
| | | SET_TARGET_PROPERTIES(bootstrap PROPERTIES LINK_SEARCH_END_STATIC OFF) |
File was renamed from src/bootstrap/bootstrap.cpp |
| | |
| | | BIO_free_all(bio_private); |
| | | free(pem_key); |
| | | } |
| | | |
| | | void generatePk(std::string private_fname,string public_fname) { |
| | | RSA *rsa = RSA_generate_key(kBits, kExp, 0, 0); |
| | | srand(time(NULL)); /* seed random number generator */ |
New file |
| | |
| | | /* |
| | | * boostrap.c |
| | | * |
| | | * Created on: Apr 5, 2014 |
| | | * Author: devel |
| | | */ |
| | | |
| | | #include <string> |
| | | |
| | | |
| | | using namespace std; |
| | | |
| | | |
| | | void print_usage() { |
| | | printf("usage: bootstrap private-fname public-fname\n"); |
| | | } |
| | | |
| | | int main(int argc, char** argv) { |
| | | |
| | | if (argc != 3) { |
| | | print_usage(); |
| | | exit(2); |
| | | } else { |
| | | printf("********************************************\n"); |
| | | printf("* Bootstrap!!! *\n"); |
| | | printf("********************************************\n"); |
| | | |
| | | } |
| | | string private_fname = string(argv[1]); |
| | | string public_fname(argv[2]); |
| | | |
| | | return 0; |
| | | } |
New file |
| | |
| | | add_executable( |
| | | bootstrap |
| | | CryptoHelper.cpp |
| | | Main.cpp |
| | | ) |
New file |
| | |
| | | #include "CryptoHelper.h" |
| | | // The RSA public-key key exchange algorithm |
| | | #define ENCRYPT_ALGORITHM CALG_RSA_KEYX |
| | | // The high order WORD 0x0200 (decimal 512) |
| | | // determines the key length in bits. |
| | | #define KEYLENGTH 0x02000000 |
| | | //-------------------------------------------------------------------- |
| | | // The constructor initializes the member variables |
| | | // to NULL. |
| | | //-------------------------------------------------------------------- |
| | | CryptoHelper::CryptoHelper() |
| | | { |
| | | m_hCryptProv = NULL; |
| | | m_hCryptKey = NULL; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | // The destructor releases the handles acquired |
| | | // when an object goes out of scope. |
| | | //-------------------------------------------------------------------- |
| | | CryptoHelper::~CryptoHelper() |
| | | { |
| | | if (m_hCryptProv) |
| | | { |
| | | CryptReleaseContext(m_hCryptProv,0); |
| | | m_hCryptProv = NULL; |
| | | } |
| | | if (m_hCryptKey) |
| | | m_hCryptKey = NULL; |
| | | } |
| | | |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptAcquireContext function |
| | | // to get a handle to a key container owned by the the |
| | | // Microsoft Enhanced Cryptographic Provider. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::AcquireContext(LPCTSTR wszContainerName) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | // Release a previously acquired handle to the key container. |
| | | if (m_hCryptProv != NULL) |
| | | { |
| | | CryptReleaseContext(m_hCryptProv,0); |
| | | m_hCryptProv = NULL; |
| | | } |
| | | // Release a previously acquired handle to key-pair. |
| | | if (m_hCryptKey != NULL) |
| | | m_hCryptKey = NULL; |
| | | // Attempt to acquire a context and a key container. |
| | | // The context will use Microsoft Enhanced Cryptographic |
| | | // Provider for the RSA_FULL provider type. |
| | | if(!CryptAcquireContext(&m_hCryptProv, |
| | | wszContainerName, |
| | | MS_ENHANCED_PROV, |
| | | PROV_RSA_FULL, |
| | | CRYPT_MACHINE_KEYSET)) |
| | | { |
| | | // An error occurred in acquiring the context. This could mean |
| | | // that the key container requested does not exist. In this case, |
| | | // the function can be called again to attempt to create a new key |
| | | // container. |
| | | if (GetLastError() == NTE_BAD_KEYSET) |
| | | { |
| | | if(!CryptAcquireContext(&m_hCryptProv, |
| | | wszContainerName, |
| | | MS_ENHANCED_PROV, PROV_RSA_FULL, |
| | | CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | |
| | | // This method calls the CryptGenKey function to get a handle to an |
| | | |
| | | // exportable key-pair. The key-pair is generated with the RSA public-key |
| | | // key exchange algorithm using Microsoft Enhanced Cryptographic Provider. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::GenerateKeyPair() |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptProv == NULL) |
| | | return E_FAIL; |
| | | // Release a previously acquired handle to key-pair. |
| | | if (m_hCryptKey) |
| | | m_hCryptKey = NULL; |
| | | // Call the CryptGenKey method to get a handle |
| | | // to a new exportable key-pair. |
| | | if(!CryptGenKey(m_hCryptProv, |
| | | ENCRYPT_ALGORITHM, |
| | | KEYLENGTH | CRYPT_EXPORTABLE, |
| | | &m_hCryptKey)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptExportKey function to get the Public key |
| | | // in a byte array. The byte array is allocated on the heap and the size |
| | | // of this is returned to the caller. The caller is responsible for releasing // this memory using a delete call. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::ExportPublicKey(BYTE **ppPublicKey, DWORD &cbKeySize) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | DWORD dwBlobLen; |
| | | BYTE *pbKeyBlob = NULL; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptKey == NULL) |
| | | return E_FAIL; |
| | | // This call here determines the length of the key |
| | | // blob. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PUBLICKEYBLOB, |
| | | 0, |
| | | NULL, |
| | | &dwBlobLen)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | // Allocate memory for the pbKeyBlob. |
| | | if((pbKeyBlob = new BYTE[dwBlobLen]) == NULL) |
| | | { |
| | | return E_OUTOFMEMORY; |
| | | } |
| | | // Do the actual exporting into the key BLOB. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PUBLICKEYBLOB, |
| | | 0, |
| | | pbKeyBlob, |
| | | &dwBlobLen)) |
| | | { |
| | | delete pbKeyBlob; |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | else |
| | | { |
| | | *ppPublicKey = pbKeyBlob; |
| | | cbKeySize = dwBlobLen; |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptExportKey function to get the Private key |
| | | // in a byte array. The byte array is allocated on the heap and the size |
| | | // of this is returned to the caller. The caller is responsible for releasing // this memory using a delete call. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::ExportPrivateKey(BYTE **ppPrivateKey, DWORD &cbKeySize) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | DWORD dwBlobLen; |
| | | BYTE *pbKeyBlob; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptKey == NULL) |
| | | return E_FAIL; |
| | | // This call here determines the length of the key |
| | | // blob. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PRIVATEKEYBLOB, |
| | | 0, |
| | | NULL, |
| | | &dwBlobLen)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | // Allocate memory for the pbKeyBlob. |
| | | if((pbKeyBlob = new BYTE[dwBlobLen]) == NULL) |
| | | { |
| | | return E_OUTOFMEMORY; |
| | | } |
| | | |
| | | // Do the actual exporting into the key BLOB. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PRIVATEKEYBLOB, |
| | | 0, |
| | | pbKeyBlob, |
| | | &dwBlobLen)) |
| | | { |
| | | delete pbKeyBlob; |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | else |
| | | { |
| | | *ppPrivateKey = pbKeyBlob; |
| | | cbKeySize = dwBlobLen; |
| | | } |
| | | return hr; |
| | | } |
| | | |
New file |
| | |
| | | |
| | | #define _WIN32_WINNT 0x0400 |
| | | #include <windows.h> |
| | | #include <wincrypt.h> |
| | | #include <tchar.h> |
| | | |
| | | // Helper class definition to generate and export Public/Private keys |
| | | // for Asymmetric encryption. The semantics for usage are: |
| | | // Call AcquireContext with a container name, call |
| | | // GenerateKeyPair next and then call ExportPublicKey or |
| | | // ExportPrivateKey. |
| | | class CryptoHelper |
| | | { |
| | | private: |
| | | HCRYPTPROV m_hCryptProv; |
| | | public: |
| | | HCRYPTKEY m_hCryptKey; |
| | | CryptoHelper(); |
| | | ~CryptoHelper(); |
| | | HRESULT AcquireContext(LPCTSTR wszContainerName); |
| | | HRESULT GenerateKeyPair(); |
| | | |
| | | HRESULT ExportPublicKey(BYTE **ppPublicKey, DWORD &cbKeySize);; |
| | | HRESULT ExportPrivateKey(BYTE **ppPrivateKey, DWORD &cbKeySize); |
| | | }; |
| | | 3333333//-------------------------------------------------------------------- |
| | | // The destructor releases the handles acquired |
| | | // when an object goes out of scope. |
| | | //-------------------------------------------------------------------- |
| | | CryptoHelper::~CryptoHelper() |
| | | { |
| | | if (m_hCryptProv) |
| | | { |
| | | CryptReleaseContext(m_hCryptProv,0); |
| | | m_hCryptProv = NULL; |
| | | } |
| | | if (m_hCryptKey) |
| | | m_hCryptKey = NULL; |
| | | } |
| | | |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptAcquireContext function |
| | | // to get a handle to a key container owned by the the |
| | | // Microsoft Enhanced Cryptographic Provider. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::AcquireContext(LPCTSTR wszContainerName) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | // Release a previously acquired handle to the key container. |
| | | if (m_hCryptProv != NULL) |
| | | { |
| | | CryptReleaseContext(m_hCryptProv,0); |
| | | m_hCryptProv = NULL; |
| | | } |
| | | // Release a previously acquired handle to key-pair. |
| | | if (m_hCryptKey != NULL) |
| | | m_hCryptKey = NULL; |
| | | // Attempt to acquire a context and a key container. |
| | | // The context will use Microsoft Enhanced Cryptographic |
| | | // Provider for the RSA_FULL provider type. |
| | | if(!CryptAcquireContext(&m_hCryptProv, |
| | | wszContainerName, |
| | | MS_ENHANCED_PROV, |
| | | PROV_RSA_FULL, |
| | | CRYPT_MACHINE_KEYSET)) |
| | | { |
| | | // An error occurred in acquiring the context. This could mean |
| | | // that the key container requested does not exist. In this case, |
| | | // the function can be called again to attempt to create a new key |
| | | // container. |
| | | if (GetLastError() == NTE_BAD_KEYSET) |
| | | { |
| | | if(!CryptAcquireContext(&m_hCryptProv, |
| | | wszContainerName, |
| | | MS_ENHANCED_PROV, PROV_RSA_FULL, |
| | | CRYPT_MACHINE_KEYSET|CRYPT_NEWKEYSET)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | |
| | | // This method calls the CryptGenKey function to get a handle to an |
| | | |
| | | // exportable key-pair. The key-pair is generated with the RSA public-key |
| | | // key exchange algorithm using Microsoft Enhanced Cryptographic Provider. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::GenerateKeyPair() |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptProv == NULL) |
| | | return E_FAIL; |
| | | // Release a previously acquired handle to key-pair. |
| | | if (m_hCryptKey) |
| | | m_hCryptKey = NULL; |
| | | // Call the CryptGenKey method to get a handle |
| | | // to a new exportable key-pair. |
| | | if(!CryptGenKey(m_hCryptProv, |
| | | ENCRYPT_ALGORITHM, |
| | | KEYLENGTH | CRYPT_EXPORTABLE, |
| | | &m_hCryptKey)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptExportKey function to get the Public key |
| | | // in a byte array. The byte array is allocated on the heap and the size |
| | | // of this is returned to the caller. The caller is responsible for releasing // this memory using a delete call. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::ExportPublicKey(BYTE **ppPublicKey, DWORD &cbKeySize) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | DWORD dwBlobLen; |
| | | BYTE *pbKeyBlob = NULL; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptKey == NULL) |
| | | return E_FAIL; |
| | | // This call here determines the length of the key |
| | | // blob. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PUBLICKEYBLOB, |
| | | 0, |
| | | NULL, |
| | | &dwBlobLen)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | // Allocate memory for the pbKeyBlob. |
| | | if((pbKeyBlob = new BYTE[dwBlobLen]) == NULL) |
| | | { |
| | | return E_OUTOFMEMORY; |
| | | } |
| | | // Do the actual exporting into the key BLOB. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PUBLICKEYBLOB, |
| | | 0, |
| | | pbKeyBlob, |
| | | &dwBlobLen)) |
| | | { |
| | | delete pbKeyBlob; |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | else |
| | | { |
| | | *ppPublicKey = pbKeyBlob; |
| | | cbKeySize = dwBlobLen; |
| | | } |
| | | return hr; |
| | | } |
| | | //-------------------------------------------------------------------- |
| | | // This method calls the CryptExportKey function to get the Private key |
| | | // in a byte array. The byte array is allocated on the heap and the size |
| | | // of this is returned to the caller. The caller is responsible for releasing // this memory using a delete call. |
| | | //-------------------------------------------------------------------- |
| | | HRESULT CryptoHelper::ExportPrivateKey(BYTE **ppPrivateKey, DWORD &cbKeySize) |
| | | { |
| | | HRESULT hr = S_OK; |
| | | DWORD dwErrCode; |
| | | DWORD dwBlobLen; |
| | | BYTE *pbKeyBlob; |
| | | // If the handle to key container is NULL, fail. |
| | | if (m_hCryptKey == NULL) |
| | | return E_FAIL; |
| | | // This call here determines the length of the key |
| | | // blob. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PRIVATEKEYBLOB, |
| | | 0, |
| | | NULL, |
| | | &dwBlobLen)) |
| | | { |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | // Allocate memory for the pbKeyBlob. |
| | | if((pbKeyBlob = new BYTE[dwBlobLen]) == NULL) |
| | | { |
| | | return E_OUTOFMEMORY; |
| | | } |
| | | |
| | | // Do the actual exporting into the key BLOB. |
| | | if(!CryptExportKey( |
| | | m_hCryptKey, |
| | | NULL, |
| | | PRIVATEKEYBLOB, |
| | | 0, |
| | | pbKeyBlob, |
| | | &dwBlobLen)) |
| | | { |
| | | delete pbKeyBlob; |
| | | dwErrCode = GetLastError(); |
| | | return HRESULT_FROM_WIN32(dwErrCode); |
| | | } |
| | | else |
| | | { |
| | | *ppPrivateKey = pbKeyBlob; |
| | | cbKeySize = dwBlobLen; |
| | | } |
| | | return hr; |
| | | } |
| | | |
| | | Main.cpp |
| | | #include <stdio.h> |
| | | #include "CryptoHelper.h" |
| | | void main() |
| | | { |
| | | CryptoHelper cryptoHlpr; |
| | | BYTE *pbPublicKey = NULL, *pbPrivateKey = NULL; |
| | | DWORD dwPublicKeySize = 0,dwPrivateKeySize = 0; |
| | | HRESULT hr = S_OK; |
| | | // Get the key container context. |
| | | if (FAILED(hr = cryptoHlpr.AcquireContext((L"TestContainer")))) |
| | | { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Generate the public/private key pair. |
| | | if (FAILED(hr = cryptoHlpr.GenerateKeyPair())) |
| | | { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Export out the public key blob. |
| | | if (FAILED(hr = cryptoHlpr.ExportPublicKey(&pbPublicKey, dwPublicKeySize))) |
| | | { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Print out the public key to console as a |
| | | // hexadecimal string. |
| | | wprintf(L"\n\nPublicKey = \""); |
| | | for (DWORD i=0; i < dwPublicKeySize; i++) |
| | | { |
| | | wprintf(L"%02x",pbPublicKey[i]); |
| | | } |
| | | wprintf(L"\"\n"); |
| | | // Export out the private key blob. |
| | | cryptoHlpr.ExportPrivateKey(&pbPrivateKey, dwPrivateKeySize); |
| | | // Print out the private key to console as a |
| | | // hexadecimal string. |
| | | wprintf(L"\n\nPrivateKey = \""); |
| | | for (i=0; i < dwPrivateKeySize; i++) |
| | | { |
| | | wprintf(L"%02x",pbPrivateKey[i]); |
| | | } |
| | | wprintf(L"\"\n"); |
| | | // Delete the public key blob allocated by the |
| | | // ExportPublicKey method. |
| | | if (pbPublicKey) |
| | | delete [] pbPublicKey; |
| | | // Delete the private key blob allocated by the |
| | | // ExportPrivateKey method. |
| | | if (pbPrivateKey) |
| | | delete [] pbPrivateKey; |
| | | return; |
| | | } |
New file |
| | |
| | | #include <stdio.h> |
| | | #include "CryptoHelper.h" |
| | | |
| | | void main() { |
| | | CryptoHelper cryptoHlpr; |
| | | BYTE *pbPublicKey = NULL, *pbPrivateKey = NULL; |
| | | DWORD dwPublicKeySize = 0, dwPrivateKeySize = 0; |
| | | HRESULT hr = S_OK; |
| | | // Get the key container context. |
| | | if (FAILED(hr = cryptoHlpr.AcquireContext((L"TestContainer")))) { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Generate the public/private key pair. |
| | | if (FAILED(hr = cryptoHlpr.GenerateKeyPair())) { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Export out the public key blob. |
| | | if (FAILED( |
| | | hr = cryptoHlpr.ExportPublicKey(&pbPublicKey, dwPublicKeySize))) { |
| | | // Call FormatMessage to display the error returned in hr. |
| | | return; |
| | | } |
| | | // Print out the public key to console as a |
| | | // hexadecimal string. |
| | | wprintf(L"\n\nPublicKey = \""); |
| | | for (DWORD i = 0; i < dwPublicKeySize; i++) { |
| | | wprintf(L"%02x", pbPublicKey[i]); |
| | | } |
| | | wprintf(L"\"\n"); |
| | | // Export out the private key blob. |
| | | cryptoHlpr.ExportPrivateKey(&pbPrivateKey, dwPrivateKeySize); |
| | | // Print out the private key to console as a |
| | | // hexadecimal string. |
| | | wprintf(L"\n\nPrivateKey = \""); |
| | | for (i = 0; i < dwPrivateKeySize; i++) { |
| | | wprintf(L"%02x", pbPrivateKey[i]); |
| | | } |
| | | wprintf(L"\"\n"); |
| | | // Delete the public key blob allocated by the |
| | | // ExportPublicKey method. |
| | | if (pbPublicKey) |
| | | delete[] pbPublicKey; |
| | | // Delete the private key blob allocated by the |
| | | // ExportPrivateKey method. |
| | | if (pbPrivateKey) |
| | | delete[] pbPrivateKey; |
| | | return; |
| | | } |
| | |
| | | _a < _b ? _a : _b; }) |
| | | */ |
| | | typedef enum { |
| | | OK, NOOK, ERROR, BUFFER_TOO_SMALL |
| | | FUNC_RET_OK, FUNC_RET_NOT_AVAIL, FUNC_RET_ERROR, FUNC_RET_BUFFER_TOO_SMALL |
| | | } FUNCTION_RETURN; |
| | | |
| | | #ifdef __cplusplus |
| | |
| | | FUNCTION_RETURN getAdapterInfos(AdapterInfo * adapterInfos, |
| | | size_t * adapter_info_size) { |
| | | |
| | | FUNCTION_RETURN f_return = OK; |
| | | FUNCTION_RETURN f_return = FUNC_RET_OK; |
| | | struct ifaddrs *ifaddr, *ifa; |
| | | int family, i, n, if_name_position; |
| | | unsigned int if_num, if_max; |
| | |
| | | |
| | | if (getifaddrs(&ifaddr) == -1) { |
| | | perror("getifaddrs"); |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | |
| | | if (adapterInfos != NULL) { |
| | |
| | | |
| | | *adapter_info_size = if_num; |
| | | if (adapterInfos == NULL) { |
| | | f_return = OK; |
| | | f_return = FUNC_RET_OK; |
| | | } else if (*adapter_info_size < if_num) { |
| | | f_return = BUFFER_TOO_SMALL; |
| | | f_return = FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | freeifaddrs(ifaddr); |
| | | free(ifnames); |
| | |
| | | aFile = setmntent("/proc/mounts", "r"); |
| | | if (aFile == NULL) { |
| | | /*proc not mounted*/ |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | |
| | | currentDrive = 0; |
| | |
| | | if (diskInfos == NULL) { |
| | | *disk_info_size = currentDrive; |
| | | free(tmpDrives); |
| | | result = OK; |
| | | result = FUNC_RET_OK; |
| | | } else if (*disk_info_size >= currentDrive) { |
| | | disk_by_uuid_dir = opendir("/dev/disk/by-uuid"); |
| | | if (disk_by_uuid_dir == NULL) { |
| | |
| | | printf("Open /dev/disk/by-uuid fail"); |
| | | #endif |
| | | free(statDrives); |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | result = OK; |
| | | result = FUNC_RET_OK; |
| | | *disk_info_size = currentDrive; |
| | | while ((dir = readdir(disk_by_uuid_dir)) != NULL) { |
| | | strcpy(cur_dir, "/dev/disk/by-uuid/"); |
| | |
| | | closedir(disk_by_label); |
| | | } |
| | | } else { |
| | | result = BUFFER_TOO_SMALL; |
| | | result = FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | /* |
| | | FILE *mounts = fopen(_PATH_MOUNTED, "r"); |
| | |
| | | identifier[i * 2] = cpuinfo[i] & 0xFF; |
| | | identifier[i * 2 + 1] = (cpuinfo[i] & 0xFF00) >> 8; |
| | | } |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | VIRTUALIZATION getVirtualization() { |
| | |
| | | static struct utsname u; |
| | | |
| | | if (uname(&u) < 0) { |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | memcpy(identifier, u.nodename, 6); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]) { |
| | | char* dbus_id = dbus_get_local_machine_id(); |
| | | if (dbus_id == NULL) { |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | memcpy(identifier, dbus_id, 6); |
| | | dbus_free(dbus_id); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | |
| | | AdapterInfo *adapterInfos; |
| | | |
| | | result_adapterInfos = getAdapterInfos(NULL, &adapter_num); |
| | | if (result_adapterInfos != OK) { |
| | | if (result_adapterInfos != FUNC_RET_OK) { |
| | | //call generate_disk_pc_id; |
| | | return result_adapterInfos; |
| | | } |
| | | result_diskinfos = getDiskInfos(NULL, &disk_num); |
| | | if (result_diskinfos == OK) { |
| | | if (result_diskinfos == FUNC_RET_OK) { |
| | | required_id_size = disk_num * adapter_num; |
| | | } else { |
| | | required_id_size = disk_num; |
| | |
| | | int defined_identifiers = *num_identifiers; |
| | | *num_identifiers = required_id_size; |
| | | if (identifiers == NULL) { |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (required_id_size > defined_identifiers) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); |
| | | result_diskinfos = getDiskInfos(diskInfos, &disk_num); |
| | |
| | | |
| | | free(diskInfos); |
| | | free(adapterInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers, |
| | |
| | | AdapterInfo *adapterInfos; |
| | | |
| | | result_adapterInfos = getAdapterInfos(NULL, &adapters); |
| | | if (result_adapterInfos != OK) { |
| | | if (result_adapterInfos != FUNC_RET_OK) { |
| | | return result_adapterInfos; |
| | | } |
| | | |
| | | int defined_adapters = *num_identifiers; |
| | | *num_identifiers = adapters; |
| | | if (identifiers == NULL) { |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (adapters > defined_adapters) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | |
| | | adapterInfos = (AdapterInfo*) malloc(adapters * sizeof(AdapterInfo)); |
| | |
| | | } |
| | | } |
| | | free(adapterInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers, |
| | |
| | | DiskInfo * diskInfos; |
| | | |
| | | result_diskinfos = getDiskInfos(NULL, &disk_num); |
| | | if (result_diskinfos != OK) { |
| | | if (result_diskinfos != FUNC_RET_OK) { |
| | | return result_diskinfos; |
| | | } |
| | | diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); |
| | | //memset(diskInfos,0,disk_num * sizeof(DiskInfo)); |
| | | result_diskinfos = getDiskInfos(diskInfos, &disk_num); |
| | | if (result_diskinfos != OK) { |
| | | if (result_diskinfos != FUNC_RET_OK) { |
| | | free(diskInfos); |
| | | return result_diskinfos; |
| | | } |
| | |
| | | *num_identifiers = available_disk_info; |
| | | if (identifiers == NULL) { |
| | | free(diskInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (available_disk_info > defined_identifiers) { |
| | | free(diskInfos); |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | |
| | | j=0; |
| | |
| | | } |
| | | } |
| | | free(diskInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | /** |
| | |
| | | result = generate_disk_pc_id(identifiers, array_size, true); |
| | | break; |
| | | default: |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | |
| | | if (result == OK && identifiers != NULL) { |
| | | if (result == FUNC_RET_OK && identifiers != NULL) { |
| | | strategy_num = strategy << 5; |
| | | for (i = 0; i < *array_size; i++) { |
| | | //encode strategy in the first three bits of the pc_identifier |
| | |
| | | char* b64_data = base64(concat_identifiers, concatIdentifiersSize, |
| | | &b64_size); |
| | | if (b64_size > sizeof(PcSignature)) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | sprintf(pc_identifier_out, "%.4s-%.4s-%.4s-%.4s", &b64_data[0], |
| | | &b64_data[4], &b64_data[8], &b64_data[12]); |
| | | //free(concat_identifiers); |
| | | free(b64_data); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | FUNCTION_RETURN parity_check_id(PcSignature pc_identifier) { |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | FUNCTION_RETURN generate_user_pc_signature(PcSignature identifier_out, |
| | |
| | | PcIdentifier* identifiers; |
| | | unsigned int req_buffer_size = 0; |
| | | result = generate_pc_id(NULL, &req_buffer_size, strategy); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | return result; |
| | | } |
| | | if (req_buffer_size == 0) { |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | req_buffer_size = req_buffer_size < 2 ? 2 : req_buffer_size; |
| | | identifiers = (PcIdentifier *) malloc( |
| | | sizeof(PcIdentifier) * req_buffer_size); |
| | | result = generate_pc_id(identifiers, &req_buffer_size, strategy); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | free(identifiers); |
| | | return result; |
| | | } |
| | |
| | | &base64ids[8], &base64ids[12]); |
| | | concat_identifiers = unbase64(base64ids, 16, &identifiers_size); |
| | | if (identifiers_size > sizeof(PcIdentifier) * 2) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | memcpy(identifier1_out, concat_identifiers, sizeof(PcIdentifier)); |
| | | memcpy(identifier2_out, concat_identifiers + sizeof(PcIdentifier), |
| | | sizeof(PcIdentifier)); |
| | | free(concat_identifiers); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static IDENTIFICATION_STRATEGY strategy_from_pc_id(PcIdentifier identifier) { |
| | |
| | | printf("Comparing pc identifiers: \n"); |
| | | #endif |
| | | result = decode_pc_id(user_identifiers[0], user_identifiers[1], str_code); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | return result; |
| | | } |
| | | previous_strategy_id = STRATEGY_UNKNOWN; |
| | |
| | | license-generator.cpp |
| | | LicenseSigner.cpp |
| | | ) |
| | | |
| | | link_directories ( ${Boost_LIBRARY_DIRS} ) |
| | | add_dependencies( license_generator_lib private_key ) |
| | | |
| | |
| | | IDENTIFICATION_STRATEGY strategy = IDENTIFICATION_STRATEGY::ETHERNET; |
| | | FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out, |
| | | strategy); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::FUNC_RET_OK); |
| | | cout << "Identifier:" << identifier_out << endl; |
| | | vector<string> extraArgs = { "-s", identifier_out }; |
| | | generate_license(licLocation, extraArgs); |
| | |
| | | for (int i = 0; i < num_strategies; i++) { |
| | | FUNCTION_RETURN generate_ok = generate_user_pc_signature(identifier_out, |
| | | strategies[i]); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::FUNC_RET_OK); |
| | | idfile << identifier_out << endl; |
| | | } |
| | | idfile.close(); |
| | |
| | | for (int i = 0; i < num_strategies; i++) { |
| | | FUNCTION_RETURN generate_ok = generate_user_pc_signature( |
| | | generated_identifier, strategies[i]); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::OK); |
| | | BOOST_ASSERT(generate_ok == FUNCTION_RETURN::FUNC_RET_OK); |
| | | if (reference_signatures[i] != generated_identifier) { |
| | | string message = string("pc signature compare fail: strategy:") |
| | | + to_string(strategies[i]) + " generated: [" |
| | |
| | | DiskInfo * diskInfos = NULL; |
| | | size_t disk_info_size = 0; |
| | | FUNCTION_RETURN result = getDiskInfos(NULL, &disk_info_size); |
| | | BOOST_CHECK_EQUAL(result, OK); |
| | | BOOST_CHECK_EQUAL(result, FUNC_RET_OK); |
| | | BOOST_CHECK_GT(disk_info_size, 0); |
| | | diskInfos = (DiskInfo*) malloc(sizeof(DiskInfo) * disk_info_size); |
| | | result = getDiskInfos(diskInfos, &disk_info_size); |
| | | BOOST_CHECK_EQUAL(result, OK); |
| | | BOOST_CHECK_EQUAL(result, FUNC_RET_OK); |
| | | BOOST_CHECK_GT(strlen(diskInfos[0].device), 0); |
| | | BOOST_CHECK_GT(strlen(diskInfos[0].label), 0); |
| | | BOOST_CHECK_GT(diskInfos[0].disk_sn[0], 0); |
| | |
| | | AdapterInfo * adapter_info = NULL; |
| | | size_t adapter_info_size = 0; |
| | | FUNCTION_RETURN result = getAdapterInfos(NULL, &adapter_info_size); |
| | | BOOST_CHECK_EQUAL(result, OK); |
| | | BOOST_CHECK_EQUAL(result, FUNC_RET_OK); |
| | | BOOST_CHECK_GT(adapter_info_size, 0); |
| | | adapter_info = (AdapterInfo*) malloc( |
| | | sizeof(AdapterInfo) * adapter_info_size); |
| | | result = getAdapterInfos(adapter_info, &adapter_info_size); |
| | | BOOST_CHECK_EQUAL(result, OK); |
| | | BOOST_CHECK_EQUAL(result, FUNC_RET_OK); |
| | | for (size_t i = 0; i < adapter_info_size; i++) { |
| | | cout << "Interface found: " << string(adapter_info[i].description) |
| | | << endl; |
| | |
| | | |
| | | //just calculate the number of required identifiers |
| | | result_plat_spec = generate_platform_specific_pc_id(NULL, &plat_spec_id); |
| | | if (result_plat_spec == OK) { |
| | | if (result_plat_spec == FUNC_RET_OK) { |
| | | required_id_size += 1; |
| | | } |
| | | result_adapterInfos = getAdapterInfos(NULL, &adapter_num); |
| | | result_diskinfos = getDiskInfos(NULL, &disk_num); |
| | | if (result_diskinfos == OK && result_adapterInfos == OK) { |
| | | if (result_diskinfos == FUNC_RET_OK && result_adapterInfos == FUNC_RET_OK) { |
| | | required_id_size += disk_num * adapter_num; |
| | | } else if (result_adapterInfos == OK) { |
| | | } else if (result_adapterInfos == FUNC_RET_OK) { |
| | | required_id_size += adapter_num; |
| | | } else if (result_diskinfos == OK) { |
| | | } else if (result_diskinfos == FUNC_RET_OK) { |
| | | required_id_size += disk_num; |
| | | } |
| | | int defined_identifiers = *num_identifiers; |
| | | if (identifiers == NULL) { |
| | | *num_identifiers = required_id_size; |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (required_id_size > defined_identifiers) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | |
| | | //calculate the identifiers |
| | | current_identifier = 0; |
| | | if (result_plat_spec == OK) { |
| | | if (result_plat_spec == FUNC_RET_OK) { |
| | | generate_platform_specific_pc_id(identifiers, 1); |
| | | current_identifier += 1; |
| | | } |
| | | if (result_diskinfos == OK && result_adapterInfos == OK) { |
| | | if (result_diskinfos == FUNC_RET_OK && result_adapterInfos == FUNC_RET_OK) { |
| | | diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); |
| | | result_diskinfos = getDiskInfos(diskInfos, &disk_num); |
| | | adapterInfos = (AdapterInfo*) malloc(adapter_num * sizeof(AdapterInfo)); |
| | |
| | | } |
| | | free(diskInfos); |
| | | free(adapterInfos); |
| | | } else if (result_adapterInfos == OK) { |
| | | } else if (result_adapterInfos == FUNC_RET_OK) { |
| | | i=defined_identifiers-current_identifier; |
| | | return generate_ethernet_pc_id(&identifiers[current_identifier], |
| | | &i, true); |
| | | } else if (result_diskinfos == OK) { |
| | | } else if (result_diskinfos == FUNC_RET_OK) { |
| | | i=defined_identifiers-current_identifier; |
| | | return generate_disk_pc_id(&identifiers[current_identifier], |
| | | &i, false); |
| | | } |
| | | |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static void encodeStrategy(PcIdentifier * identifier, |
| | |
| | | AdapterInfo *adapterInfos; |
| | | |
| | | result_adapterInfos = getAdapterInfos(NULL, &adapters); |
| | | if (result_adapterInfos != OK) { |
| | | if (result_adapterInfos != FUNC_RET_OK) { |
| | | return result_adapterInfos; |
| | | } |
| | | |
| | | int defined_adapters = *num_identifiers; |
| | | *num_identifiers = adapters; |
| | | if (identifiers == NULL) { |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (adapters > defined_adapters) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | |
| | | adapterInfos = (AdapterInfo*) malloc(adapters * sizeof(AdapterInfo)); |
| | |
| | | } |
| | | } |
| | | free(adapterInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers, |
| | |
| | | DiskInfo * diskInfos; |
| | | |
| | | result_diskinfos = getDiskInfos(NULL, &disk_num); |
| | | if (result_diskinfos != OK) { |
| | | if (result_diskinfos != FUNC_RET_OK) { |
| | | return result_diskinfos; |
| | | } |
| | | diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo)); |
| | | //memset(diskInfos,0,disk_num * sizeof(DiskInfo)); |
| | | result_diskinfos = getDiskInfos(diskInfos, &disk_num); |
| | | if (result_diskinfos != OK) { |
| | | if (result_diskinfos != FUNC_RET_OK) { |
| | | free(diskInfos); |
| | | return result_diskinfos; |
| | | } |
| | |
| | | *num_identifiers = available_disk_info; |
| | | if (identifiers == NULL) { |
| | | free(diskInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } else if (available_disk_info > defined_identifiers) { |
| | | free(diskInfos); |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | |
| | | j = 0; |
| | |
| | | } |
| | | } |
| | | free(diskInfos); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | /** |
| | |
| | | result = generate_platform_specific_pc_id(identifiers, array_size); |
| | | break; |
| | | default: |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | |
| | | if (result == OK && identifiers != NULL) { |
| | | if (result == FUNC_RET_OK && identifiers != NULL) { |
| | | //fill array if larger |
| | | for (i = *array_size; i < original_array_size; i++) { |
| | | identifiers[i][0] = STRATEGY_UNKNOWN << 5; |
| | |
| | | char* b64_data = base64(concat_identifiers, concatIdentifiersSize, |
| | | &b64_size); |
| | | if (b64_size > sizeof(PcSignature)) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | sprintf(pc_identifier_out, "%.4s-%.4s-%.4s-%.4s", &b64_data[0], |
| | | &b64_data[4], &b64_data[8], &b64_data[12]); |
| | | //free(concat_identifiers); |
| | | free(b64_data); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | FUNCTION_RETURN parity_check_id(PcSignature pc_identifier) { |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | FUNCTION_RETURN generate_user_pc_signature(PcSignature identifier_out, |
| | |
| | | PcIdentifier* identifiers; |
| | | unsigned int req_buffer_size = 0; |
| | | result = generate_pc_id(NULL, &req_buffer_size, strategy); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | return result; |
| | | } |
| | | if (req_buffer_size == 0) { |
| | | return ERROR; |
| | | return FUNC_RET_ERROR; |
| | | } |
| | | req_buffer_size = req_buffer_size < 2 ? 2 : req_buffer_size; |
| | | identifiers = (PcIdentifier *) malloc( |
| | | sizeof(PcIdentifier) * req_buffer_size); |
| | | result = generate_pc_id(identifiers, &req_buffer_size, strategy); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | free(identifiers); |
| | | return result; |
| | | } |
| | |
| | | &base64ids[8], &base64ids[12]); |
| | | concat_identifiers = unbase64(base64ids, 16, &identifiers_size); |
| | | if (identifiers_size > sizeof(PcIdentifier) * 2) { |
| | | return BUFFER_TOO_SMALL; |
| | | return FUNC_RET_BUFFER_TOO_SMALL; |
| | | } |
| | | memcpy(identifier1_out, concat_identifiers, sizeof(PcIdentifier)); |
| | | memcpy(identifier2_out, concat_identifiers + sizeof(PcIdentifier), |
| | | sizeof(PcIdentifier)); |
| | | free(concat_identifiers); |
| | | return OK; |
| | | return FUNC_RET_OK; |
| | | } |
| | | |
| | | static IDENTIFICATION_STRATEGY strategy_from_pc_id(PcIdentifier identifier) { |
| | |
| | | printf("Comparing pc identifiers: \n"); |
| | | #endif |
| | | result = decode_pc_id(user_identifiers[0], user_identifiers[1], str_code); |
| | | if (result != OK) { |
| | | if (result != FUNC_RET_OK) { |
| | | return result; |
| | | } |
| | | previous_strategy_id = STRATEGY_UNKNOWN; |