/*
* session_key - generate session key
*
* This routine generates a session key from the source address,
* destination address, key ID and private value. The value of the
* session key is the MD5 hash of these values, while the next key ID is
* the first four octets of the hash.
*
* Returns the next key ID or 0 if there is no destination address.
*/
keyid_t
session_key(
sockaddr_u *srcadr, /* source address */
sockaddr_u *dstadr, /* destination address */
keyid_t keyno, /* key ID */
keyid_t private, /* private value */
u_long lifetime /* key lifetime */
)
{
EVP_MD_CTX ctx; /* message digest context */
u_char dgst[EVP_MAX_MD_SIZE]; /* message digest */
keyid_t keyid; /* key identifer */
u_int32 header[]; /* data in network byte order */
u_int hdlen, len; if (!dstadr)
return ; /*
* Generate the session key and key ID. If the lifetime is
* greater than zero, install the key and call it trusted.
*/
hdlen = ;
switch(AF(srcadr)) {
case AF_INET:
header[] = NSRCADR(srcadr);
header[] = NSRCADR(dstadr);
header[] = htonl(keyno);
header[] = htonl(private);
hdlen = * sizeof(u_int32);
break; case AF_INET6:
memcpy(&header[], PSOCK_ADDR6(srcadr),
sizeof(struct in6_addr));
memcpy(&header[], PSOCK_ADDR6(dstadr),
sizeof(struct in6_addr));
header[] = htonl(keyno);
header[] = htonl(private);
hdlen = * sizeof(u_int32);
break;
}
EVP_DigestInit(&ctx, EVP_get_digestbynid(crypto_nid));
EVP_DigestUpdate(&ctx, (u_char *)header, hdlen);
EVP_DigestFinal(&ctx, dgst, &len);
memcpy(&keyid, dgst, );
keyid = ntohl(keyid);
if (lifetime != ) {
MD5auth_setkey(keyno, crypto_nid, dgst, len);
authtrust(keyno, lifetime);
}
DPRINTF(, ("session_key: %s > %s %08x %08x hash %08x life %lu\n",
stoa(srcadr), stoa(dstadr), keyno,
private, keyid, lifetime));
#ifdef DEBUG
if (debug)
printf("session_key:MD5 DIGEST ==== %08x\n",dgst);
#endif return (keyid);
}

以上例程是根据the source address, * destination address, key ID and private value这四者做哈希,下一个密钥ID就是这个哈希值的前四个字节。

同时以上代码展示了,MD5的算法流程,先定义EVP_MD_CTX  ctx,然后定义哈希值的存放地址char * dgst。


    EVP_DigestInit(&ctx, EVP_get_digestbynid(crypto_nid));
EVP_DigestUpdate(&ctx, (u_char *)header, hdlen);
EVP_DigestFinal(&ctx, dgst, &len);

经过以上步骤,再将结果写入dgst中。

如果密钥的生存时间不为0,那么就调用MD5auth_setkey来验证密钥是否是可信任的。

/*
* authistrusted - determine whether a key is trusted
*/
int
authistrusted(
keyid_t keyno
)
{
struct savekey *sk; if (keyno == cache_keyid)
return ((cache_flags & KEY_TRUSTED) != ); authkeyuncached++;
sk = key_hash[KEYHASH(keyno)];
while (sk != ) {
if (keyno == sk->keyid)
break;
sk = sk->next;
}
if (sk == ) {
authkeynotfound++;
#ifdef DEBUG
if (debug)
printf("authistrusted authkeynotfound++\n");
#endif return (); } else if (!(sk->flags & KEY_TRUSTED)) {
#ifdef DEBUG
if (debug)
printf("authistrusted authkeynotfound++\n");
#endif authkeynotfound++;
return ();
}
return ();
}

