/* * struct ss_clock - Describe clocks used by sun8i-ss * @name: Name of clock needed by this variant * @freq: Frequency to set for each clock * @max_freq: Maximum frequency for each clock
*/ struct ss_clock { constchar *name; unsignedlong freq; unsignedlong max_freq;
};
/* * struct ss_variant - Describe SS capability for each variant hardware * @alg_cipher: list of supported ciphers. for each SS_ID_ this will give the * coresponding SS_ALG_XXX value * @alg_hash: list of supported hashes. for each SS_ID_ this will give the * corresponding SS_ALG_XXX value * @op_mode: list of supported block modes * @ss_clks: list of clock needed by this variant
*/ struct ss_variant { char alg_cipher[SS_ID_CIPHER_MAX]; char alg_hash[SS_ID_HASH_MAX];
u32 op_mode[SS_ID_OP_MAX]; struct ss_clock ss_clks[SS_MAX_CLOCKS];
};
struct sginfo {
u32 addr;
u32 len;
};
/* * struct sun8i_ss_flow - Information used by each flow * @engine: ptr to the crypto_engine for this flow * @complete: completion for the current task on this flow * @status: set to 1 by interrupt if task is done * @stat_req: number of request done by this flow * @iv: list of IV to use for each step * @biv: buffer which contain the backuped IV * @pad: padding buffer for hash operations * @result: buffer for storing the result of hash operations
*/ struct sun8i_ss_flow { struct crypto_engine *engine; struct completion complete; int status;
u8 *iv[MAX_SG];
u8 *biv; void *pad; void *result; #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG unsignedlong stat_req; #endif
};
/* * struct sun8i_ss_dev - main container for all this driver information * @base: base address of SS * @ssclks: clocks used by SS * @reset: pointer to reset controller * @dev: the platform device * @mlock: Control access to device registers * @flows: array of all flow * @flow: flow to use in next request * @variant: pointer to variant specific data * @dbgfs_dir: Debugfs dentry for statistic directory * @dbgfs_stats: Debugfs dentry for statistic counters
*/ struct sun8i_ss_dev { void __iomem *base; struct clk *ssclks[SS_MAX_CLOCKS]; struct reset_control *reset; struct device *dev; struct mutex mlock; struct sun8i_ss_flow *flows;
atomic_t flow; conststruct ss_variant *variant; #ifdef CONFIG_CRYPTO_DEV_SUN8I_SS_DEBUG struct dentry *dbgfs_dir; struct dentry *dbgfs_stats; #endif
};
/* * struct sun8i_cipher_req_ctx - context for a skcipher request * @t_src: list of mapped SGs with their size * @t_dst: list of mapped SGs with their size * @p_key: DMA address of the key * @p_iv: DMA address of the IVs * @niv: Number of IVs DMA mapped * @method: current algorithm for this request * @op_mode: op_mode for this request * @op_dir: direction (encrypt vs decrypt) for this request * @flow: the flow to use for this request * @ivlen: size of IVs * @keylen: keylen for this request * @fallback_req: request struct for invoking the fallback skcipher TFM
*/ struct sun8i_cipher_req_ctx { struct sginfo t_src[MAX_SG]; struct sginfo t_dst[MAX_SG];
u32 p_key;
u32 p_iv[MAX_SG]; int niv;
u32 method;
u32 op_mode;
u32 op_dir; int flow; unsignedint ivlen; unsignedint keylen; struct skcipher_request fallback_req; // keep at the end
};
/* * struct sun8i_cipher_tfm_ctx - context for a skcipher TFM * @key: pointer to key data * @keylen: len of the key * @ss: pointer to the private data of driver handling this TFM * @fallback_tfm: pointer to the fallback TFM
*/ struct sun8i_cipher_tfm_ctx {
u32 *key;
u32 keylen; struct sun8i_ss_dev *ss; struct crypto_skcipher *fallback_tfm;
};
/* * struct sun8i_ss_prng_ctx - context for PRNG TFM * @seed: The seed to use * @slen: The size of the seed
*/ struct sun8i_ss_rng_tfm_ctx { void *seed; unsignedint slen;
};
/* * struct sun8i_ss_hash_tfm_ctx - context for an ahash TFM * @fallback_tfm: pointer to the fallback TFM * @ss: pointer to the private data of driver handling this TFM
*/ struct sun8i_ss_hash_tfm_ctx { struct crypto_ahash *fallback_tfm; struct sun8i_ss_dev *ss;
u8 *ipad;
u8 *opad;
u8 key[SHA256_BLOCK_SIZE]; int keylen;
};
/* * struct sun8i_ss_hash_reqctx - context for an ahash request * @t_src: list of DMA address and size for source SGs * @t_dst: list of DMA address and size for destination SGs * @fallback_req: pre-allocated fallback request * @method: the register value for the algorithm used by this request * @flow: the flow to use for this request
*/ struct sun8i_ss_hash_reqctx { struct sginfo t_src[MAX_SG]; struct sginfo t_dst[MAX_SG]; struct ahash_request fallback_req;
u32 method; int flow;
};
/* * struct sun8i_ss_alg_template - crypto_alg template * @type: the CRYPTO_ALG_TYPE for this template * @ss_algo_id: the SS_ID for this template * @ss_blockmode: the type of block operation SS_ID * @ss: pointer to the sun8i_ss_dev structure associated with * this template * @alg: one of sub struct must be used * @stat_req: number of request done on this template * @stat_fb: number of request which has fallbacked * @stat_bytes: total data size done by this template
*/ struct sun8i_ss_alg_template {
u32 type;
u32 ss_algo_id;
u32 ss_blockmode; struct sun8i_ss_dev *ss; union { struct skcipher_engine_alg skcipher; struct rng_alg rng; struct ahash_engine_alg hash;
} alg; unsignedlong stat_req; unsignedlong stat_fb; unsignedlong stat_bytes; unsignedlong stat_fb_len; unsignedlong stat_fb_sglen; unsignedlong stat_fb_align; unsignedlong stat_fb_sgnum; char fbname[CRYPTO_MAX_ALG_NAME];
};
int sun8i_ss_aes_setkey(struct crypto_skcipher *tfm, const u8 *key, unsignedint keylen); int sun8i_ss_des3_setkey(struct crypto_skcipher *tfm, const u8 *key, unsignedint keylen); int sun8i_ss_cipher_init(struct crypto_tfm *tfm); void sun8i_ss_cipher_exit(struct crypto_tfm *tfm); int sun8i_ss_handle_cipher_request(struct crypto_engine *engine, void *areq); int sun8i_ss_skdecrypt(struct skcipher_request *areq); int sun8i_ss_skencrypt(struct skcipher_request *areq);
int sun8i_ss_get_engine_number(struct sun8i_ss_dev *ss);
int sun8i_ss_run_task(struct sun8i_ss_dev *ss, struct sun8i_cipher_req_ctx *rctx, constchar *name); int sun8i_ss_prng_generate(struct crypto_rng *tfm, const u8 *src, unsignedint slen, u8 *dst, unsignedint dlen); int sun8i_ss_prng_seed(struct crypto_rng *tfm, const u8 *seed, unsignedint slen); int sun8i_ss_prng_init(struct crypto_tfm *tfm); void sun8i_ss_prng_exit(struct crypto_tfm *tfm);
int sun8i_ss_hash_init_tfm(struct crypto_ahash *tfm); void sun8i_ss_hash_exit_tfm(struct crypto_ahash *tfm); int sun8i_ss_hash_init(struct ahash_request *areq); int sun8i_ss_hash_export(struct ahash_request *areq, void *out); int sun8i_ss_hash_import(struct ahash_request *areq, constvoid *in); int sun8i_ss_hash_final(struct ahash_request *areq); int sun8i_ss_hash_update(struct ahash_request *areq); int sun8i_ss_hash_finup(struct ahash_request *areq); int sun8i_ss_hash_digest(struct ahash_request *areq); int sun8i_ss_hash_run(struct crypto_engine *engine, void *breq); int sun8i_ss_hmac_setkey(struct crypto_ahash *ahash, const u8 *key, unsignedint keylen);
Messung V0.5
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.