github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/cryptkit/containers.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package cryptkit
     7  
     8  import (
     9  	"fmt"
    10  	"io"
    11  
    12  	"github.com/insolar/vanilla/longbits"
    13  )
    14  
    15  type hFoldReader = longbits.FoldableReader
    16  
    17  func NewDigest(data longbits.FoldableReader, method DigestMethod) Digest {
    18  	return Digest{hFoldReader: data, digestMethod: method}
    19  }
    20  
    21  func NewZeroSizeDigest(method DigestMethod) Digest {
    22  	return Digest{hFoldReader: longbits.EmptyByteString, digestMethod: method}
    23  }
    24  
    25  var _ DigestHolder = Digest{}
    26  
    27  type Digest struct {
    28  	hFoldReader
    29  	digestMethod DigestMethod
    30  }
    31  
    32  func (d Digest) IsZero() bool {
    33  	return d.hFoldReader == nil
    34  }
    35  
    36  // TODO move users to IsZero and use IsEmpty for zero length, not zero state
    37  func (d Digest) IsEmpty() bool {
    38  	return d.hFoldReader == nil
    39  }
    40  
    41  func (d Digest) FixedByteSize() int {
    42  	if d.hFoldReader != nil {
    43  		return d.hFoldReader.FixedByteSize()
    44  	}
    45  	return 0
    46  }
    47  
    48  func (d Digest) Equals(o DigestHolder) bool {
    49  	return longbits.Equal(d, o)
    50  }
    51  
    52  func (d Digest) AsDigestHolder() DigestHolder {
    53  	if d.IsEmpty() {
    54  		return nil
    55  	}
    56  	return d
    57  }
    58  
    59  func (d Digest) GetDigestMethod() DigestMethod {
    60  	return d.digestMethod
    61  }
    62  
    63  func (d Digest) SignWith(signer DigestSigner) SignedDigestHolder {
    64  	sd := NewSignedDigest(d, signer.SignDigest(d))
    65  	return sd
    66  }
    67  
    68  func (d Digest) String() string {
    69  	return fmt.Sprintf("%v", d.hFoldReader)
    70  }
    71  
    72  /*****************************************************************/
    73  
    74  func NewSignature(data longbits.FoldableReader, method SignatureMethod) Signature {
    75  	return Signature{hFoldReader: data, signatureMethod: method}
    76  }
    77  
    78  type Signature struct {
    79  	hFoldReader
    80  	signatureMethod SignatureMethod
    81  }
    82  
    83  func (p Signature) IsEmpty() bool {
    84  	return p.hFoldReader == nil
    85  }
    86  
    87  func (p Signature) FixedByteSize() int {
    88  	if p.hFoldReader != nil {
    89  		return p.hFoldReader.FixedByteSize()
    90  	}
    91  	return 0
    92  }
    93  
    94  func (p Signature) CopyOfSignature() Signature {
    95  	return Signature{hFoldReader: longbits.CopyFixed(p.hFoldReader), signatureMethod: p.signatureMethod}
    96  }
    97  
    98  func (p Signature) Equals(o SignatureHolder) bool {
    99  	return longbits.Equal(p, o)
   100  }
   101  
   102  func (p Signature) GetSignatureMethod() SignatureMethod {
   103  	return p.signatureMethod
   104  }
   105  
   106  func (p Signature) AsSignatureHolder() SignatureHolder {
   107  	if p.IsEmpty() {
   108  		return nil
   109  	}
   110  	return p
   111  }
   112  
   113  func (p Signature) String() string {
   114  	return fmt.Sprintf("§%v", p.hFoldReader)
   115  }
   116  
   117  /*****************************************************************/
   118  
   119  func NewSignedDigest(digest Digest, signature Signature) SignedDigest {
   120  	return SignedDigest{digest: digest, signature: signature}
   121  }
   122  
   123  type SignedDigest struct {
   124  	digest    Digest
   125  	signature Signature
   126  }
   127  
   128  func (r SignedDigest) IsEmpty() bool {
   129  	return r.digest.IsEmpty() && r.signature.IsEmpty()
   130  }
   131  
   132  func (r SignedDigest) Equals(o SignedDigestHolder) bool {
   133  	return longbits.Equal(r.digest, o.GetDigestHolder()) &&
   134  		longbits.Equal(r.signature, o.GetSignatureHolder())
   135  }
   136  
   137  func (r SignedDigest) GetDigest() Digest {
   138  	return r.digest
   139  }
   140  
   141  func (r SignedDigest) GetSignature() Signature {
   142  	return r.signature
   143  }
   144  
   145  func (r SignedDigest) GetDigestHolder() DigestHolder {
   146  	return r.digest
   147  }
   148  
   149  func (r SignedDigest) GetSignatureHolder() SignatureHolder {
   150  	return r.signature
   151  }
   152  
   153  func (r SignedDigest) GetSignatureMethod() SignatureMethod {
   154  	return r.signature.GetSignatureMethod()
   155  }
   156  
   157  func (r SignedDigest) IsVerifiableBy(v SignatureVerifier) bool {
   158  	return v.IsSigningMethodSupported(r.signature.GetSignatureMethod().SigningMethod())
   159  }
   160  
   161  func (r SignedDigest) VerifyWith(v SignatureVerifier) bool {
   162  	return v.IsValidDigestSignature(r.digest, r.signature)
   163  }
   164  
   165  func (r SignedDigest) String() string {
   166  	return fmt.Sprintf("%v%v", r.digest, r.signature)
   167  }
   168  
   169  func (r SignedDigest) AsSignedDigestHolder() SignedDigestHolder {
   170  	if r.IsEmpty() {
   171  		return nil
   172  	}
   173  	return r
   174  }
   175  
   176  /*****************************************************************/
   177  
   178  func NewSignedData(data longbits.FixedReader, digest Digest, signature Signature) SignedData {
   179  	return SignedData{SignedDigest{digest, signature}, data}
   180  }
   181  
   182  func SignDataByDataSigner(data longbits.FixedReader, signer DataSigner) SignedData {
   183  	hasher := signer.NewHasher()
   184  	if _, err := data.WriteTo(hasher); err != nil {
   185  		panic(err)
   186  	}
   187  	digest := hasher.SumToDigest()
   188  	signature := signer.SignDigest(digest)
   189  	return NewSignedData(data, digest, signature)
   190  }
   191  
   192  type hWriterTo = longbits.FixedReader
   193  type hSignedDigest = SignedDigest
   194  
   195  var _ io.WriterTo = SignedData{}
   196  
   197  type SignedData struct {
   198  	hSignedDigest
   199  	hWriterTo
   200  }
   201  
   202  func (r SignedData) IsEmpty() bool {
   203  	return r.hWriterTo == nil && r.hSignedDigest.IsEmpty()
   204  }
   205  
   206  func (r SignedData) FixedByteSize() int {
   207  	if r.hWriterTo != nil {
   208  		return r.hWriterTo.FixedByteSize()
   209  	}
   210  	return 0
   211  }
   212  
   213  func (r SignedData) GetSignedDigest() SignedDigest {
   214  	return r.hSignedDigest
   215  }
   216  
   217  func (r SignedData) String() string {
   218  	return fmt.Sprintf("[bytes=%v]%v", r.hWriterTo, r.hSignedDigest)
   219  }
   220  
   221  /*****************************************************************/
   222  
   223  func NewSigningKey(data longbits.FoldableReader, method SigningMethod, keyType SigningKeyType) SigningKey {
   224  	return SigningKey{
   225  		hFoldReader: data,
   226  		method:      method,
   227  		keyType:     keyType,
   228  	}
   229  }
   230  
   231  var _ SigningKeyHolder = SigningKey{}
   232  
   233  type SigningKey struct {
   234  	hFoldReader
   235  	method SigningMethod
   236  	keyType         SigningKeyType
   237  }
   238  
   239  func (p SigningKey) IsEmpty() bool {
   240  	return p.hFoldReader == nil
   241  }
   242  
   243  func (p SigningKey) GetSigningMethod() SigningMethod {
   244  	return p.method
   245  }
   246  
   247  func (p SigningKey) GetSigningKeyType() SigningKeyType {
   248  	return p.keyType
   249  }
   250  
   251  func (p SigningKey) FixedByteSize() int {
   252  	if p.hFoldReader != nil {
   253  		return p.hFoldReader.FixedByteSize()
   254  	}
   255  	return 0
   256  }
   257  
   258  func (p SigningKey) Equals(o SigningKeyHolder) bool {
   259  	return longbits.Equal(p, o)
   260  }
   261  
   262  func (p SigningKey) String() string {
   263  	return fmt.Sprintf("⚿%v", p.hFoldReader)
   264  }