mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * SRT - Secure, Reliable, Transport
 | |
|  * Copyright (c) 2018 Haivision Systems Inc.
 | |
|  * 
 | |
|  * This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | |
|  * 
 | |
|  */
 | |
| 
 | |
| 
 | |
| /*****************************************************************************
 | |
| written by
 | |
|    Haivision Systems Inc.
 | |
| 
 | |
|    2011-06-23 (jdube)
 | |
|         HaiCrypt initial implementation.
 | |
| *****************************************************************************/
 | |
| 
 | |
| /*
 | |
|  * For now: 
 | |
|  *  Pre-shared or password derived KEK (Key Encrypting Key)
 | |
|  * Future:
 | |
|  *  Certificate-based association
 | |
|  */
 | |
| #include <string.h>				/* memcpy */
 | |
| #include "hcrypt.h"
 | |
| 
 | |
| int hcryptCtx_SetSecret(hcrypt_Session *crypto, hcrypt_Ctx *ctx, const HaiCrypt_Secret *secret)
 | |
| {
 | |
| 	int iret;
 | |
| 	(void)crypto;
 | |
| 
 | |
| 	switch(secret->typ) {
 | |
| 	case HAICRYPT_SECTYP_PRESHARED:
 | |
| 		ASSERT(secret->len <= HAICRYPT_KEY_MAX_SZ);
 | |
| 		ctx->cfg.pwd_len = 0;
 | |
| 		/* KEK: Key Encrypting Key */
 | |
| 		if (0 > (iret = crypto->cryspr->km_setkey(crypto->cryspr_cb,
 | |
| 							  ((HCRYPT_CTX_F_ENCRYPT & ctx->flags) ? true : false),
 | |
| 							  secret->str, secret->len))) {
 | |
| 			HCRYPT_LOG(LOG_ERR, "km_setkey(pdkek[%zd]) failed (rc=%d)\n", secret->len, iret);
 | |
| 			return(-1);
 | |
| 		}
 | |
| 		ctx->status = HCRYPT_CTX_S_SARDY;
 | |
| 		break;
 | |
| 
 | |
| 	case HAICRYPT_SECTYP_PASSPHRASE:
 | |
| 		ASSERT(secret->len <= sizeof(ctx->cfg.pwd));
 | |
| 		memcpy(ctx->cfg.pwd, secret->str, secret->len);
 | |
| 		ctx->cfg.pwd_len = secret->len;
 | |
| 		/* KEK will be derived from password with Salt */
 | |
| 		ctx->status = HCRYPT_CTX_S_SARDY;
 | |
| 		break;
 | |
| 
 | |
| 	default:
 | |
| 	    HCRYPT_LOG(LOG_ERR, "Unknown secret type  %d\n", 
 | |
| 			secret->typ);
 | |
| 		return(-1);
 | |
| 	}
 | |
| 	return(0);
 | |
| }
 | |
| 
 | |
| int hcryptCtx_GenSecret(hcrypt_Session *crypto, hcrypt_Ctx *ctx)
 | |
| {
 | |
| 	/*
 | |
| 	 * KEK need same length as the key it protects (SEK)
 | |
| 	 * KEK = PBKDF2(Pwd, LSB(64, Salt), Iter, Klen)
 | |
| 	 */
 | |
| 	unsigned char kek[HAICRYPT_KEY_MAX_SZ];
 | |
| 	size_t kek_len = ctx->sek_len;
 | |
| 	size_t pbkdf_salt_len = (ctx->salt_len >= HAICRYPT_PBKDF2_SALT_LEN
 | |
| 		? HAICRYPT_PBKDF2_SALT_LEN 
 | |
| 		: ctx->salt_len);
 | |
| 	int iret = 0;
 | |
| 	(void)crypto;
 | |
| 
 | |
| 	iret = crypto->cryspr->km_pbkdf2(crypto->cryspr_cb, ctx->cfg.pwd, ctx->cfg.pwd_len,
 | |
| 		&ctx->salt[ctx->salt_len - pbkdf_salt_len], pbkdf_salt_len, 
 | |
| 		HAICRYPT_PBKDF2_ITER_CNT, kek_len, kek);
 | |
| 
 | |
| 	if(iret) {
 | |
| 		HCRYPT_LOG(LOG_ERR, "km_pbkdf2() failed (rc=%d)\n", iret);
 | |
| 		return(-1);
 | |
| 	}
 | |
| 	HCRYPT_PRINTKEY(ctx->cfg.pwd, ctx->cfg.pwd_len, "pwd");
 | |
| 	HCRYPT_PRINTKEY(kek, kek_len, "kek");
 | |
| 	
 | |
| 	/* KEK: Key Encrypting Key */
 | |
| 	if (0 > (iret = crypto->cryspr->km_setkey(crypto->cryspr_cb, ((HCRYPT_CTX_F_ENCRYPT & ctx->flags) ? true : false), kek, kek_len))) {
 | |
| 		HCRYPT_LOG(LOG_ERR, "km_setkey(pdkek[%zd]) failed (rc=%d)\n", kek_len, iret);
 | |
| 		return(-1);
 | |
| 	}
 | |
| 	return(0);
 | |
| }
 | |
| 
 |