Skip to content
Snippets Groups Projects
Select Git revision
  • n-iot-preview-4
  • master default protected
  • android-7.1.2_r28_klist
  • pie-cts-release
  • pie-vts-release
  • pie-cts-dev
  • oreo-mr1-iot-release
  • sdk-release
  • oreo-m6-s4-release
  • oreo-m4-s12-release
  • pie-release
  • pie-r2-release
  • pie-r2-s1-release
  • oreo-vts-release
  • oreo-cts-release
  • oreo-dev
  • oreo-mr1-dev
  • pie-gsi
  • pie-platform-release
  • pie-dev
  • oreo-cts-dev
  • android-o-mr1-iot-release-1.0.4
  • android-9.0.0_r8
  • android-9.0.0_r7
  • android-9.0.0_r6
  • android-9.0.0_r5
  • android-8.1.0_r46
  • android-8.1.0_r45
  • android-n-iot-release-smart-display-r2
  • android-vts-8.1_r5
  • android-cts-8.1_r8
  • android-cts-8.0_r12
  • android-cts-7.1_r20
  • android-cts-7.0_r24
  • android-o-mr1-iot-release-1.0.3
  • android-cts-9.0_r1
  • android-8.1.0_r43
  • android-8.1.0_r42
  • android-n-iot-release-smart-display
  • android-p-preview-5
  • android-9.0.0_r3
41 results

hostapd.te

Blame
  • ecdh_helper.c 1.97 KiB
    // SPDX-License-Identifier: GPL-2.0-or-later
    /*
     * Copyright (c) 2016, Intel Corporation
     * Authors: Salvatore Benedetto <salvatore.benedetto@intel.com>
     */
    #include <linux/kernel.h>
    #include <linux/export.h>
    #include <linux/err.h>
    #include <linux/string.h>
    #include <crypto/ecdh.h>
    #include <crypto/kpp.h>
    
    #define ECDH_KPP_SECRET_MIN_SIZE (sizeof(struct kpp_secret) + sizeof(short))
    
    static inline u8 *ecdh_pack_data(void *dst, const void *src, size_t sz)
    {
    	memcpy(dst, src, sz);
    	return dst + sz;
    }
    
    static inline const u8 *ecdh_unpack_data(void *dst, const void *src, size_t sz)
    {
    	memcpy(dst, src, sz);
    	return src + sz;
    }
    
    unsigned int crypto_ecdh_key_len(const struct ecdh *params)
    {
    	return ECDH_KPP_SECRET_MIN_SIZE + params->key_size;
    }
    EXPORT_SYMBOL_GPL(crypto_ecdh_key_len);
    
    int crypto_ecdh_encode_key(char *buf, unsigned int len,
    			   const struct ecdh *params)
    {
    	u8 *ptr = buf;
    	struct kpp_secret secret = {
    		.type = CRYPTO_KPP_SECRET_TYPE_ECDH,
    		.len = len
    	};
    
    	if (unlikely(!buf))
    		return -EINVAL;
    
    	if (len != crypto_ecdh_key_len(params))
    		return -EINVAL;
    
    	ptr = ecdh_pack_data(ptr, &secret, sizeof(secret));
    	ptr = ecdh_pack_data(ptr, &params->key_size, sizeof(params->key_size));
    	ecdh_pack_data(ptr, params->key, params->key_size);
    
    	return 0;
    }
    EXPORT_SYMBOL_GPL(crypto_ecdh_encode_key);
    
    int crypto_ecdh_decode_key(const char *buf, unsigned int len,
    			   struct ecdh *params)
    {
    	const u8 *ptr = buf;
    	struct kpp_secret secret;
    
    	if (unlikely(!buf || len < ECDH_KPP_SECRET_MIN_SIZE))
    		return -EINVAL;
    
    	ptr = ecdh_unpack_data(&secret, ptr, sizeof(secret));
    	if (secret.type != CRYPTO_KPP_SECRET_TYPE_ECDH)
    		return -EINVAL;
    
    	if (unlikely(len < secret.len))
    		return -EINVAL;
    
    	ptr = ecdh_unpack_data(&params->key_size, ptr, sizeof(params->key_size));
    	if (secret.len != crypto_ecdh_key_len(params))
    		return -EINVAL;
    
    	/* Don't allocate memory. Set pointer to data
    	 * within the given buffer
    	 */
    	params->key = (void *)ptr;
    
    	return 0;
    }
    EXPORT_SYMBOL_GPL(crypto_ecdh_decode_key);