| // Copyright 2012 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package bn256 | |
| import ( | |
| "crypto/rand" | |
| ) | |
| func ExamplePair() { | |
| // This implements the tripartite Diffie-Hellman algorithm from "A One | |
| // Round Protocol for Tripartite Diffie-Hellman", A. Joux. | |
| // http://www.springerlink.com/content/cddc57yyva0hburb/fulltext.pdf | |
| // Each of three parties, a, b and c, generate a private value. | |
| a, _ := rand.Int(rand.Reader, Order) | |
| b, _ := rand.Int(rand.Reader, Order) | |
| c, _ := rand.Int(rand.Reader, Order) | |
| // Then each party calculates g₁ and g₂ times their private value. | |
| pa := new(G1).ScalarBaseMult(a) | |
| qa := new(G2).ScalarBaseMult(a) | |
| pb := new(G1).ScalarBaseMult(b) | |
| qb := new(G2).ScalarBaseMult(b) | |
| pc := new(G1).ScalarBaseMult(c) | |
| qc := new(G2).ScalarBaseMult(c) | |
| // Now each party exchanges its public values with the other two and | |
| // all parties can calculate the shared key. | |
| k1 := Pair(pb, qc) | |
| k1.ScalarMult(k1, a) | |
| k2 := Pair(pc, qa) | |
| k2.ScalarMult(k2, b) | |
| k3 := Pair(pa, qb) | |
| k3.ScalarMult(k3, c) | |
| // k1, k2 and k3 will all be equal. | |
| } |