11module SSHData
22 module PublicKey
33 class SKED25519 < ED25519
4+ include SecurityKey
45 attr_reader :application
56
67 def initialize ( algo :, pk :, application :)
@@ -23,38 +24,27 @@ def rfc4253
2324 )
2425 end
2526
26- def verify ( signed_data , signature )
27+ def verify ( signed_data , signature , ** opts )
2728 self . class . ed25519_gem_required!
28-
29- read = 0
30- sig_algo , raw_sig , signature_read = Encoding . decode_signature ( signature )
31- read += signature_read
32- sk_flags , sk_flags_read = Encoding . decode_uint8 ( signature , read )
33- read += sk_flags_read
34- counter , counter_read = Encoding . decode_uint32 ( signature , read )
35- read += counter_read
36-
37- if read != signature . bytesize
38- raise DecodeError , "unexpected trailing data"
39- end
29+ opts = DEFAULT_SK_VERIFY_OPTS . merge ( opts )
30+ sig_algo , raw_sig , sk_flags , blob = build_signing_blob ( application , signed_data , signature )
4031
4132 if sig_algo != self . class . algorithm_identifier
4233 raise DecodeError , "bad signature algorithm: #{ sig_algo . inspect } "
4334 end
4435
45- application_hash = OpenSSL ::Digest ::SHA256 . digest ( application )
46- message_hash = OpenSSL ::Digest ::SHA256 . digest ( signed_data )
36+ result = begin
37+ ed25519_key . verify ( raw_sig , blob )
38+ rescue Ed25519 ::VerifyError
39+ false
40+ end
4741
48- blob =
49- application_hash +
50- Encoding . encode_uint8 ( sk_flags ) +
51- Encoding . encode_uint32 ( counter ) +
52- message_hash
53-
54- begin
55- ed25519_key . verify ( raw_sig , blob )
56- rescue Ed25519 ::VerifyError
42+ if opts [ :user_presence_required ] && ( sk_flags & SK_FLAG_USER_PRESENCE != SK_FLAG_USER_PRESENCE )
43+ false
44+ elsif opts [ :user_verification_required ] && ( sk_flags & SK_FLAG_USER_VERIFICATION != SK_FLAG_USER_VERIFICATION )
5745 false
46+ else
47+ result
5848 end
5949 end
6050
0 commit comments