github.com/deroproject/derosuite@v2.1.6-1.0.20200307070847-0f2e589c7a2b+incompatible/crypto/ringct/basic.go (about)

     1  // Copyright 2017-2018 DERO Project. All rights reserved.
     2  // Use of this source code in any form is governed by RESEARCH license.
     3  // license can be found in the LICENSE file.
     4  // GPG: 0F39 E425 8C65 3947 702A  8234 08B2 0360 A03A 9DE8
     5  //
     6  //
     7  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
     8  // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     9  // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
    10  // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    11  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    12  // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    13  // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
    14  // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
    15  // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    16  
    17  package ringct
    18  
    19  import "encoding/hex"
    20  import "github.com/deroproject/derosuite/crypto"
    21  
    22  // convert a hex string to a key
    23  // a copy of these functions exists in the crypto package also
    24  func HexToKey(h string) (result crypto.Key) {
    25  	byteSlice, _ := hex.DecodeString(h)
    26  	if len(byteSlice) != 32 {
    27  		panic("Incorrect key size")
    28  	}
    29  	copy(result[:], byteSlice)
    30  	return
    31  }
    32  
    33  func HexToHash(h string) (result crypto.Hash) {
    34  	byteSlice, _ := hex.DecodeString(h)
    35  	if len(byteSlice) != 32 {
    36  		panic("Incorrect key size")
    37  	}
    38  	copy(result[:], byteSlice)
    39  	return
    40  }
    41  
    42  // zero fill the key
    43  func Sc_0(k *crypto.Key) {
    44  	for i := 0; i < 32; i++ {
    45  		k[i] = 0
    46  	}
    47  }
    48  
    49  // RandomPubKey takes a random scalar, interprets it as a point on the curve
    50  // and then multiplies by 8 to make it a point in the Group
    51  //  remember the low order bug and do more auditing of the entire thing
    52  func RandomPubKey() (result *crypto.Key) {
    53  	result = new(crypto.Key)
    54  	p3 := new(crypto.ExtendedGroupElement)
    55  	var p1 crypto.ProjectiveGroupElement
    56  	var p2 crypto.CompletedGroupElement
    57  	h := crypto.RandomScalar()
    58  	p1.FromBytes(h)
    59  	crypto.GeMul8(&p2, &p1)
    60  	p2.ToExtended(p3)
    61  	p3.ToBytes(result)
    62  	return
    63  }