3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
18 #include "security-assistant/cryptograhic_hash_function.h"
20 #include <gpg-error.h>
22 #include "utility/sync_util.h"
24 #ifndef SYNC_AGENT_LOG
26 #define LOG_TAG "AF_SA"
29 static unsigned char *_crypt_crytograhic_hash_function(int algo, const char *data, int data_len, const char *key, int key_len, int flags);
30 static unsigned char *_crypt_symmetric_cipher_function(const char *plain, int plain_len, const char *key, int key_len, int flags);
32 unsigned char *sa_crypt_des(const char *plain, int plain_len, const char *key, int key_len)
40 return _crypt_symmetric_cipher_function(plain, plain_len, key, key_len, flags);
43 unsigned char *sa_crypt_md5(sync_agent_sa_cryptographic_hash_function_flags_e flags, const char *plain, int plain_len, const char *key, int key_len)
47 unsigned char *crypt_data = NULL;
50 case SYNC_AGENT_SA_CRYPTOGRAHIC_HASH_FUN_HMAC:
52 _DEBUG_INFO("SYNC_AGENT_SA_CRYPTOGRAHIC_HASH_FUN_HMAC");
53 crypt_data = _crypt_crytograhic_hash_function(GCRY_MD_MD5, plain, plain_len, key, key_len, GCRY_MD_FLAG_HMAC);
58 _DEBUG_INFO("default");
59 crypt_data = _crypt_crytograhic_hash_function(GCRY_MD_MD5, plain, plain_len, 0, 0, 0);
69 unsigned char *sa_crypt_sha1(sync_agent_sa_cryptographic_hash_function_flags_e flags, const char *plain, int plain_len, const char *key, int key_len)
73 unsigned char *crypt_data = NULL;
76 case SYNC_AGENT_SA_CRYPTOGRAHIC_HASH_FUN_HMAC:
78 _DEBUG_INFO("SYNC_AGENT_SA_CRYPTOGRAHIC_HASH_FUN_HMAC");
79 crypt_data = _crypt_crytograhic_hash_function(GCRY_MD_SHA1, plain, plain_len, key, key_len, GCRY_MD_FLAG_HMAC);
84 _DEBUG_INFO("default");
85 crypt_data = _crypt_crytograhic_hash_function(GCRY_MD_SHA1, plain, plain_len, 0, 0, 0);
95 static unsigned char *_crypt_crytograhic_hash_function(int algo, const char *data, int data_len, const char *key, int key_len, int flags)
100 unsigned char *crypt_data = NULL;
101 unsigned char *p = NULL;
102 int crypt_data_len = 0;
104 gcry_error_t err = 0;
106 err = gcry_md_open(&hd, algo, flags);
108 _DEBUG_TRACE("algo %d, grcy_md_open failed: %s\n", algo, gpg_strerror(err));
112 crypt_data_len = gcry_md_get_algo_dlen(algo);
113 if (crypt_data_len < 1 || crypt_data_len > 500) {
114 _DEBUG_TRACE("algo %d, grcy_md_get_algo_dlen failed: %d\n", algo, crypt_data_len);
119 gcry_md_setkey(hd, key, key_len);
121 _DEBUG_TRACE("algo %d, grcy_md_setkey failed: %s\n", algo, gpg_strerror(err));
126 if (*data == '!' && !data[1]) { /* hash one million times a "a" */
129 /* Write in odd size chunks so that we test the buffering. */
130 memset(aaa, 'a', 1000);
131 for (i = 0; i < 1000; i++)
132 gcry_md_write(hd, aaa, 1000);
134 gcry_md_write(hd, data, data_len);
137 err = gcry_md_copy(&hd2, hd);
139 _DEBUG_TRACE("algo %d, gcry_md_copy failed: %s\n", algo, gpg_strerror(err));
144 p = gcry_md_read(hd2, algo);
146 crypt_data = (unsigned char *)strdup((const char *)p);
156 static unsigned char *_crypt_symmetric_cipher_function(const char *plain, int plain_len, const char *key, int key_len, int flags)