00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "system.h"
00029 #include "rsa.h"
00030 #include "mp32.h"
00031 #include "debug.h"
00032
00033 int rsapri(const rsakp* kp, const mp32number* m, mp32number* c)
00034 {
00035 register uint32 size = kp->n.size;
00036 register uint32* temp = (uint32*) malloc((4*size+2) * sizeof(*temp));
00037
00038 if (temp)
00039 {
00040 mp32nsize(c, size);
00041 mp32bpowmod_w(&kp->n, m->size, m->data, kp->d.size, kp->d.data, c->data, temp);
00042
00043 free(temp);
00044
00045 return 0;
00046 }
00047 return -1;
00048 }
00049
00050
00051 int rsapricrt(const rsakp* kp, const mp32number* m, mp32number* c)
00052 {
00053 register uint32 nsize = kp->n.size;
00054 register uint32 psize = kp->p.size;
00055 register uint32 qsize = kp->q.size;
00056
00057 register uint32* ptemp;
00058 register uint32* qtemp;
00059
00060
00061 if (m->size > psize || m->size > qsize)
00062 return -1;
00063
00064 ptemp = (uint32*) malloc((6*psize+2)*sizeof(*ptemp));
00065 if (ptemp == NULL)
00066 return -1;
00067
00068 qtemp = (uint32*) malloc((6*qsize+2)*sizeof(*qtemp));
00069 if (qtemp == NULL)
00070 {
00071 free(ptemp);
00072 return -1;
00073 }
00074
00075
00076 mp32setx(psize, ptemp+psize, m->size, m->data);
00077
00078
00079
00080 mp32bpowmod_w(&kp->p, psize, ptemp+psize, kp->d1.size, kp->d1.data, ptemp, ptemp+2*psize);
00081
00082
00083 mp32setx(qsize, qtemp+psize, m->size, m->data);
00084
00085
00086 mp32bpowmod_w(&kp->q, qsize, qtemp+psize, kp->d2.size, kp->d2.data, qtemp, qtemp+2*qsize);
00087
00088
00089
00090 mp32bsubmod_w(&kp->p, psize, ptemp, qsize, qtemp, ptemp, ptemp+2*psize);
00091
00092
00093 mp32bmulmod_w(&kp->p, psize, ptemp, psize, kp->c.data, ptemp, ptemp+2*psize);
00094
00095
00096 mp32nsize(c, nsize);
00097
00098
00099 mp32mul(c->data, psize, ptemp, qsize, kp->q.modl);
00100 (void) mp32addx(nsize, c->data, qsize, qtemp);
00101
00102 free(ptemp);
00103 free(qtemp);
00104
00105 return 0;
00106 }
00107
00111 int rsavrfy(const rsapk* pk, const mp32number* m, const mp32number* c)
00112 {
00113 int rc;
00114 register uint32 size = pk->n.size;
00115 register uint32* temp = (uint32*) malloc((5*size+2) * sizeof(*temp));
00116
00117 if (temp)
00118 {
00119 mp32bpowmod_w(&pk->n, c->size, c->data, pk->e.size, pk->e.data, temp, temp+size);
00120
00121 rc = mp32eqx(size, temp, m->size, m->data);
00122
00123 free(temp);
00124
00125 return rc;
00126 }
00127 return 0;
00128 }