...

Source file src/github.com/ProtonMail/go-crypto/brainpool/brainpool.go

Documentation: github.com/ProtonMail/go-crypto/brainpool

     1  // Package brainpool implements Brainpool elliptic curves.
     2  // Implementation of rcurves is from github.com/ebfe/brainpool
     3  // Note that these curves are implemented with naive, non-constant time operations
     4  // and are likely not suitable for environments where timing attacks are a concern.
     5  package brainpool
     6  
     7  import (
     8  	"crypto/elliptic"
     9  	"math/big"
    10  	"sync"
    11  )
    12  
    13  var (
    14  	once                   sync.Once
    15  	p256t1, p384t1, p512t1 *elliptic.CurveParams
    16  	p256r1, p384r1, p512r1 *rcurve
    17  )
    18  
    19  func initAll() {
    20  	initP256t1()
    21  	initP384t1()
    22  	initP512t1()
    23  	initP256r1()
    24  	initP384r1()
    25  	initP512r1()
    26  }
    27  
    28  func initP256t1() {
    29  	p256t1 = &elliptic.CurveParams{Name: "brainpoolP256t1"}
    30  	p256t1.P, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377", 16)
    31  	p256t1.N, _ = new(big.Int).SetString("A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7", 16)
    32  	p256t1.B, _ = new(big.Int).SetString("662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04", 16)
    33  	p256t1.Gx, _ = new(big.Int).SetString("A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4", 16)
    34  	p256t1.Gy, _ = new(big.Int).SetString("2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE", 16)
    35  	p256t1.BitSize = 256
    36  }
    37  
    38  func initP256r1() {
    39  	twisted := p256t1
    40  	params := &elliptic.CurveParams{
    41  		Name:    "brainpoolP256r1",
    42  		P:       twisted.P,
    43  		N:       twisted.N,
    44  		BitSize: twisted.BitSize,
    45  	}
    46  	params.Gx, _ = new(big.Int).SetString("8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262", 16)
    47  	params.Gy, _ = new(big.Int).SetString("547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997", 16)
    48  	z, _ := new(big.Int).SetString("3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0", 16)
    49  	p256r1 = newrcurve(twisted, params, z)
    50  }
    51  
    52  func initP384t1() {
    53  	p384t1 = &elliptic.CurveParams{Name: "brainpoolP384t1"}
    54  	p384t1.P, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A71874700133107EC53", 16)
    55  	p384t1.N, _ = new(big.Int).SetString("8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC3103B883202E9046565", 16)
    56  	p384t1.B, _ = new(big.Int).SetString("7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B88805CED70355A33B471EE", 16)
    57  	p384t1.Gx, _ = new(big.Int).SetString("18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946A5F54D8D0AA2F418808CC", 16)
    58  	p384t1.Gy, _ = new(big.Int).SetString("25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC2B2912675BF5B9E582928", 16)
    59  	p384t1.BitSize = 384
    60  }
    61  
    62  func initP384r1() {
    63  	twisted := p384t1
    64  	params := &elliptic.CurveParams{
    65  		Name:    "brainpoolP384r1",
    66  		P:       twisted.P,
    67  		N:       twisted.N,
    68  		BitSize: twisted.BitSize,
    69  	}
    70  	params.Gx, _ = new(big.Int).SetString("1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D646AAEF87B2E247D4AF1E", 16)
    71  	params.Gy, _ = new(big.Int).SetString("8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E4646217791811142820341263C5315", 16)
    72  	z, _ := new(big.Int).SetString("41DFE8DD399331F7166A66076734A89CD0D2BCDB7D068E44E1F378F41ECBAE97D2D63DBC87BCCDDCCC5DA39E8589291C", 16)
    73  	p384r1 = newrcurve(twisted, params, z)
    74  }
    75  
    76  func initP512t1() {
    77  	p512t1 = &elliptic.CurveParams{Name: "brainpoolP512t1"}
    78  	p512t1.P, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3", 16)
    79  	p512t1.N, _ = new(big.Int).SetString("AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069", 16)
    80  	p512t1.B, _ = new(big.Int).SetString("7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E", 16)
    81  	p512t1.Gx, _ = new(big.Int).SetString("640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA", 16)
    82  	p512t1.Gy, _ = new(big.Int).SetString("5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332", 16)
    83  	p512t1.BitSize = 512
    84  }
    85  
    86  func initP512r1() {
    87  	twisted := p512t1
    88  	params := &elliptic.CurveParams{
    89  		Name:    "brainpoolP512r1",
    90  		P:       twisted.P,
    91  		N:       twisted.N,
    92  		BitSize: twisted.BitSize,
    93  	}
    94  	params.Gx, _ = new(big.Int).SetString("81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822", 16)
    95  	params.Gy, _ = new(big.Int).SetString("7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892", 16)
    96  	z, _ := new(big.Int).SetString("12EE58E6764838B69782136F0F2D3BA06E27695716054092E60A80BEDB212B64E585D90BCE13761F85C3F1D2A64E3BE8FEA2220F01EBA5EEB0F35DBD29D922AB", 16)
    97  	p512r1 = newrcurve(twisted, params, z)
    98  }
    99  
   100  // P256t1 returns a Curve which implements Brainpool P256t1 (see RFC 5639, section 3.4)
   101  func P256t1() elliptic.Curve {
   102  	once.Do(initAll)
   103  	return p256t1
   104  }
   105  
   106  // P256r1 returns a Curve which implements Brainpool P256r1 (see RFC 5639, section 3.4)
   107  func P256r1() elliptic.Curve {
   108  	once.Do(initAll)
   109  	return p256r1
   110  }
   111  
   112  // P384t1 returns a Curve which implements Brainpool P384t1 (see RFC 5639, section 3.6)
   113  func P384t1() elliptic.Curve {
   114  	once.Do(initAll)
   115  	return p384t1
   116  }
   117  
   118  // P384r1 returns a Curve which implements Brainpool P384r1 (see RFC 5639, section 3.6)
   119  func P384r1() elliptic.Curve {
   120  	once.Do(initAll)
   121  	return p384r1
   122  }
   123  
   124  // P512t1 returns a Curve which implements Brainpool P512t1 (see RFC 5639, section 3.7)
   125  func P512t1() elliptic.Curve {
   126  	once.Do(initAll)
   127  	return p512t1
   128  }
   129  
   130  // P512r1 returns a Curve which implements Brainpool P512r1 (see RFC 5639, section 3.7)
   131  func P512r1() elliptic.Curve {
   132  	once.Do(initAll)
   133  	return p512r1
   134  }
   135  

View as plain text