mirror of https://github.com/ossrs/srs.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
7.6 KiB
C
204 lines
7.6 KiB
C
/*
|
|
* SRT - Secure, Reliable, Transport
|
|
* Copyright (c) 2019 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.
|
|
|
|
2019-06-28 (jdube)
|
|
CRYSPR/4SRT Initial implementation.
|
|
*****************************************************************************/
|
|
|
|
#ifndef CRYSPR_H
|
|
#define CRYSPR_H
|
|
|
|
#include <stdbool.h>
|
|
#include <sys/types.h>
|
|
|
|
#if !defined(HAISRT_VERSION_INT)
|
|
#include "haicrypt.h"
|
|
#include "hcrypt_msg.h"
|
|
#else
|
|
// Included by haisrt.h or similar
|
|
#include "haisrt/haicrypt.h"
|
|
#include "haisrt/hcrypt_msg.h"
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "cryspr-config.h"
|
|
|
|
typedef struct tag_CRYSPR_cb {
|
|
CRYSPR_AESCTX aes_kek; /* Key Encrypting Key (KEK) */
|
|
CRYSPR_AESCTX aes_sek[2]; /* even/odd Stream Encrypting Key (SEK) */
|
|
|
|
struct tag_CRYSPR_methods *cryspr;
|
|
|
|
#if !CRYSPR_HAS_AESCTR
|
|
/* Reserve room to build the counter stream ourself */
|
|
#define HCRYPT_CTR_BLK_SZ CRYSPR_AESBLKSZ
|
|
#define HCRYPT_CTR_STREAM_SZ 2048
|
|
unsigned char * ctr_stream;
|
|
size_t ctr_stream_len; /* Content size */
|
|
size_t ctr_stream_siz; /* Allocated length */
|
|
#endif /* !CRYSPR_HAS_AESCTR */
|
|
|
|
#define CRYSPR_OUTMSGMAX 6
|
|
uint8_t * outbuf; /* output circle buffer */
|
|
size_t outbuf_ofs; /* write offset in circle buffer */
|
|
size_t outbuf_siz; /* circle buffer size */
|
|
} CRYSPR_cb;
|
|
|
|
typedef struct tag_CRYSPR_methods {
|
|
/*
|
|
* prng:
|
|
* Pseudo-Random Number Generator
|
|
*/
|
|
int (*prng)(
|
|
unsigned char *rn, /* out: pseudo random number */
|
|
int rn_len);
|
|
|
|
int (*aes_set_key)(
|
|
bool bEncrypt, /* true Enxcrypt key, false: decrypt */
|
|
const unsigned char *kstr,/* key string*/
|
|
size_t kstr_len, /* kstr len in bytes (16, 24, or 32 bytes (for AES128,AES192, or AES256) */
|
|
CRYSPR_AESCTX *aeskey); /* Cryptolib Specific AES key context */
|
|
|
|
int (*aes_ecb_cipher)(
|
|
bool bEncrypt, /* true:encrypt false:decrypt */
|
|
CRYSPR_AESCTX *aes_key, /* ctx */
|
|
const unsigned char *indata, /* src (clear text)*/
|
|
size_t inlen, /* src length */
|
|
unsigned char *out_txt, /* dst (cipher text) */
|
|
size_t *outlen); /* dst length */
|
|
|
|
int (*aes_ctr_cipher)(
|
|
bool bEncrypt, /* true:encrypt false:decrypt (don't care with CTR) */
|
|
CRYSPR_AESCTX *aes_key, /* ctx */
|
|
unsigned char *iv, /* iv */
|
|
const unsigned char *indata, /* src (clear text) */
|
|
size_t inlen, /* src length */
|
|
unsigned char *out_txt);/* dest */
|
|
|
|
unsigned char *(*sha1_msg_digest)(
|
|
const unsigned char *m, /* in: message */
|
|
size_t m_len, /* message length */
|
|
unsigned char *md); /* out: message digest buffer *160 bytes */
|
|
|
|
/*
|
|
* open:
|
|
* Create a cipher instance
|
|
* Allocate output buffers
|
|
*/
|
|
CRYSPR_cb *(*open)(
|
|
struct tag_CRYSPR_methods *cryspr,
|
|
size_t max_len); /* Maximum packet length that will be encrypted/decrypted */
|
|
|
|
/*
|
|
* close:
|
|
* Release any cipher resources
|
|
*/
|
|
int (*close)(
|
|
CRYSPR_cb *cryspr_data); /* Cipher handle, internal data */
|
|
|
|
/*
|
|
* pbkdf2_hmac_sha1
|
|
* Password-based Key Derivation Function 2
|
|
*/
|
|
int (*km_pbkdf2)(
|
|
CRYSPR_cb *cryspr_cb, /* Cryspr Control Block */
|
|
char *passwd, /* passphrase */
|
|
size_t passwd_len, /* passphrase len */
|
|
unsigned char *salt, /* salt */
|
|
size_t salt_len, /* salt_len */
|
|
int itr, /* iterations */
|
|
size_t out_len, /* key_len */
|
|
unsigned char *out); /* derived key */
|
|
|
|
/*
|
|
* km_setkey:
|
|
* Set the Key Encypting Key for Wrap (Encryption) or UnWrap (Decryption).
|
|
* Context (ctx) tells if it's for Wrap or Unwrap
|
|
* A Context flags (ctx->flags) also tells if this is for wrap(encryption) or unwrap(decryption) context (HCRYPT_CTX_F_ENCRYPT)
|
|
*/
|
|
int (*km_setkey)(
|
|
CRYSPR_cb *cryspr_cb, /* Cryspr Control Block */
|
|
bool bWrap, /* True: Wrap KEK, False: Unwrap KEK */
|
|
const unsigned char *kek, size_t kek_len); /* KEK: Key Encrypting Key */
|
|
|
|
/*
|
|
* km_wrap:
|
|
* wrap media stream key
|
|
*/
|
|
int (*km_wrap)(CRYSPR_cb *cryspr_cb,
|
|
unsigned char *wrap,
|
|
const unsigned char *sek,
|
|
unsigned int seklen);
|
|
|
|
/*
|
|
* km_unwrap:
|
|
* wrap media stream key
|
|
*/
|
|
int (*km_unwrap)(CRYSPR_cb *cryspr_cb,
|
|
unsigned char *sek,
|
|
const unsigned char *wrap,
|
|
unsigned int wraplen);
|
|
/*
|
|
* setkey:
|
|
* Set the Odd or Even, Encryption or Decryption key.
|
|
* Context (ctx) tells if it's for Odd or Even key (hcryptCtx_GetKeyIndex(ctx))
|
|
* A Context flags (ctx->flags) also tells if this is an encryption or decryption context (HCRYPT_CTX_F_ENCRYPT)
|
|
*/
|
|
int (*ms_setkey)(
|
|
CRYSPR_cb *cryspr_cb, /* Cryspr Control Block */
|
|
hcrypt_Ctx *ctx, /* HaiCrypt Context (cipher, keys, Odd/Even, etc..) */
|
|
const unsigned char *key, size_t kwelen); /* New Key */
|
|
|
|
/*
|
|
* encrypt:
|
|
* Submit a list of nbin clear transport packets (hcrypt_DataDesc *in_data) to encryption
|
|
* returns *nbout encrypted data packets of length out_len_p[] into out_p[]
|
|
*
|
|
* If cipher implements deferred encryption (co-processor, async encryption),
|
|
* it may return no encrypted packets, or encrypted packets for clear text packets of a previous call.
|
|
*/
|
|
int (*ms_encrypt)(
|
|
CRYSPR_cb *cryspr_cb, /* Cryspr Control Block */
|
|
hcrypt_Ctx *ctx, /* HaiCrypt Context (cipher, keys, Odd/Even, etc..) */
|
|
hcrypt_DataDesc *in_data, int nbin, /* Clear text transport packets: header and payload */
|
|
void *out_p[], size_t out_len_p[], int *nbout); /* Encrypted packets */
|
|
|
|
/*
|
|
* decrypt:
|
|
* Submit a list of nbin encrypted transport packets (hcrypt_DataDesc *in_data) to decryption
|
|
* returns *nbout clear text data packets of length out_len_p[] into out_p[]
|
|
*
|
|
* If cipher implements deferred decryption (co-processor, async encryption),
|
|
* it may return no decrypted packets, or decrypted packets for encrypted packets of a previous call.
|
|
*/
|
|
int (*ms_decrypt)(
|
|
CRYSPR_cb *cryspr_cb, /* Cryspr Control Block */
|
|
hcrypt_Ctx *ctx, /* HaiCrypt Context (cipher, keys, Odd/Even, etc..) */
|
|
hcrypt_DataDesc *in_data, int nbin, /* Clear text transport packets: header and payload */
|
|
void *out_p[], size_t out_len_p[], int *nbout); /* Encrypted packets */
|
|
|
|
} CRYSPR_methods;
|
|
|
|
CRYSPR_methods *crysprInit(CRYSPR_methods *cryspr);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* CRYSPR_H */
|