IOT-1583: Removing /W3 warning from resource/csdk/security.
[iotivity.git] / resource / csdk / security / src / pbkdf2.c
1 /******************************************************************
2 *
3 * Copyright 2016 Microsoft Corporation
4 *
5 *
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *     http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 ******************************************************************/
20
21 #include "logger.h"
22 #include "mbedtls/pkcs5.h"
23 #include "mbedtls/md.h"
24 #include <inttypes.h>
25
26 #define TAG "OIC_SEC_PBDKF2"
27
28 int DeriveCryptoKeyFromPassword(const unsigned char *passwd, size_t pLen,
29     const uint8_t *salt, size_t saltLen,
30     size_t iterations,
31     size_t keyLen, uint8_t *derivedKey)
32 {
33     mbedtls_md_context_t sha_ctx;
34     const mbedtls_md_info_t *info_sha;
35     int ret = -1;
36
37     if (iterations > UINT_MAX)
38     {
39         OIC_LOG_V(ERROR, TAG, "Number of iterations over maximum %u", UINT_MAX);
40         return ret;
41     }
42
43     if (keyLen > UINT32_MAX)
44     {
45         OIC_LOG_V(ERROR, TAG, "Key length over maximum %u", UINT32_MAX);
46         return ret;
47     }
48
49     /* Setup the hash/HMAC function, for the PBKDF2 function. */
50     mbedtls_md_init(&sha_ctx);
51
52     info_sha = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);
53     if (info_sha == NULL)
54     {
55         OIC_LOG(ERROR, TAG, "Failed to get hash information");
56         return ret;
57     }
58
59     ret = mbedtls_md_setup(&sha_ctx, info_sha, 1);
60     if (ret != 0)
61     {
62         OIC_LOG(ERROR, TAG, "Failed to setup hash function");
63         return ret;
64     }
65
66     ret = mbedtls_pkcs5_pbkdf2_hmac(&sha_ctx,
67                                     passwd, pLen,
68                                     salt, saltLen,
69                                     (unsigned int)iterations,
70                                     (uint32_t)keyLen, derivedKey);
71     if (ret != 0)
72     {
73         OIC_LOG(ERROR, TAG, "Call to mbedtls PBKDF2 function failed");
74     }
75
76     mbedtls_md_free(&sha_ctx);
77     return ret;
78 }