Module: DPAPI

Extended by:
FFI::Library
Included in:
Kitchen::Driver::CredentialsManager
Defined in:
lib/kitchen/driver/dbapi.rb

Overview

Minimal wrapper around Microsoft’s DPAPI

struct & function definitions cribbed from… msdn.microsoft.com/en-us/library/ms995355.aspx

Defined Under Namespace

Classes: DataBlob, DecryptError, EncryptError

Constant Summary collapse

UI_FORBIDDEN =

www.pinvoke.net/default.aspx/Enums/CryptProtectFlags.html dwFlags is a bitvector with the following values…

0x1
LOCAL_MACHINE =
0x4
CRED_SYNC =
0x8
AUDIT =
0x10
NO_RECOVERY =
0x20
VERIFY_PROTECTION =
0x40

Instance Method Summary collapse

Instance Method Details

#decrypt(ciphertext, entropy = nil, flags = []) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/kitchen/driver/dbapi.rb', line 96

def decrypt ciphertext, entropy=nil, flags=[]
  plaintext_blob  = DataBlob.new
  desc = FFI::MemoryPointer.new(:pointer, 256)

  CryptUnprotectData(DataBlob.new(ciphertext),
                     desc,
                     DataBlob.new(entropy),
                     nil,
                     nil,
                     flags.reduce(0, :|),
                     plaintext_blob) or
    raise DecryptError
  
  [plaintext_blob.data,
   desc.read_pointer.nil? ? nil : desc.read_pointer.read_string
  ]
end

#encrypt(plaintext, entropy = nil, flags = [], desc = nil) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/kitchen/driver/dbapi.rb', line 66

def encrypt plaintext, entropy=nil, flags = [], desc=nil
  ciphertext_blob = DataBlob.new

  CryptProtectData(DataBlob.new(plaintext),
                   desc,
                   entropy.nil? ? nil : DataBlob.new(entropy),
                   nil,
                   nil,
                   flags.reduce(0, :|),
                   ciphertext_blob) or
    raise EncryptErorr
  
  ciphertext_blob.data
end