URI:
       trsafill.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       trsafill.c (1112B)
       ---
            1 #include "os.h"
            2 #include <mp.h>
            3 #include <libsec.h>
            4 
            5 RSApriv*
            6 rsafill(mpint *n, mpint *e, mpint *d, mpint *p, mpint *q)
            7 {
            8         mpint *c2, *kq, *kp, *x;
            9         RSApriv *rsa;
           10 
           11         /* make sure we're not being hoodwinked */
           12         if(!probably_prime(p, 10) || !probably_prime(q, 10)){
           13                 werrstr("rsafill: p or q not prime");
           14                 return nil;
           15         }
           16         x = mpnew(0);
           17         mpmul(p, q, x);
           18         if(mpcmp(n, x) != 0){
           19                 werrstr("rsafill: n != p*q");
           20                 mpfree(x);
           21                 return nil;
           22         }
           23         c2 = mpnew(0);
           24         mpsub(p, mpone, c2);
           25         mpsub(q, mpone, x);
           26         mpmul(c2, x, x);
           27         mpmul(e, d, c2);
           28         mpmod(c2, x, x);
           29         if(mpcmp(x, mpone) != 0){
           30                 werrstr("rsafill: e*d != 1 mod (p-1)*(q-1)");
           31                 mpfree(x);
           32                 mpfree(c2);
           33                 return nil;
           34         }
           35 
           36         /* compute chinese remainder coefficient */
           37         mpinvert(p, q, c2);
           38 
           39         /* for crt a**k mod p == (a**(k mod p-1)) mod p */
           40         kq = mpnew(0);
           41         kp = mpnew(0);
           42         mpsub(p, mpone, x);
           43         mpmod(d, x, kp);
           44         mpsub(q, mpone, x);
           45         mpmod(d, x, kq);
           46 
           47         rsa = rsaprivalloc();
           48         rsa->pub.ek = mpcopy(e);
           49         rsa->pub.n = mpcopy(n);
           50         rsa->dk = mpcopy(d);
           51         rsa->kp = kp;
           52         rsa->kq = kq;
           53         rsa->p = mpcopy(p);
           54         rsa->q = mpcopy(q);
           55         rsa->c2 = c2;
           56 
           57         mpfree(x);
           58 
           59         return rsa;
           60 }