00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "system.h"
00031 #include "rsakp.h"
00032 #include "mp32prime.h"
00033 #include "mp32.h"
00034 #include "debug.h"
00035
00036
00037 int rsakpMake(rsakp* kp, randomGeneratorContext* rgc, int nsize)
00038 {
00039
00040
00041
00042
00043 register uint32 pqsize = ((uint32)(nsize+1)) >> 1;
00044 register uint32* temp = (uint32*) malloc((16*pqsize+6) * sizeof(*temp));
00045 register uint32 newn = 1;
00046
00047 if (temp)
00048 {
00049 mp32barrett r, psubone, qsubone, phi;
00050
00051 nsize = pqsize << 1;
00052
00053
00054 mp32nsetw(&kp->e, 65535);
00055
00056
00057
00058 mp32prnd_w(&kp->p, rgc, pqsize, mp32ptrials(pqsize << 5), &kp->e, temp);
00059 mp32prnd_w(&kp->q, rgc, pqsize, mp32ptrials(pqsize << 5), &kp->e, temp);
00060
00061
00062
00063 if (mp32le(pqsize, kp->p.modl, kp->q.modl))
00064 {
00065
00066 memcpy(&r, &kp->q, sizeof(mp32barrett));
00067 memcpy(&kp->q, &kp->p, sizeof(mp32barrett));
00068 memcpy(&kp->p, &r, sizeof(mp32barrett));
00069
00070 }
00071
00072 mp32bzero(&r);
00073 mp32bzero(&psubone);
00074 mp32bzero(&qsubone);
00075 mp32bzero(&phi);
00076
00077 while (1)
00078 {
00079 mp32mul(temp, pqsize, kp->p.modl, pqsize, kp->q.modl);
00080
00081 if (newn && mp32msbset(nsize, temp))
00082 break;
00083
00084
00085
00086
00087 mp32prnd_w(&r, rgc, pqsize, mp32ptrials(pqsize << 5), &kp->e, temp);
00088
00089
00090
00091 if (mp32le(pqsize, kp->p.modl, r.modl))
00092 {
00093 mp32bfree(&kp->q);
00094
00095 memcpy(&kp->q, &kp->p, sizeof(mp32barrett));
00096 memcpy(&kp->p, &r, sizeof(mp32barrett));
00097
00098 mp32bzero(&r);
00099 newn = 1;
00100 }
00101 else if (mp32le(pqsize, kp->q.modl, r.modl))
00102 {
00103 mp32bfree(&kp->q);
00104
00105 memcpy(&kp->q, &r, sizeof(mp32barrett));
00106
00107 mp32bzero(&r);
00108 newn = 1;
00109 }
00110 else
00111 {
00112 mp32bfree(&r);
00113 newn = 0;
00114 }
00115
00116 }
00117
00118 mp32bset(&kp->n, nsize, temp);
00119
00120
00121 mp32bsubone(&kp->p, temp);
00122 mp32bset(&psubone, pqsize, temp);
00123
00124
00125 mp32bsubone(&kp->q, temp);
00126 mp32bset(&qsubone, pqsize, temp);
00127
00128
00129
00130 mp32mul(temp, pqsize, psubone.modl, pqsize, qsubone.modl);
00131 mp32bset(&phi, nsize, temp);
00132
00133
00134 mp32nsize(&kp->d, nsize);
00135 (void) mp32binv_w(&phi, kp->e.size, kp->e.data, kp->d.data, temp);
00136
00137
00138 mp32nsize(&kp->d1, pqsize);
00139 mp32bmod_w(&psubone, kp->d.data, kp->d1.data, temp);
00140
00141
00142 mp32nsize(&kp->d2, pqsize);
00143 mp32bmod_w(&qsubone, kp->d.data, kp->d2.data, temp);
00144
00145
00146 mp32nsize(&kp->c, pqsize);
00147 (void) mp32binv_w(&kp->p, pqsize, kp->q.modl, kp->c.data, temp);
00148
00149 free(temp);
00150
00151
00152 return 0;
00153 }
00154 return -1;
00155 }
00156
00157
00158
00159 int rsakpInit(rsakp* kp)
00160 {
00161 memset(kp, 0, sizeof(*kp));
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173 return 0;
00174 }
00175
00176
00177 int rsakpFree(rsakp* kp)
00178 {
00179
00180 mp32bfree(&kp->n);
00181 mp32nfree(&kp->e);
00182 mp32nfree(&kp->d);
00183 mp32bfree(&kp->p);
00184 mp32bfree(&kp->q);
00185 mp32nfree(&kp->d1);
00186 mp32nfree(&kp->d2);
00187 mp32nfree(&kp->c);
00188
00189 return 0;
00190
00191 }
00192
00193 int rsakpCopy(rsakp* dst, const rsakp* src)
00194 {
00195 mp32bcopy(&dst->n, &src->n);
00196 mp32ncopy(&dst->e, &src->e);
00197 mp32ncopy(&dst->d, &src->d);
00198 mp32bcopy(&dst->p, &src->p);
00199 mp32bcopy(&dst->q, &src->q);
00200 mp32ncopy(&dst->d1, &src->d1);
00201 mp32ncopy(&dst->d2, &src->d2);
00202 mp32ncopy(&dst->c, &src->c);
00203
00204 return 0;
00205 }