...
1 package tracing
2
3 import (
4 "context"
5
6 opentracing "github.com/opentracing/opentracing-go"
7 "github.com/opentracing/opentracing-go/ext"
8 "github.com/pkg/errors"
9 "golang.org/x/crypto/bcrypt"
10 )
11
12 const (
13
14 BCryptHashOpName = "bcrypt.hash"
15
16
17 BCryptCompareOpName = "bcrypt.compare"
18
19
20 BCryptWorkFactorTagName = "bcrypt.workfactor"
21 )
22
23
24 type TracedBCrypt struct {
25 WorkFactor int
26 }
27
28
29 func (b *TracedBCrypt) Hash(ctx context.Context, data []byte) ([]byte, error) {
30 span, _ := opentracing.StartSpanFromContext(ctx, BCryptHashOpName)
31 defer span.Finish()
32 span.SetTag(BCryptWorkFactorTagName, b.WorkFactor)
33
34 s, err := bcrypt.GenerateFromPassword(data, b.WorkFactor)
35 if err != nil {
36 ext.Error.Set(span, true)
37 return nil, errors.WithStack(err)
38 }
39 return s, nil
40 }
41
42
43 func (b *TracedBCrypt) Compare(ctx context.Context, hash, data []byte) error {
44 span, _ := opentracing.StartSpanFromContext(ctx, BCryptCompareOpName)
45 defer span.Finish()
46 span.SetTag(BCryptWorkFactorTagName, b.WorkFactor)
47
48 if err := bcrypt.CompareHashAndPassword(hash, data); err != nil {
49 ext.Error.Set(span, true)
50 return errors.WithStack(err)
51 }
52 return nil
53 }
54
View as plain text