Module: MixinBot::API::LegacyUser
- Included in:
- MixinBot::API
- Defined in:
- lib/mixin_bot/api/legacy_user.rb
Instance Method Summary collapse
-
#upgrade_legacy_user(keystore) ⇒ Object
Upgrades a legacy RSA keystore user to Ed25519 session keys.
Instance Method Details
#upgrade_legacy_user(keystore) ⇒ Object
Upgrades a legacy RSA keystore user to Ed25519 session keys.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/mixin_bot/api/legacy_user.rb', line 9 def upgrade_legacy_user(keystore) kl = keystore.with_indifferent_access priv = OpenSSL::PKey::RSA.new(kl[:private_key]) token = Base64.decode64(kl[:pin_token]) key_bytes = priv.decrypt( token, rsa_padding_mode: 'oaep', rsa_oaep_md: 'sha256', rsa_mgf1_md: 'sha1', oaep_label: kl[:session_id] ) pin_byte = kl[:pin].to_s.b pin_byte += [Time.now.to_i].pack('Q<') pin_byte += [0].pack('Q<') padding = 16 - (pin_byte.length % 16) pin_byte += ([padding].pack('C') * padding) cipher = OpenSSL::Cipher.new('AES-256-CBC') cipher.encrypt iv = cipher.random_iv cipher.key = key_bytes ciphertext = iv + cipher.update(pin_byte) + cipher.final pub_bytes = priv.public_key.to_der seed = Digest::SHA512.digest(priv.to_der)[0, 32] pub_ed25519 = RbNaCl::Signatures::Ed25519::SigningKey.new(seed).verify_key.to_bytes payload = { session_secret_legacy: Base64.urlsafe_encode64(pub_bytes, padding: false), session_secret: Base64.urlsafe_encode64(pub_ed25519, padding: false), session_id: kl[:session_id], pin: Base64.urlsafe_encode64(ciphertext, padding: false) } result = client.post '/legacy/users', **payload, access_token: '' data = result['data'] || result.data result['data'] = data.merge('session_private_key' => seed.unpack1('H*')) if data.is_a?(Hash) result end |