Libmcrypto can't be used without these fixes.
Signed-off-by: Jimmy Zhang <[email protected]>
---
src/libm/bigdigits.h | 2 +-
src/libm/common.c | 4 +-
src/libm/mpModulo.c | 5 +-
src/libm/mpMultiply.c | 7 ++-
src/libm/pkcs1-rsa.c | 145 +++++++++++++++++---------------------------------
src/libm/pkcs1-rsa.h | 3 +-
6 files changed, 64 insertions(+), 102 deletions(-)
diff --git a/src/libm/bigdigits.h b/src/libm/bigdigits.h
index 7c9f563f3d54..0918a27005e6 100644
--- a/src/libm/bigdigits.h
+++ b/src/libm/bigdigits.h
@@ -20,7 +20,7 @@ extern "C" {
#include "mcrypto.h"
/* Define type of DIGIT here */
-typedef unsigned long DIGIT_T;
+typedef unsigned int DIGIT_T;
typedef unsigned short HALF_DIGIT_T;
/* Sizes to suit your machine - todo: move to mcrypto.h */
diff --git a/src/libm/common.c b/src/libm/common.c
index a28497592882..ae6e1eed2322 100644
--- a/src/libm/common.c
+++ b/src/libm/common.c
@@ -46,11 +46,11 @@ void mcrypto_dump(char *desc, BYTE *p, UINT len)
#ifdef MCRYPTO_DEBUG
UINT i = 0;
- printf("[%s]\n", desc);
+ printf("[%s(%d)]\n", desc, len);
while (len--) {
if ((i % 20) == 0 && i)
printf("\n");
- fprintf(stderr, "%02x ", p[len]);
+ fprintf(stderr, "%02x ", p[i]);
i++;
}
fprintf(stderr, "\n");
diff --git a/src/libm/mpModulo.c b/src/libm/mpModulo.c
index c929dd5a2c02..cff60d173e8b 100644
--- a/src/libm/mpModulo.c
+++ b/src/libm/mpModulo.c
@@ -2,6 +2,9 @@
#include "bigdigits.h"
+/* TODO: add support for MCRYPTO_BARRET */
+#define MCRYPTO_TRIVIAL_DIVISION
+
int mpModulo(DIGIT_T r[], const DIGIT_T u[], UINT udigits, const DIGIT_T v[],
UINT vdigits)
{
#ifdef MCRYPTO_TRIVIAL_DIVISION
@@ -31,4 +34,4 @@ int mpModulo(DIGIT_T r[], const DIGIT_T u[], UINT udigits,
const DIGIT_T v[], UI
#endif
return 0;
}
-
+#undef MCRYPTO_TRIVIAL_DIVISION
diff --git a/src/libm/mpMultiply.c b/src/libm/mpMultiply.c
index faf4a75ccd7f..d52d8b40be96 100644
--- a/src/libm/mpMultiply.c
+++ b/src/libm/mpMultiply.c
@@ -2,9 +2,12 @@
#include <assert.h>
#include "bigdigits.h"
+/* TODO: add support for MCRYPTO_FFT_MUL */
+#define MCRYPTO_SCHOOL_BOOK
+
int mpMultiply(DIGIT_T w[], const DIGIT_T u[], const DIGIT_T v[], UINT ndigits)
{
-#ifdef MCRYPTO_SCHOOL_BOOK
+#ifdef MCRYPTO_SCHOOL_BOOK
/* Computes product w = u * v
where u, v are multiprecision integers of ndigits each
and w is a multiprecision integer of 2*ndigits
@@ -52,4 +55,4 @@ int mpMultiply(DIGIT_T w[], const DIGIT_T u[], const DIGIT_T
v[], UINT ndigits)
#endif
return 0;
}
-
+#undef MCRYPTO_SCHOOL_BOOK
diff --git a/src/libm/pkcs1-rsa.c b/src/libm/pkcs1-rsa.c
index 1a3132e1fa75..da16fae377ff 100644
--- a/src/libm/pkcs1-rsa.c
+++ b/src/libm/pkcs1-rsa.c
@@ -17,6 +17,9 @@
#include "hash.h"
#include "bigdigits.h"
+/* cbootimage header */
+#include "crypto.h"
+
/* Internal Functions - Forward Declaration */
static void memxor(BYTE *c, BYTE *a, BYTE *b, UINT len);
/* Perform c = a XOR b */
@@ -59,6 +62,15 @@ static int GenRsaPrime(DIGIT_T p[], UINT ndigits)
return 0;
}
+static
+UINT SwapBytesInNvU32(const UINT Value)
+{
+ UINT Tmp = (Value << 16) | (Value >> 16); /* Swap halves */
+ /* Swap bytes pairwise */
+ Tmp = ((Tmp >> 8) & 0x00ff00ff) | ((Tmp & 0x00ff00ff) << 8);
+ return (Tmp);
+}
+
static int MGF1(UINT hid, BYTE *seed, UINT seedlen, BYTE *mask, UINT masklen)
{
/* Mask Generation Function Using Hash Function */
@@ -91,8 +103,8 @@ static int MGF1(UINT hid, BYTE *seed, UINT seedlen, BYTE
*mask, UINT masklen)
for(i=0;i<n;i++) {
/* Constructing Hash Input */
- memcpy(data+seedlen, &i, 4);
-
+ *(UINT *)(data+seedlen) = SwapBytesInNvU32(i);
+
/* Computing Hash */
if((ret=Hash(hid, data, seedlen+4, hash))!=0) {
free(data);
@@ -113,7 +125,6 @@ static int MGF1(UINT hid, BYTE *seed, UINT seedlen, BYTE
*mask, UINT masklen)
}
/* Main Functions */
-
int PKCS1_RSA_GenKey(PKCS1_RSA_PUBLIC_KEY *spk, PKCS1_RSA_PRIVATE_KEY *ssk,
UINT mod_len)
{
DIGIT_T *p, *q, *n, *e, *d;
@@ -511,14 +522,19 @@ int PKCS1_RSASSA_PSS_SIGN(PKCS1_RSA_PRIVATE_KEY *ssk,
UINT hid, BYTE *m, UINT ml
em = (BYTE *)malloc(NBYTE(ssk->len));
/* PSS Encoding */
- if((ret=PKCS1_EMSA_PSS_ENCODE(hid, m, mlen, slen, em,
NBYTE(ssk->len)))!=ERR_OK) {
+ if((ret = PKCS1_EMSA_PSS_ENCODE(hid, m, mlen, slen, em,
NBYTE(ssk->len)))
+ != ERR_OK) {
free(em);
+ printf("Error: encoding failed\n");
return ret;
}
+ SwapEndianness(em, NBYTE(ssk->len), em);
+ mcrypto_dump("PSS_SIGN: Encoded Message", em, NBYTE(ssk->len));
+
/* Signing */
ret = PKCS1_RSASP1(ssk, (DIGIT_T*)em, (DIGIT_T*)s);
- mcrypto_dump("Signature",(BYTE *)s, NBYTE(ssk->len));
+ mcrypto_dump("PSS_SIGN: Signature",(BYTE *)s, NBYTE(ssk->len));
free(em);
@@ -553,6 +569,14 @@ int PKCS1_RSASSA_PSS_VERIFY(PKCS1_RSA_PUBLIC_KEY *spk,
UINT hid, BYTE *m, UINT m
return ERR_INVALID_SIGNATURE;
}
+/*
+ * hid: hash id
+ * m: message buffer
+ * mlen: message length
+ * slen: signature length
+ * em: encoded message (from hash)
+ * emlen: encoded message length -> 256
+ */
int PKCS1_EMSA_PSS_ENCODE(UINT hid, BYTE *m, UINT mlen, UINT slen, BYTE *em,
UINT emlen)
{
/* PSS Encoding */
@@ -568,31 +592,34 @@ int PKCS1_EMSA_PSS_ENCODE(UINT hid, BYTE *m, UINT mlen,
UINT slen, BYTE *em, UIN
return ERR_UNKNOWN_HASH;
/* Computing Hash of m */
- mcrypto_dump("PSS Encoding: Message", m, mlen);
H = (BYTE *)malloc(hlen);
if((ret = Hash(hid, m, mlen, H))!=0) {
free(H);
-
return ret;
}
mcrypto_dump("PSS Encoding: Hashed Message", H, hlen);
+ /* BUG FIX */
+ /* slen is 256 that causes the condition below failed */
+ /* FIX: set slen to hash length */
+ slen = hlen;
+
/* Length checking */
- if(emlen<(hlen+slen+2)) {
+ if(emlen<(hlen+slen+2)) { /* emlen: 256, hlen: 32, slen: 32 */
free(H);
return ERR_PSS_ENCODING;
}
-
+
/* Generating salt and constructing M */
salt = (BYTE *)malloc(slen);
- GenSeed(salt, slen);
- mcrypto_dump("PSS Encoding: Salt", salt, slen);
+ /* GenSeed(salt, slen); */
+ memset(salt, 0xFF, slen);
- M = (BYTE *)malloc(8+hlen+slen);
- memset(M, 0x00, 8+hlen+slen);
- memcpy(M+8, H, hlen);
- memcpy(M+8+hlen, salt, slen);
+ M = (BYTE *)malloc(8 + hlen + slen);
+ memset(M, 0x00, 8 + hlen + slen);
+ memcpy(M + 8, H, hlen);
+ memcpy(M + 8 + hlen, salt, slen);
mcrypto_dump("PSS Encoding: Message to be encoded", M, 8+hlen+slen);
/* Constructing DB */
@@ -629,11 +656,18 @@ int PKCS1_EMSA_PSS_ENCODE(UINT hid, BYTE *m, UINT mlen,
UINT slen, BYTE *em, UIN
mcrypto_dump("PSS Encoding: maskedDB", maskedDB, emlen-hlen-1);
/* Constructing encoded message, em */
+ maskedDB[0] &= ~(0xFF << (8 - 1));
memcpy(em, maskedDB, emlen-hlen-1);
memcpy(em+emlen-hlen-1, H, hlen);
em[emlen-1] = 0xbc;
- mcrypto_dump("PSS Encoding: Encoded Message", em, emlen);
+ /* added: free memory H, M, DB, ... */
+ free(H);
+ free(M);
+ free(salt);
+ free(maskedDB);
+ free(DB);
+
return ERR_OK;
}
@@ -752,82 +786,3 @@ void errmsg(int err)
default: printf("Unkown Error!!!\n"); break;
}
}
-
-int LoadPublicKey(char *fname, PKCS1_RSA_PUBLIC_KEY *spk)
-{
- /* Load keys from files */
- char s[5][PKCS1_MAX_LINE_LEN];
- FILE *f;
- UINT i;
- UINT len;
-
- f = fopen(fname, "r");
- if(f == NULL)
- return -1;
-
- memset(s, 0x00, PKCS1_MAX_LINE_LEN*5);
- /* reading data */
- for(i=0;i<5;i++)
- {
- if(feof(f))
- {
- fclose(f);
- return -1;
- }
- fgets(s[i], PKCS1_MAX_LINE_LEN, f);
-
- /* ignore newline charater */
- s[i][strlen(s[i])-1] = '\0';
- }
- fclose(f);
-
- /* Decoding data */
- spk->len = (UINT)atoi(s[1]);
-
- if((spk->modulus = mpBase64Decode(&len, s[2]))==NULL)
- return -1;
- if((spk->exponent = mpBase64Decode(&len, s[3]))==NULL)
- return -1;
- return 0;
-}
-
-int LoadPrivateKey(char *fname, PKCS1_RSA_PRIVATE_KEY *ssk)
-{
- /* Load keys from files */
- char s[6][PKCS1_MAX_LINE_LEN];
- FILE *f;
- UINT i;
- UINT len;
-
- f = fopen(fname, "r");
- if(f == NULL)
- return -1;
-
- memset(s, 0x00, PKCS1_MAX_LINE_LEN*6);
-
- /* reading data */
- for(i=0;i<5;i++)
- {
- if(feof(f))
- {
- fclose(f);
- return -1;
- }
- fgets(s[i], PKCS1_MAX_LINE_LEN, f);
- s[i][strlen(s[i])-1] = '\0';
- }
- fclose(f);
-
- ssk->len = (UINT)atoi(s[1]);
-
- if((ssk->modulus = mpBase64Decode(&len, s[2]))==NULL)
- return -1;
- if((ssk->PublicExponent = mpBase64Decode(&len, s[3]))==NULL)
- return -1;
- if((ssk->exponent = mpBase64Decode(&len, s[4]))==NULL)
- return -1;
-
- return 0;
-}
-
-
diff --git a/src/libm/pkcs1-rsa.h b/src/libm/pkcs1-rsa.h
index 9e2b58acd9da..f4158d69f506 100644
--- a/src/libm/pkcs1-rsa.h
+++ b/src/libm/pkcs1-rsa.h
@@ -9,7 +9,8 @@
extern "C" {
#endif
-#define PKCS1_MAX_LINE_LEN 346 /* for reading parameter file */
+#define PKCS1_MAX_NUM_KEYS 8 /* number of key components */
+#define PKCS1_MAX_LINE_LEN 512 /* for reading parameter file */
#define PKCS1_VERSION_MAJOR 2
#define PKCS1_VERSION_MINOR 1
--
1.8.1.5
--
To unsubscribe from this list: send the line "unsubscribe linux-tegra" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html