/// <summary> /// Evaluates the function. /// </summary> /// <param name="Argument1">Function argument 1.</param> /// <param name="Argument2">Function argument 2.</param> /// <param name="Variables">Variables collection.</param> /// <returns>Function result.</returns> public override IElement Evaluate(IElement Argument1, IElement Argument2, Variables Variables) { if (!(Argument1.AssociatedObjectValue is byte[] Data)) { throw new ScriptRuntimeException("Binary data expected.", this); } if (!(Argument2.AssociatedObjectValue is byte[] Key)) { throw new ScriptRuntimeException("Binary key expected.", this); } return(new ObjectValue(Hashes.ComputeHMACSHA1Hash(Key, Data))); }
/// <summary> /// Signs the form (if necessary), according to XEP-0348. /// </summary> /// <param name="FormSignatureKey">Form signature key.</param> /// <param name="FormSignatureSecret">Form signature secret.</param> public void Sign(string FormSignatureKey, string FormSignatureSecret) { Field oauth_version = this["oauth_version"]; Field oauth_signature_method = this["oauth_signature_method"]; Field oauth_token = this["oauth_token"]; Field oauth_token_secret = this["oauth_token_secret"]; Field oauth_nonce = this["oauth_nonce"]; Field oauth_timestamp = this["oauth_timestamp"]; Field oauth_consumer_key = this["oauth_consumer_key"]; Field oauth_signature = this["oauth_signature"]; if (oauth_version != null && oauth_signature_method != null && oauth_token != null && oauth_token_secret != null && oauth_nonce != null && oauth_timestamp != null && oauth_consumer_key != null && oauth_signature != null) { SortedDictionary <string, string> Sorted = new SortedDictionary <string, string>(); DateTime Now = DateTime.Now.ToUniversalTime(); TimeSpan Span = Now - OAuthFirstDay; long TotalSeconds = (long)Span.TotalSeconds; string Nonce = Guid.NewGuid().ToString().Replace("-", string.Empty); string TokenSecret = oauth_token_secret.ValueString; oauth_consumer_key.SetValue(FormSignatureKey); oauth_timestamp.SetValue(TotalSeconds.ToString()); oauth_nonce.SetValue(Nonce); oauth_version.SetValue("1.0"); oauth_signature_method.SetValue("HMAC-SHA1"); foreach (Field F in this.fields) { Sorted[F.Var] = F.ValueString; } Sorted.Remove("oauth_token_secret"); Sorted.Remove("oauth_signature"); StringBuilder PStr = new StringBuilder(); bool First = true; foreach (KeyValuePair <string, string> Pair in Sorted) { if (First) { First = false; } else { PStr.Append("&"); } PStr.Append(OAuthEncode(Pair.Key)); PStr.Append("="); PStr.Append(OAuthEncode(Pair.Value)); } StringBuilder BStr = new StringBuilder(); BStr.Append("submit&&"); // No to-field. BStr.Append(OAuthEncode(PStr.ToString())); byte[] Key = Encoding.ASCII.GetBytes(OAuthEncode(FormSignatureSecret) + "&" + OAuthEncode(TokenSecret)); byte[] Hash = Hashes.ComputeHMACSHA1Hash(Key, Encoding.ASCII.GetBytes(BStr.ToString())); oauth_signature.SetValue(OAuthEncode(Convert.ToBase64String(Hash))); } }