如果密钥ID已经被cache,那么密钥就是可信的。否则就根据key_no做哈希找到sk,查看sk的KEY_TRUSTED有没有置位,如果置位说明密钥可信。整个authistrusted返回1。
整个函数的传入参数是一个32位的整形,KEYHASH这个宏取出其中的前6位,然后在key_hash这个数组中找到对应的savekey。

ntp源码解读(一)的更多相关文章

  1. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. SDWebImage源码解读 之 UIImage+GIF

    第二篇 前言 本篇是和GIF相关的一个UIImage的分类.主要提供了三个方法: + (UIImage *)sd_animatedGIFNamed:(NSString *)name ----- 根据名 ...

  4. SDWebImage源码解读 之 SDWebImageCompat

    第三篇 前言 本篇主要解读SDWebImage的配置文件.正如compat的定义,该配置文件主要是兼容Apple的其他设备.也许我们真实的开发平台只有一个,但考虑各个平台的兼容性,对于框架有着很重要的 ...

  5. SDWebImage源码解读_之SDWebImageDecoder

    第四篇 前言 首先,我们要弄明白一个问题? 为什么要对UIImage进行解码呢?难道不能直接使用吗? 其实不解码也是可以使用的,假如说我们通过imageNamed:来加载image,系统默认会在主线程 ...

  6. SDWebImage源码解读之SDWebImageCache(上)

    第五篇 前言 本篇主要讲解图片缓存类的知识,虽然只涉及了图片方面的缓存的设计,但思想同样适用于别的方面的设计.在架构上来说,缓存算是存储设计的一部分.我们把各种不同的存储内容按照功能进行切割后,图片缓 ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  9. AFNetworking 3.0 源码解读 总结(干货)(上)

    养成记笔记的习惯,对于一个软件工程师来说,我觉得很重要.记得在知乎上看到过一个问题,说是人类最大的缺点是什么?我个人觉得记忆算是一个缺点.它就像时间一样,会自己消散. 前言 终于写完了 AFNetwo ...

随机推荐

  1. deb

    1.APT方式 (1)普通安装:apt-get install softname1 softname2 …; (2)修复安装:apt-get -f install softname1 softname ...

  2. [转]最常见的20个jQuery面试问题及答案

    毫无疑问,jQuery给了JavaScript急需的提振,这是一门如此有用,但同时总是常常被低估的语言. 在 jQuery 粉墨登场之前,我们曾经会写出冗长的JavaScript代码,不仅仅为更大型的 ...

  3. eclipse设置java虚拟机内存大小

    设置java虚拟机大小可以让eclipse启动运行更快...... 在eclipse中点击window--preferences--java--Installed JREs. 然后看右边的框,鼠标点击 ...

  4. shell脚本调试方法

    我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用 Shell 调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工 ...

  5. HDU 2722 Here We Go(relians) Again (spfa)

    Here We Go(relians) Again Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/ ...

  6. JQuery简介及HelloWorld

    一.JQuery是什么: -JQuery是一个JavaScript框架. 二.JQuery的优点: –轻量级 –强大的选择器 –出色的 DOM 操作的封装 –可靠的事件处理机制 –完善的 Ajax – ...

  7. Java Web开发: Tomcat中部署项目的三种方法

    web开发,在tomcat中部署项目的方法: 可以参考http://m.blog.csdn.net/blog/u012516903/15741727 定义$CATALINA_HOME指的是Tomcat ...

  8. position:fixed 居中问题

    设置Css属性position:fixed后如何使这个盒子居中呢?其实也很简单: 就是需要设置给这个div盒子设置属性: left:0; right:0; margin:0 auto; ******* ...

  9. IIS6 伪静态

    1. 设置IIS--主目录--脚本映射那一个属性 2.必须还要上传自己的urlrewriter组件,并在config里做相应的设置 二者缺一不可

  10. python 文件夹操作

    常用的一些 import os for d, cd, fl in os.wald('.'): for f in fl: sufix = os.path.splitext(f)[1][1:] if su ...