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 }