@@ -688,10 +688,9 @@ static int ippcp_rsa_keygen_en(struct buffer *ebuf, uint32_t modulus, void **pri
688688 CKNULL_LOG ((sts == ippStsNoErr ), sts , "Error in ippcp_init_set_bn" )
689689
690690 sts = ippsRSA_GenerateKeys (E0 , N , E , D , pPrvKey , buffScratch .buf ,
691- 0 , pPrimeG , ippsPRNGen , pPRNG );
691+ 0 , pPrimeG , ippsPRNGenRDRAND , pPRNG );
692692 if (ippStsInsufficientEntropy == sts ) {
693693 logger (LOGGER_WARN , "ippStsInsufficientEntropy\n" );
694- e0_data += 2 ;
695694 continue ;
696695 }
697696 else {
@@ -1293,7 +1292,7 @@ static int ippcp_ecdsa_keygen_en(uint64_t curve, struct buffer *Qx_buf, struct b
12931292 Ipp32u isZeroRes ;
12941293 do {
12951294 // get regular private key
1296- sts = ippsGFpECPrivateKey (bnPrivate , pEC , ippsPRNGen , pRand );
1295+ sts = ippsGFpECPrivateKey (bnPrivate , pEC , ippsPRNGenRDRAND , pRand );
12971296 CKNULL_LOG ((sts == ippStsNoErr ), sts , "Error in ippsGFpECPrivateKey" )
12981297
12991298 ippsCmpZero_BN (bnPrivate , & isZeroRes );
@@ -1480,7 +1479,7 @@ static int ippcp_ecdsa_siggen(struct ecdsa_siggen_data *data, flags_t parsed_fla
14801479
14811480 Ipp32u isZeroRes , isEquRes ;
14821481 do { // get new ephemeral private key
1483- sts = ippsGFpECPrivateKey (bnEphPrivate , pEC , ippsPRNGen , pRand );
1482+ sts = ippsGFpECPrivateKey (bnEphPrivate , pEC , ippsPRNGenRDRAND , pRand );
14841483 CKNULL_LOG ((sts == ippStsNoErr ), sts , "Error in ippsGFpECPrivateKey" )
14851484 ippsCmpZero_BN (bnEphPrivate , & isZeroRes );
14861485 ippsCmp_BN (bnEphPrivate , bnRegPrivate , & isEquRes );
@@ -1741,3 +1740,199 @@ static void ippcp_ecdsa_backend(void)
17411740{
17421741 register_ecdsa_impl (& ippcp_ecdsa );
17431742}
1743+
1744+ /************************************************
1745+ * LMS interface functions
1746+ ************************************************/
1747+ // fixed value
1748+ #define IPPCP_LMS_PK_I_BYTESIZE (16 )
1749+
1750+ // stuff functions
1751+ static IppsLMSAlgo getIppsLMSAlgo (const struct buffer lmsMode , Ipp32u * hashByteSize ) {
1752+ const char * lmsTypeStr = (const char * )lmsMode .buf ;
1753+ if (strcmp (lmsTypeStr , "LMS_SHA256_M24_H5" ) == 0 ) {
1754+ * hashByteSize = 24 ;
1755+ return LMS_SHA256_M24_H5 ;
1756+ }
1757+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M24_H10" ) == 0 ) {
1758+ * hashByteSize = 24 ;
1759+ return LMS_SHA256_M24_H10 ;
1760+ }
1761+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M24_H15" ) == 0 ) {
1762+ * hashByteSize = 24 ;
1763+ return LMS_SHA256_M24_H15 ;
1764+ }
1765+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M24_H20" ) == 0 ) {
1766+ * hashByteSize = 24 ;
1767+ return LMS_SHA256_M24_H20 ;
1768+ }
1769+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M24_H25" ) == 0 ) {
1770+ * hashByteSize = 24 ;
1771+ return LMS_SHA256_M24_H25 ;
1772+ }
1773+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M32_H5" ) == 0 ) {
1774+ * hashByteSize = 32 ;
1775+ return LMS_SHA256_M32_H5 ;
1776+ }
1777+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M32_H10" ) == 0 ) {
1778+ * hashByteSize = 32 ;
1779+ return LMS_SHA256_M32_H10 ;
1780+ }
1781+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M32_H15" ) == 0 ) {
1782+ * hashByteSize = 32 ;
1783+ return LMS_SHA256_M32_H15 ;
1784+ }
1785+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M32_H20" ) == 0 ) {
1786+ * hashByteSize = 32 ;
1787+ return LMS_SHA256_M32_H20 ;
1788+ }
1789+ else if (strcmp (lmsTypeStr , "LMS_SHA256_M32_H25" ) == 0 ) {
1790+ * hashByteSize = 32 ;
1791+ return LMS_SHA256_M32_H25 ;
1792+ }
1793+ else {
1794+ * hashByteSize = 0 ;
1795+ return 0 ;
1796+ }
1797+ }
1798+
1799+ static IppsLMOTSAlgo getIppsLMOTSAlgo (const struct buffer lmOtsMode , Ipp32u * pCount ) {
1800+ const char * lmotsTypeStr = (const char * )lmOtsMode .buf ;
1801+ if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N24_W1" ) == 0 ) {
1802+ * pCount = 200 ;
1803+ return LMOTS_SHA256_N24_W1 ;
1804+ }
1805+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N24_W2" ) == 0 ) {
1806+ * pCount = 101 ;
1807+ return LMOTS_SHA256_N24_W2 ;
1808+ }
1809+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N24_W4" ) == 0 ) {
1810+ * pCount = 51 ;
1811+ return LMOTS_SHA256_N24_W4 ;
1812+ }
1813+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N24_W8" ) == 0 ) {
1814+ * pCount = 26 ;
1815+ return LMOTS_SHA256_N24_W8 ;
1816+ }
1817+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N32_W1" ) == 0 ) {
1818+ * pCount = 265 ;
1819+ return LMOTS_SHA256_N32_W1 ;
1820+ }
1821+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N32_W2" ) == 0 ) {
1822+ * pCount = 133 ;
1823+ return LMOTS_SHA256_N32_W2 ;
1824+ }
1825+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N32_W4" ) == 0 ) {
1826+ * pCount = 67 ;
1827+ return LMOTS_SHA256_N32_W4 ;
1828+ }
1829+ else if (strcmp (lmotsTypeStr , "LMOTS_SHA256_N32_W8" ) == 0 ) {
1830+ * pCount = 34 ;
1831+ return LMOTS_SHA256_N32_W8 ;
1832+ }
1833+ else {
1834+ * pCount = 0 ;
1835+ return 0 ;
1836+ }
1837+ }
1838+
1839+ static int ippcp_lms_sigver (struct lms_sigver_data * data , flags_t parsed_flags )
1840+ {
1841+ (void )parsed_flags ;
1842+ IppStatus status = ippStsNoErr ;
1843+ int ret = 0 ;
1844+
1845+ Ipp32u hashByteSize = 0 ;
1846+ Ipp32u pCount = 0 ;
1847+ const Ipp32s msgLen = data -> msg .len ;
1848+
1849+ Ipp8u * pScratchBuffer = NULL ;
1850+ IppsLMSPublicKeyState * pPubKey = NULL ;
1851+ IppsLMSSignatureState * pSignature = NULL ;
1852+
1853+ IppsLMSAlgo lmsType = getIppsLMSAlgo (data -> lmsMode , & hashByteSize );
1854+ IppsLMOTSAlgo lmotsType = getIppsLMOTSAlgo (data -> lmOtsMode , & pCount );
1855+ const IppsLMSAlgoType lmsAlgType = { lmotsType , lmsType };
1856+
1857+ /* Allocate memory for the scratch buffer */
1858+ int buffSize ;
1859+ status = ippsLMSBufferGetSize (& buffSize , msgLen , lmsAlgType );
1860+ CKNULL_LOG ((status == ippStsNoErr ), status , "Error in ippsLMSBufferGetSize" )
1861+ pScratchBuffer = malloc (buffSize );
1862+
1863+ /* Parse public key vector */
1864+ IppsLMSAlgo lmsTypePk ;
1865+ dataReverse ((Ipp8u * )& lmsTypePk , (const char * )data -> pub .buf , sizeof (Ipp32u ));
1866+
1867+ IppsLMOTSAlgo lmotsTypePk ;
1868+ dataReverse ((Ipp8u * )& lmotsTypePk , (const char * )data -> pub .buf + sizeof (Ipp32u ), sizeof (Ipp32u ));
1869+ const IppsLMSAlgoType lmsAlgTypePk = { lmotsTypePk , lmsTypePk };
1870+
1871+ const Ipp8u * pI = (const Ipp8u * )data -> pub .buf + 2 * sizeof (Ipp32u );
1872+ const Ipp8u * pK = pI + IPPCP_LMS_PK_I_BYTESIZE ;
1873+
1874+ /* Allocate memory for the LMS public key state */
1875+ int ippcpPubKeySize ;
1876+ status = ippsLMSPublicKeyStateGetSize (& ippcpPubKeySize , lmsAlgType );
1877+ CKNULL_LOG ((status == ippStsNoErr ), status , "Error in ippsLMSPublicKeyStateGetSize" )
1878+ pPubKey = (IppsLMSPublicKeyState * )malloc (ippcpPubKeySize );
1879+
1880+ /* Set the LMS public key */
1881+ status = ippsLMSSetPublicKeyState (lmsAlgTypePk , pI , pK , pPubKey );
1882+ CKNULL_LOG ((status == ippStsNoErr ), status , "Error in ippsLMSSetPublicKeyState" )
1883+
1884+ /* Parse signature vector */
1885+ Ipp32u q = 0 ;
1886+ dataReverse ((Ipp8u * )& q , (const char * )data -> sig .buf , sizeof (Ipp32u ));
1887+
1888+ IppsLMOTSAlgo lmotsTypeSig ;
1889+ dataReverse ((Ipp8u * )& lmotsTypeSig , (const char * )data -> sig .buf + sizeof (Ipp32u ), sizeof (Ipp32u ));
1890+
1891+ const Ipp8u * pC = (const Ipp8u * )data -> sig .buf + 2 * sizeof (Ipp32u );
1892+ const Ipp8u * pY = pC + hashByteSize ;
1893+
1894+ IppsLMSAlgo lmsTypeSig ;
1895+ dataReverse ((Ipp8u * )& lmsTypeSig , (const char * )pY + hashByteSize * pCount , sizeof (Ipp32u ));
1896+
1897+ const IppsLMSAlgoType lmsAlgTypeSig = { lmotsTypeSig , lmsTypeSig };
1898+ const Ipp8u * pAuthPath = pY + sizeof (Ipp32u ) + hashByteSize * pCount ;
1899+
1900+ /* Allocate memory for the LMS signature state */
1901+ int sigBuffSize ;
1902+ status = ippsLMSSignatureStateGetSize (& sigBuffSize , lmsAlgTypeSig );
1903+ if (status != ippStsNoErr ) { // Do not throw error, passed parameter in dataset may be intentionally invalid
1904+ data -> sigver_success = 0 ;
1905+ goto out ;
1906+ }
1907+ pSignature = (IppsLMSSignatureState * )malloc (sigBuffSize );
1908+
1909+ /* Set the LMS signature */
1910+ status = ippsLMSSetSignatureState (lmsAlgTypeSig , q , pC , pY , pAuthPath , pSignature );
1911+ if (status != ippStsNoErr ) { // Do not throw error, passed parameter in dataset may be intentionally invalid
1912+ data -> sigver_success = 0 ;
1913+ goto out ;
1914+ }
1915+
1916+ int is_valid = 0 ;
1917+ /* Verify the LMS signature */
1918+ status = ippsLMSVerify (data -> msg .buf , msgLen , pSignature , & is_valid , pPubKey , pScratchBuffer );
1919+ data -> sigver_success = is_valid ;
1920+
1921+ out :
1922+ free (pScratchBuffer );
1923+ free ((Ipp8u * )pPubKey );
1924+ free ((Ipp8u * )pSignature );
1925+
1926+ return ret ;
1927+ }
1928+
1929+ static struct lms_backend ippcp_lms =
1930+ {
1931+ ippcp_lms_sigver /* lms_sigver */
1932+ };
1933+
1934+ ACVP_DEFINE_CONSTRUCTOR (ippcp_lms_backend )
1935+ static void ippcp_lms_backend (void )
1936+ {
1937+ register_lms_impl (& ippcp_lms );
1938+ }
0 commit comments