| 
									
										
										
										
											2015-03-16 11:27:38 +01:00
										 |  |  | package common | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | import "math/big" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-22 13:46:38 +01:00
										 |  |  | // Common big integers often used | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	Big1     = big.NewInt(1) | 
					
						
							|  |  |  | 	Big2     = big.NewInt(2) | 
					
						
							|  |  |  | 	Big3     = big.NewInt(3) | 
					
						
							|  |  |  | 	Big0     = big.NewInt(0) | 
					
						
							|  |  |  | 	BigTrue  = Big1 | 
					
						
							|  |  |  | 	BigFalse = Big0 | 
					
						
							|  |  |  | 	Big32    = big.NewInt(32) | 
					
						
							|  |  |  | 	Big256   = big.NewInt(0xff) | 
					
						
							|  |  |  | 	Big257   = big.NewInt(257) | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Big pow | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Returns the power of two big integers | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | func BigPow(a, b int) *big.Int { | 
					
						
							|  |  |  | 	c := new(big.Int) | 
					
						
							|  |  |  | 	c.Exp(big.NewInt(int64(a)), big.NewInt(int64(b)), big.NewInt(0)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Big | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Shortcut for new(big.Int).SetString(..., 0) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | func Big(num string) *big.Int { | 
					
						
							|  |  |  | 	n := new(big.Int) | 
					
						
							|  |  |  | 	n.SetString(num, 0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return n | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // BigD | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Shortcut for new(big.Int).SetBytes(...) | 
					
						
							| 
									
										
										
										
											2015-03-05 09:14:58 +01:00
										 |  |  | func Bytes2Big(data []byte) *big.Int { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	n := new(big.Int) | 
					
						
							|  |  |  | 	n.SetBytes(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return n | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-03-05 09:14:58 +01:00
										 |  |  | func BigD(data []byte) *big.Int { return Bytes2Big(data) } | 
					
						
							| 
									
										
										
										
											2014-02-19 11:35:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-05 17:21:16 +01:00
										 |  |  | func String2Big(num string) *big.Int { | 
					
						
							|  |  |  | 	n := new(big.Int) | 
					
						
							|  |  |  | 	n.SetString(num, 0) | 
					
						
							|  |  |  | 	return n | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 02:14:55 +01:00
										 |  |  | func BitTest(num *big.Int, i int) bool { | 
					
						
							|  |  |  | 	return num.Bit(i) > 0 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-08 16:11:36 +02:00
										 |  |  | // To256 | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // "cast" the big int to a 256 big int (i.e., limit to) | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | var tt256 = new(big.Int).Lsh(big.NewInt(1), 256) | 
					
						
							|  |  |  | var tt256m1 = new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(1)) | 
					
						
							|  |  |  | var tt255 = new(big.Int).Lsh(big.NewInt(1), 255) | 
					
						
							| 
									
										
										
										
											2014-10-08 16:11:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | func U256(x *big.Int) *big.Int { | 
					
						
							|  |  |  | 	//if x.Cmp(Big0) < 0 { | 
					
						
							|  |  |  | 	//		return new(big.Int).Add(tt256, x) | 
					
						
							|  |  |  | 	//	} | 
					
						
							| 
									
										
										
										
											2014-10-08 16:11:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | 	x.And(x, tt256m1) | 
					
						
							| 
									
										
										
										
											2014-10-10 17:00:06 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return x | 
					
						
							| 
									
										
										
										
											2014-10-08 16:11:36 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-15 17:12:26 +02:00
										 |  |  | func S256(x *big.Int) *big.Int { | 
					
						
							|  |  |  | 	if x.Cmp(tt255) < 0 { | 
					
						
							|  |  |  | 		return x | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		// We don't want to modify x, ever | 
					
						
							|  |  |  | 		return new(big.Int).Sub(x, tt256) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-01 22:05:38 +01:00
										 |  |  | func FirstBitSet(v *big.Int) int { | 
					
						
							| 
									
										
										
										
											2014-12-01 20:18:09 +01:00
										 |  |  | 	for i := 0; i < v.BitLen(); i++ { | 
					
						
							|  |  |  | 		if v.Bit(i) > 0 { | 
					
						
							| 
									
										
										
										
											2014-12-01 22:05:38 +01:00
										 |  |  | 			return i | 
					
						
							| 
									
										
										
										
											2014-12-01 20:18:09 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-01 22:05:38 +01:00
										 |  |  | 	return v.BitLen() | 
					
						
							| 
									
										
										
										
											2014-12-01 20:18:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Big to bytes | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Returns the bytes of a big integer with the size specified by **base** | 
					
						
							|  |  |  | // Attempts to pad the byte array with zeros. | 
					
						
							| 
									
										
										
										
											2014-02-19 11:35:17 +01:00
										 |  |  | func BigToBytes(num *big.Int, base int) []byte { | 
					
						
							|  |  |  | 	ret := make([]byte, base/8) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 16:57:40 +02:00
										 |  |  | 	if len(num.Bytes()) > base/8 { | 
					
						
							|  |  |  | 		return num.Bytes() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:35:17 +01:00
										 |  |  | 	return append(ret[:len(ret)-len(num.Bytes())], num.Bytes()...) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-28 12:19:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Big copy | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Creates a copy of the given big integer | 
					
						
							|  |  |  | func BigCopy(src *big.Int) *big.Int { | 
					
						
							|  |  |  | 	return new(big.Int).Set(src) | 
					
						
							| 
									
										
										
										
											2014-02-28 12:19:21 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-04-27 16:50:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Big max | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Returns the maximum size big integer | 
					
						
							| 
									
										
										
										
											2014-04-27 16:50:44 +02:00
										 |  |  | func BigMax(x, y *big.Int) *big.Int { | 
					
						
							| 
									
										
										
										
											2015-03-19 22:45:03 +01:00
										 |  |  | 	if x.Cmp(y) < 0 { | 
					
						
							| 
									
										
										
										
											2014-06-10 17:15:18 +02:00
										 |  |  | 		return y | 
					
						
							| 
									
										
										
										
											2014-04-27 16:50:44 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-10 17:15:18 +02:00
										 |  |  | 	return x | 
					
						
							| 
									
										
										
										
											2014-04-27 16:50:44 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-21 20:38:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Big min | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // Returns the minimum size big integer | 
					
						
							|  |  |  | func BigMin(x, y *big.Int) *big.Int { | 
					
						
							| 
									
										
										
										
											2015-03-19 22:45:03 +01:00
										 |  |  | 	if x.Cmp(y) > 0 { | 
					
						
							| 
									
										
										
										
											2014-07-21 20:38:43 +02:00
										 |  |  | 		return y | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return x | 
					
						
							|  |  |  | } |