]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/rsa: flip the CRT code over so that it matches PKCS#1
authorAdam Langley <agl@golang.org>
Wed, 6 Apr 2011 14:22:04 +0000 (10:22 -0400)
committerAdam Langley <agl@golang.org>
Wed, 6 Apr 2011 14:22:04 +0000 (10:22 -0400)
The CRT is symmetrical in the case of two variables and I picked a
different form from PKCS#1.

R=golang-dev, rsc1
CC=golang-dev
https://golang.org/cl/4381041

src/pkg/crypto/rsa/rsa.go
src/pkg/crypto/rsa/rsa_test.go

index a3a387110f67f7c27f310dc681b6aead89813d66..57ef7be62610707698a704608c8c43659668b168 100644 (file)
@@ -96,7 +96,7 @@ type PrivateKey struct {
 
        rwMutex sync.RWMutex // protects the following
        dP, dQ  *big.Int     // D mod (P-1) (or mod Q-1) 
-       pInv    *big.Int     // p^-1 mod q
+       qInv    *big.Int     // q^-1 mod p
 }
 
 // Validate performs basic sanity checks on the key.
@@ -335,7 +335,7 @@ func (priv *PrivateKey) precompute() {
        priv.dQ = new(big.Int).Sub(priv.Q, bigOne)
        priv.dQ.Mod(priv.D, priv.dQ)
 
-       priv.pInv = new(big.Int).ModInverse(priv.P, priv.Q)
+       priv.qInv = new(big.Int).ModInverse(priv.Q, priv.P)
 }
 
 // decrypt performs an RSA decryption, resulting in a plaintext integer. If a
@@ -394,13 +394,13 @@ func decrypt(rand io.Reader, priv *PrivateKey, c *big.Int) (m *big.Int, err os.E
                // We have the precalculated values needed for the CRT.
                m = new(big.Int).Exp(c, priv.dP, priv.P)
                m2 := new(big.Int).Exp(c, priv.dQ, priv.Q)
-               m2.Sub(m2, m)
-               if m2.Sign() < 0 {
-                       m2.Add(m2, priv.Q)
+               m.Sub(m, m2)
+               if m.Sign() < 0 {
+                       m.Add(m, priv.P)
                }
-               m2.Mul(m2, priv.pInv)
-               m2.Mod(m2, priv.Q)
-               m2.Mul(m2, priv.P)
+               m.Mul(m, priv.qInv)
+               m.Mod(m, priv.P)
+               m.Mul(m, priv.Q)
                m.Add(m, m2)
        }
 
index df261bbbbfab3ca59bda54a38d1062d794c1704d..87fe6db9a5f42a131af453dafaddc3c17d77e882 100644 (file)
@@ -54,13 +54,11 @@ func BenchmarkRSA2048Decrypt(b *testing.B) {
                        N: fromBase10("14314132931241006650998084889274020608918049032671858325988396851334124245188214251956198731333464217832226406088020736932173064754214329009979944037640912127943488972644697423190955557435910767690712778463524983667852819010259499695177313115447116110358524558307947613422897787329221478860907963827160223559690523660574329011927531289655711860504630573766609239332569210831325633840174683944553667352219670930408593321661375473885147973879086994006440025257225431977751512374815915392249179976902953721486040787792801849818254465486633791826766873076617116727073077821584676715609985777563958286637185868165868520557"),
                        E: 3,
                },
-               D:    fromBase10("9542755287494004433998723259516013739278699355114572217325597900889416163458809501304132487555642811888150937392013824621448709836142886006653296025093941418628992648429798282127303704957273845127141852309016655778568546006839666463451542076964744073572349705538631742281931858219480985907271975884773482372966847639853897890615456605598071088189838676728836833012254065983259638538107719766738032720239892094196108713378822882383694456030043492571063441943847195939549773271694647657549658603365629458610273821292232646334717612674519997533901052790334279661754176490593041941863932308687197618671528035670452762731"),
-               P:    fromBase10("130903255182996722426771613606077755295583329135067340152947172868415809027537376306193179624298874215608270802054347609836776473930072411958753044562214537013874103802006369634761074377213995983876788718033850153719421695468704276694983032644416930879093914927146648402139231293035971427838068945045019075433"),
-               Q:    fromBase10("109348945610485453577574767652527472924289229538286649661240938988020367005475727988253438647560958573506159449538793540472829815903949343191091817779240101054552748665267574271163617694640513549693841337820602726596756351006149518830932261246698766355347898158548465400674856021497190430791824869615170301029"),
-               dP:   fromBase10("87268836788664481617847742404051836863722219423378226768631448578943872685024917537462119749532582810405513868036231739891184315953381607972502029708143024675916069201337579756507382918142663989251192478689233435812947796979136184463322021762944620586062609951431098934759487528690647618558712630030012716955"),
-               dQ:   fromBase10("72899297073656969051716511768351648616192819692191099774160625992013578003650485325502292431707305715670772966359195693648553210602632895460727878519493400703035165776845049514109078463093675699795894225213735151064504234004099679220621507497799177570231932105698976933783237347664793620527883246410113534019"),
-               pInv: fromBase10("74869409553139788560900845468611147033712996668881056834763135832685363742570238895177002569942885113085732953539155658733820506625547963252830054212438299203610450637505048191657603373418647673681301519272938658040214027296599301464801590350649336869828810772124696732917293401353635425510209977859621865087"),
+               D: fromBase10("9542755287494004433998723259516013739278699355114572217325597900889416163458809501304132487555642811888150937392013824621448709836142886006653296025093941418628992648429798282127303704957273845127141852309016655778568546006839666463451542076964744073572349705538631742281931858219480985907271975884773482372966847639853897890615456605598071088189838676728836833012254065983259638538107719766738032720239892094196108713378822882383694456030043492571063441943847195939549773271694647657549658603365629458610273821292232646334717612674519997533901052790334279661754176490593041941863932308687197618671528035670452762731"),
+               P: fromBase10("130903255182996722426771613606077755295583329135067340152947172868415809027537376306193179624298874215608270802054347609836776473930072411958753044562214537013874103802006369634761074377213995983876788718033850153719421695468704276694983032644416930879093914927146648402139231293035971427838068945045019075433"),
+               Q: fromBase10("109348945610485453577574767652527472924289229538286649661240938988020367005475727988253438647560958573506159449538793540472829815903949343191091817779240101054552748665267574271163617694640513549693841337820602726596756351006149518830932261246698766355347898158548465400674856021497190430791824869615170301029"),
        }
+       priv.precompute()
 
        c := fromBase10("1000")