diff options
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/talitos.c | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index ce38b05c8def..4e8153a839a4 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
@@ -46,6 +46,8 @@ | |||
46 | #include <crypto/aead.h> | 46 | #include <crypto/aead.h> |
47 | #include <crypto/authenc.h> | 47 | #include <crypto/authenc.h> |
48 | #include <crypto/skcipher.h> | 48 | #include <crypto/skcipher.h> |
49 | #include <crypto/hash.h> | ||
50 | #include <crypto/internal/hash.h> | ||
49 | #include <crypto/scatterwalk.h> | 51 | #include <crypto/scatterwalk.h> |
50 | 52 | ||
51 | #include "talitos.h" | 53 | #include "talitos.h" |
@@ -1482,6 +1484,7 @@ struct talitos_alg_template { | |||
1482 | u32 type; | 1484 | u32 type; |
1483 | union { | 1485 | union { |
1484 | struct crypto_alg crypto; | 1486 | struct crypto_alg crypto; |
1487 | struct ahash_alg hash; | ||
1485 | } alg; | 1488 | } alg; |
1486 | __be32 desc_hdr_template; | 1489 | __be32 desc_hdr_template; |
1487 | }; | 1490 | }; |
@@ -1698,8 +1701,7 @@ static struct talitos_alg_template driver_algs[] = { | |||
1698 | struct talitos_crypto_alg { | 1701 | struct talitos_crypto_alg { |
1699 | struct list_head entry; | 1702 | struct list_head entry; |
1700 | struct device *dev; | 1703 | struct device *dev; |
1701 | __be32 desc_hdr_template; | 1704 | struct talitos_alg_template algt; |
1702 | struct crypto_alg crypto_alg; | ||
1703 | }; | 1705 | }; |
1704 | 1706 | ||
1705 | static int talitos_cra_init(struct crypto_tfm *tfm) | 1707 | static int talitos_cra_init(struct crypto_tfm *tfm) |
@@ -1708,13 +1710,14 @@ static int talitos_cra_init(struct crypto_tfm *tfm) | |||
1708 | struct talitos_crypto_alg *talitos_alg; | 1710 | struct talitos_crypto_alg *talitos_alg; |
1709 | struct talitos_ctx *ctx = crypto_tfm_ctx(tfm); | 1711 | struct talitos_ctx *ctx = crypto_tfm_ctx(tfm); |
1710 | 1712 | ||
1711 | talitos_alg = container_of(alg, struct talitos_crypto_alg, crypto_alg); | 1713 | talitos_alg = container_of(alg, struct talitos_crypto_alg, |
1714 | algt.alg.crypto); | ||
1712 | 1715 | ||
1713 | /* update context with ptr to dev */ | 1716 | /* update context with ptr to dev */ |
1714 | ctx->dev = talitos_alg->dev; | 1717 | ctx->dev = talitos_alg->dev; |
1715 | 1718 | ||
1716 | /* copy descriptor header template value */ | 1719 | /* copy descriptor header template value */ |
1717 | ctx->desc_hdr_template = talitos_alg->desc_hdr_template; | 1720 | ctx->desc_hdr_template = talitos_alg->algt.desc_hdr_template; |
1718 | 1721 | ||
1719 | /* random first IV */ | 1722 | /* random first IV */ |
1720 | get_random_bytes(ctx->iv, TALITOS_MAX_IV_LENGTH); | 1723 | get_random_bytes(ctx->iv, TALITOS_MAX_IV_LENGTH); |
@@ -1750,7 +1753,15 @@ static int talitos_remove(struct of_device *ofdev) | |||
1750 | int i; | 1753 | int i; |
1751 | 1754 | ||
1752 | list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) { | 1755 | list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) { |
1753 | crypto_unregister_alg(&t_alg->crypto_alg); | 1756 | switch (t_alg->algt.type) { |
1757 | case CRYPTO_ALG_TYPE_ABLKCIPHER: | ||
1758 | case CRYPTO_ALG_TYPE_AEAD: | ||
1759 | crypto_unregister_alg(&t_alg->algt.alg.crypto); | ||
1760 | break; | ||
1761 | case CRYPTO_ALG_TYPE_AHASH: | ||
1762 | crypto_unregister_ahash(&t_alg->algt.alg.hash); | ||
1763 | break; | ||
1764 | } | ||
1754 | list_del(&t_alg->entry); | 1765 | list_del(&t_alg->entry); |
1755 | kfree(t_alg); | 1766 | kfree(t_alg); |
1756 | } | 1767 | } |
@@ -1791,8 +1802,16 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, | |||
1791 | if (!t_alg) | 1802 | if (!t_alg) |
1792 | return ERR_PTR(-ENOMEM); | 1803 | return ERR_PTR(-ENOMEM); |
1793 | 1804 | ||
1794 | alg = &t_alg->crypto_alg; | 1805 | t_alg->algt = *template; |
1795 | *alg = template->alg.crypto; | 1806 | |
1807 | switch (t_alg->algt.type) { | ||
1808 | case CRYPTO_ALG_TYPE_ABLKCIPHER: | ||
1809 | case CRYPTO_ALG_TYPE_AEAD: | ||
1810 | alg = &t_alg->algt.alg.crypto; | ||
1811 | break; | ||
1812 | case CRYPTO_ALG_TYPE_AHASH: | ||
1813 | alg = &t_alg->algt.alg.hash.halg.base; | ||
1814 | } | ||
1796 | 1815 | ||
1797 | alg->cra_module = THIS_MODULE; | 1816 | alg->cra_module = THIS_MODULE; |
1798 | alg->cra_init = talitos_cra_init; | 1817 | alg->cra_init = talitos_cra_init; |
@@ -1800,7 +1819,6 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, | |||
1800 | alg->cra_alignmask = 0; | 1819 | alg->cra_alignmask = 0; |
1801 | alg->cra_ctxsize = sizeof(struct talitos_ctx); | 1820 | alg->cra_ctxsize = sizeof(struct talitos_ctx); |
1802 | 1821 | ||
1803 | t_alg->desc_hdr_template = template->desc_hdr_template; | ||
1804 | t_alg->dev = dev; | 1822 | t_alg->dev = dev; |
1805 | 1823 | ||
1806 | return t_alg; | 1824 | return t_alg; |
@@ -1934,6 +1952,7 @@ static int talitos_probe(struct of_device *ofdev, | |||
1934 | for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { | 1952 | for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { |
1935 | if (hw_supports(dev, driver_algs[i].desc_hdr_template)) { | 1953 | if (hw_supports(dev, driver_algs[i].desc_hdr_template)) { |
1936 | struct talitos_crypto_alg *t_alg; | 1954 | struct talitos_crypto_alg *t_alg; |
1955 | char *name = NULL; | ||
1937 | 1956 | ||
1938 | t_alg = talitos_alg_alloc(dev, &driver_algs[i]); | 1957 | t_alg = talitos_alg_alloc(dev, &driver_algs[i]); |
1939 | if (IS_ERR(t_alg)) { | 1958 | if (IS_ERR(t_alg)) { |
@@ -1941,15 +1960,27 @@ static int talitos_probe(struct of_device *ofdev, | |||
1941 | goto err_out; | 1960 | goto err_out; |
1942 | } | 1961 | } |
1943 | 1962 | ||
1944 | err = crypto_register_alg(&t_alg->crypto_alg); | 1963 | switch (t_alg->algt.type) { |
1964 | case CRYPTO_ALG_TYPE_ABLKCIPHER: | ||
1965 | case CRYPTO_ALG_TYPE_AEAD: | ||
1966 | err = crypto_register_alg( | ||
1967 | &t_alg->algt.alg.crypto); | ||
1968 | name = t_alg->algt.alg.crypto.cra_driver_name; | ||
1969 | break; | ||
1970 | case CRYPTO_ALG_TYPE_AHASH: | ||
1971 | err = crypto_register_ahash( | ||
1972 | &t_alg->algt.alg.hash); | ||
1973 | name = | ||
1974 | t_alg->algt.alg.hash.halg.base.cra_driver_name; | ||
1975 | break; | ||
1976 | } | ||
1945 | if (err) { | 1977 | if (err) { |
1946 | dev_err(dev, "%s alg registration failed\n", | 1978 | dev_err(dev, "%s alg registration failed\n", |
1947 | t_alg->crypto_alg.cra_driver_name); | 1979 | name); |
1948 | kfree(t_alg); | 1980 | kfree(t_alg); |
1949 | } else { | 1981 | } else { |
1950 | list_add_tail(&t_alg->entry, &priv->alg_list); | 1982 | list_add_tail(&t_alg->entry, &priv->alg_list); |
1951 | dev_info(dev, "%s\n", | 1983 | dev_info(dev, "%s\n", name); |
1952 | t_alg->crypto_alg.cra_driver_name); | ||
1953 | } | 1984 | } |
1954 | } | 1985 | } |
1955 | } | 1986 | } |