aboutsummaryrefslogtreecommitdiff
path: root/src/include/gnunet_crypto_lib.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/gnunet_crypto_lib.h')
-rw-r--r--src/include/gnunet_crypto_lib.h132
1 files changed, 56 insertions, 76 deletions
diff --git a/src/include/gnunet_crypto_lib.h b/src/include/gnunet_crypto_lib.h
index d01457b4a..2a552e212 100644
--- a/src/include/gnunet_crypto_lib.h
+++ b/src/include/gnunet_crypto_lib.h
@@ -1443,9 +1443,16 @@ struct GNUNET_CRYPTO_EccPoint
1443 * Q consists of an x- and a y-value, each mod p (256 bits), given 1443 * Q consists of an x- and a y-value, each mod p (256 bits), given
1444 * here in affine coordinates and Ed25519 standard compact format. 1444 * here in affine coordinates and Ed25519 standard compact format.
1445 */ 1445 */
1446 unsigned char q_y[256 / 8]; 1446 unsigned char v[256 / 8];
1447}; 1447};
1448 1448
1449/**
1450 * A ECC scalar for use in point multiplications
1451 */
1452struct GNUNET_CRYPTO_EccScalar
1453{
1454 unsigned char v[256 / 8];
1455};
1449 1456
1450/** 1457/**
1451 * Do pre-calculation for ECC discrete logarithm for small factors. 1458 * Do pre-calculation for ECC discrete logarithm for small factors.
@@ -1455,7 +1462,8 @@ struct GNUNET_CRYPTO_EccPoint
1455 * @return NULL on error 1462 * @return NULL on error
1456 */ 1463 */
1457struct GNUNET_CRYPTO_EccDlogContext * 1464struct GNUNET_CRYPTO_EccDlogContext *
1458GNUNET_CRYPTO_ecc_dlog_prepare (unsigned int max, unsigned int mem); 1465GNUNET_CRYPTO_ecc_dlog_prepare (unsigned int max,
1466 unsigned int mem);
1459 1467
1460 1468
1461/** 1469/**
@@ -1468,7 +1476,7 @@ GNUNET_CRYPTO_ecc_dlog_prepare (unsigned int max, unsigned int mem);
1468 */ 1476 */
1469int 1477int
1470GNUNET_CRYPTO_ecc_dlog (struct GNUNET_CRYPTO_EccDlogContext *edc, 1478GNUNET_CRYPTO_ecc_dlog (struct GNUNET_CRYPTO_EccDlogContext *edc,
1471 gcry_mpi_point_t input); 1479 const struct GNUNET_CRYPTO_EccPoint *input);
1472 1480
1473 1481
1474/** 1482/**
@@ -1479,138 +1487,107 @@ GNUNET_CRYPTO_ecc_dlog (struct GNUNET_CRYPTO_EccDlogContext *edc,
1479 * convert a point back to an integer (as long as the 1487 * convert a point back to an integer (as long as the
1480 * integer is smaller than the MAX of the @a edc context). 1488 * integer is smaller than the MAX of the @a edc context).
1481 * 1489 *
1482 * @param edc calculation context for ECC operations
1483 * @param val value to encode into a point 1490 * @param val value to encode into a point
1484 * @return representation of the value as an ECC point, 1491 * @param r where to write the point (must be allocated)
1485 * must be freed using #GNUNET_CRYPTO_ecc_free()
1486 */ 1492 */
1487gcry_mpi_point_t 1493void
1488GNUNET_CRYPTO_ecc_dexp (struct GNUNET_CRYPTO_EccDlogContext *edc, int val); 1494GNUNET_CRYPTO_ecc_dexp (int val,
1495 struct GNUNET_CRYPTO_EccPoint*r);
1489 1496
1490 1497
1491/** 1498/**
1492 * Multiply the generator g of the elliptic curve by @a val 1499 * Multiply the generator g of the elliptic curve by @a val
1493 * to obtain the point on the curve representing @a val. 1500 * to obtain the point on the curve representing @a val.
1494 * 1501 *
1495 * @param edc calculation context for ECC operations
1496 * @param val (positive) value to encode into a point 1502 * @param val (positive) value to encode into a point
1497 * @return representation of the value as an ECC point, 1503 * @param r where to write the point (must be allocated)
1498 * must be freed using #GNUNET_CRYPTO_ecc_free() 1504 * @return #GNUNET_OK on success.
1499 */ 1505 */
1500gcry_mpi_point_t 1506enum GNUNET_GenericReturnValue
1501GNUNET_CRYPTO_ecc_dexp_mpi (struct GNUNET_CRYPTO_EccDlogContext *edc, 1507GNUNET_CRYPTO_ecc_dexp_mpi (const struct GNUNET_CRYPTO_EccScalar *val,
1502 gcry_mpi_t val); 1508 struct GNUNET_CRYPTO_EccPoint *r);
1503 1509
1504 1510
1505/** 1511/**
1506 * Multiply the point @a p on the elliptic curve by @a val. 1512 * Multiply the point @a p on the elliptic curve by @a val.
1507 * 1513 *
1508 * @param edc calculation context for ECC operations
1509 * @param p point to multiply 1514 * @param p point to multiply
1510 * @param val (positive) value to encode into a point 1515 * @param val (positive) value to encode into a point
1511 * @return representation of the value as an ECC point, 1516 * @param r where to write the point (must be allocated)
1512 * must be freed using #GNUNET_CRYPTO_ecc_free() 1517 * @return #GNUNET_OK on success.
1513 */
1514gcry_mpi_point_t
1515GNUNET_CRYPTO_ecc_pmul_mpi (struct GNUNET_CRYPTO_EccDlogContext *edc,
1516 gcry_mpi_point_t p,
1517 gcry_mpi_t val);
1518
1519
1520/**
1521 * Convert point value to binary representation.
1522 *
1523 * @param edc calculation context for ECC operations
1524 * @param point computational point representation
1525 * @param[out] bin binary point representation
1526 */
1527void
1528GNUNET_CRYPTO_ecc_point_to_bin (struct GNUNET_CRYPTO_EccDlogContext *edc,
1529 gcry_mpi_point_t point,
1530 struct GNUNET_CRYPTO_EccPoint *bin);
1531
1532
1533/**
1534 * Convert binary representation of a point to computational representation.
1535 *
1536 * @param edc calculation context for ECC operations
1537 * @param bin binary point representation
1538 * @return computational representation
1539 */ 1518 */
1540gcry_mpi_point_t 1519enum GNUNET_GenericReturnValue
1541GNUNET_CRYPTO_ecc_bin_to_point (struct GNUNET_CRYPTO_EccDlogContext *edc, 1520GNUNET_CRYPTO_ecc_pmul_mpi (const struct GNUNET_CRYPTO_EccPoint *p,
1542 const struct GNUNET_CRYPTO_EccPoint *bin); 1521 const struct GNUNET_CRYPTO_EccScalar *val,
1522 struct GNUNET_CRYPTO_EccPoint *r);
1543 1523
1544 1524
1545/** 1525/**
1546 * Add two points on the elliptic curve. 1526 * Add two points on the elliptic curve.
1547 * 1527 *
1548 * @param edc calculation context for ECC operations
1549 * @param a some value 1528 * @param a some value
1550 * @param b some value 1529 * @param b some value
1551 * @return @a a + @a b, must be freed using #GNUNET_CRYPTO_ecc_free() 1530 * @param r where to write the point (must be allocated)
1531 * @return #GNUNET_OK on success.
1552 */ 1532 */
1553gcry_mpi_point_t 1533enum GNUNET_GenericReturnValue
1554GNUNET_CRYPTO_ecc_add (struct GNUNET_CRYPTO_EccDlogContext *edc, 1534GNUNET_CRYPTO_ecc_add (const struct GNUNET_CRYPTO_EccPoint *a,
1555 gcry_mpi_point_t a, 1535 const struct GNUNET_CRYPTO_EccPoint *b,
1556 gcry_mpi_point_t b); 1536 struct GNUNET_CRYPTO_EccPoint *r);
1557 1537
1558 1538
1559/** 1539/**
1560 * Obtain a random point on the curve and its 1540 * Obtain a random point on the curve and its
1561 * additive inverse. Both returned values 1541 * additive inverse.
1562 * must be freed using #GNUNET_CRYPTO_ecc_free().
1563 * 1542 *
1564 * @param edc calculation context for ECC operations
1565 * @param[out] r set to a random point on the curve 1543 * @param[out] r set to a random point on the curve
1566 * @param[out] r_inv set to the additive inverse of @a r 1544 * @param[out] r_inv set to the additive inverse of @a r
1545 * @return #GNUNET_OK on success.
1567 */ 1546 */
1568void 1547enum GNUNET_GenericReturnValue
1569GNUNET_CRYPTO_ecc_rnd (struct GNUNET_CRYPTO_EccDlogContext *edc, 1548GNUNET_CRYPTO_ecc_rnd (struct GNUNET_CRYPTO_EccPoint *r,
1570 gcry_mpi_point_t *r, 1549 struct GNUNET_CRYPTO_EccPoint *r_inv);
1571 gcry_mpi_point_t *r_inv);
1572 1550
1573 1551
1574/** 1552/**
1575 * Obtain a random scalar for point multiplication on the curve and 1553 * Obtain a random scalar for point multiplication on the curve and
1576 * its multiplicative inverse. 1554 * its additive inverse.
1577 * 1555 *
1578 * @param edc calculation context for ECC operations
1579 * @param[out] r set to a random scalar on the curve 1556 * @param[out] r set to a random scalar on the curve
1580 * @param[out] r_inv set to the multiplicative inverse of @a r 1557 * @param[out] r_neg set to the negation of @a
1581 */ 1558 */
1582void 1559void
1583GNUNET_CRYPTO_ecc_rnd_mpi (struct GNUNET_CRYPTO_EccDlogContext *edc, 1560GNUNET_CRYPTO_ecc_rnd_mpi (struct GNUNET_CRYPTO_EccScalar *r,
1584 gcry_mpi_t *r, 1561 struct GNUNET_CRYPTO_EccScalar *r_neg);
1585 gcry_mpi_t *r_inv);
1586 1562
1587 1563
1588/** 1564/**
1589 * Generate a random value mod n. 1565 * Generate a random value mod n.
1590 * 1566 *
1591 * @param edc ECC context 1567 * @param[out] r random value mod n.
1592 * @return random value mod n.
1593 */ 1568 */
1594gcry_mpi_t 1569void
1595GNUNET_CRYPTO_ecc_random_mod_n (struct GNUNET_CRYPTO_EccDlogContext *edc); 1570GNUNET_CRYPTO_ecc_random_mod_n (struct GNUNET_CRYPTO_EccScalar*r);
1596 1571
1597 1572
1598/** 1573/**
1599 * Free a point value returned by the API. 1574 * Release precalculated values.
1600 * 1575 *
1601 * @param p point to free 1576 * @param dlc dlog context
1602 */ 1577 */
1603void 1578void
1604GNUNET_CRYPTO_ecc_free (gcry_mpi_point_t p); 1579GNUNET_CRYPTO_ecc_dlog_release (struct GNUNET_CRYPTO_EccDlogContext *dlc);
1605 1580
1606 1581
1607/** 1582/**
1608 * Release precalculated values. 1583 * Create a scalar from int value.
1609 * 1584 *
1610 * @param dlc dlog context 1585 * @param val the int value
1586 * @param[out] r where to write the salar
1611 */ 1587 */
1612void 1588void
1613GNUNET_CRYPTO_ecc_dlog_release (struct GNUNET_CRYPTO_EccDlogContext *dlc); 1589GNUNET_CRYPTO_ecc_scalar_from_int (int64_t val,
1590 struct GNUNET_CRYPTO_EccScalar *r);
1614 1591
1615 1592
1616/** 1593/**
@@ -1643,6 +1620,7 @@ GNUNET_CRYPTO_eddsa_ecdh (const struct GNUNET_CRYPTO_EddsaPrivateKey *priv,
1643 const struct GNUNET_CRYPTO_EcdhePublicKey *pub, 1620 const struct GNUNET_CRYPTO_EcdhePublicKey *pub,
1644 struct GNUNET_HashCode *key_material); 1621 struct GNUNET_HashCode *key_material);
1645 1622
1623
1646/** 1624/**
1647 * @ingroup crypto 1625 * @ingroup crypto
1648 * Derive key material from a ECDH public key and a private ECDSA key. 1626 * Derive key material from a ECDH public key and a private ECDSA key.
@@ -1937,7 +1915,9 @@ GNUNET_CRYPTO_ecdsa_public_key_derive (
1937 * @param val value to write to @a buf 1915 * @param val value to write to @a buf
1938 */ 1916 */
1939void 1917void
1940GNUNET_CRYPTO_mpi_print_unsigned (void *buf, size_t size, gcry_mpi_t val); 1918GNUNET_CRYPTO_mpi_print_unsigned (void *buf,
1919 size_t size,
1920 gcry_mpi_t val);
1941 1921
1942 1922
1943/** 1923/**