Skip to content

Commit

Permalink
ed25519_open(): check that S < l
Browse files Browse the repository at this point in the history
Not strictly required, but I don't see any downsides either.
  • Loading branch information
jedisct1 committed Oct 5, 2014
1 parent b91baa6 commit 4099618
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion src/libsodium/crypto_sign/ed25519/ref10/open.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,27 @@
#include "sc.h"
#include "utils.h"

static int
crypto_sign_check_S_lt_l(const unsigned char *S)
{
static const unsigned char l[32] =
{ 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,
0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };
unsigned char c = 0;
unsigned char n = 1;
unsigned int i = 32;

do {
i--;
c |= ((S[i] - l[i]) >> 8) & n;
n &= ((S[i] ^ l[i]) - 1) >> 8;
} while (i != 0);

return -(c == 0);
}

int
crypto_sign_verify_detached(const unsigned char *sig, const unsigned char *m,
unsigned long long mlen, const unsigned char *pk)
Expand All @@ -21,7 +42,7 @@ crypto_sign_verify_detached(const unsigned char *sig, const unsigned char *m,
ge_p3 A;
ge_p2 R;

if (sig[63] & 224) {
if (crypto_sign_check_S_lt_l(sig + 32) != 0) {
return -1;
}
if (ge_frombytes_negate_vartime(&A, pk) != 0) {
Expand Down

0 comments on commit 4099618

Please sign in to comment.