void keystore_save(struct keystore_t *keystore) { g_assert(keystore); GKeyFile *keyfile = g_key_file_new(); if (NULL != keystore->aes) { g_hash_table_foreach(keystore->aes, keystore_save_aeskey, keyfile); } if (NULL != keystore->rsa) { g_hash_table_foreach(keystore->rsa, keystore_save_rsakey, keyfile); } /* save to disk */ if (0 == g_mkdir_with_parents(SECURITY_KEYSTORE_DIR, 0700)) { gsize length = 0; gchar *keystore_data = g_key_file_to_data(keyfile, &length, NULL); if (!g_file_set_contents(SECURITY_KEYSTORE_PATH, keystore_data, length, NULL)) { nyx_debug("%s: g_file_set_contents error", __FUNCTION__); } g_free(keystore_data); } g_key_file_free(keyfile); }
nyx_error_t keystore_load(struct keystore_t *keystore) { if (FALSE == g_file_test(SECURITY_KEYSTORE_PATH, G_FILE_TEST_EXISTS)) { return NYX_ERROR_NONE; } GKeyFile *keyfile = g_key_file_new(); GKeyFileFlags flags = G_KEY_FILE_NONE; if (!g_key_file_load_from_file(keyfile, SECURITY_KEYSTORE_PATH, flags, NULL)) { nyx_debug("%s: g_key_file_load_from_file error", __FUNCTION__); g_key_file_free(keyfile); return NYX_ERROR_GENERIC; } int i; /* load aes keys */ gchar **aes_keys = g_key_file_get_keys(keyfile, "aes", NULL, NULL); if (NULL != aes_keys) { for (i = 0; aes_keys[i] != NULL; ++i) { keystore_load_aeskey(keyfile, aes_keys[i], keystore); } g_strfreev(aes_keys); } /* load rsa keys */ gchar **rsa_keys = g_key_file_get_keys(keyfile, "rsa", NULL, NULL); if (NULL != rsa_keys) { for (i = 0; rsa_keys[i] != NULL; ++i) { keystore_load_rsakey(keyfile, rsa_keys[i], keystore); } g_strfreev(rsa_keys); } g_key_file_free(keyfile); return NYX_ERROR_NONE; }
nyx_error_t nyx_module_close(nyx_device_t *d) { touchpanel_device_t* touchpanel_device = (touchpanel_device_t*) d; if (touchpanel_device->current_event_ptr) { touchpanel_release_event(d, (nyx_event_t*) touchpanel_device->current_event_ptr); } nyx_debug("Freeing touchpanel %p", d); deinit_gesture_state_machine(); free(d); if(touchpanel_event_fd >= 0) { close(touchpanel_event_fd); touchpanel_event_fd = -1; } return NYX_ERROR_NONE; }
nyx_error_t aes_crypt(int index, int encrypt, nyx_security_aes_block_mode_t mode, const char *src, int srclen, char *dest, int *destlen, int *ivlen) { struct aes_key_t *aes_key = (struct aes_key_t *) keystore_key_lookup( keystore.aes, index); if (aes_key == NULL) { nyx_debug("%s: invalid key", __FUNCTION__); return NYX_ERROR_INVALID_VALUE; } const struct aes_algo_data_t *algo = aes_algo_data_lookup(aes_key->keylen, mode); if (algo == NULL) { return NYX_ERROR_INVALID_VALUE; } nyx_error_t result = NYX_ERROR_NONE; /* IV saved at beginning of encryption buffer */ unsigned char *iv = encrypt ? (unsigned char *)dest : (unsigned char *)src; if (encrypt) { *ivlen = AES_BLOCK_SIZE; /* skip IV */ dest += AES_BLOCK_SIZE; /* generate IV */ if (!RAND_bytes(iv, AES_BLOCK_SIZE)) { return NYX_ERROR_GENERIC; } } else { g_assert(AES_BLOCK_SIZE == *ivlen); /* skip IV */ src += *ivlen; srclen -= *ivlen; } EVP_CIPHER_CTX ctx; EVP_CIPHER_CTX_init(&ctx); EVP_CipherInit_ex(&ctx, algo->cipher_fun(), NULL, NULL, NULL, encrypt); EVP_CIPHER_CTX_set_key_length(&ctx, aes_key->keylen); EVP_CipherInit_ex(&ctx, NULL, NULL, aes_key->key, iv, encrypt); if (!EVP_CipherUpdate(&ctx, (unsigned char *)dest, destlen, (unsigned char *)src, srclen)) { nyx_debug("EVP_CipherUpdate failed"); ERR_print_errors_fp(stderr); result = NYX_ERROR_GENERIC; goto out; } int tmplen; if (!EVP_CipherFinal_ex(&ctx, (unsigned char *)dest + *destlen, &tmplen)) { nyx_debug("EVP_CipherFinal_ex failed"); ERR_print_errors_fp(stderr); result = NYX_ERROR_GENERIC; goto out; } *destlen += tmplen; if (encrypt) { *destlen += *ivlen; } out: EVP_CIPHER_CTX_cleanup(&ctx); return result; }